chingu 0.5.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.txt +21 -0
  3. data/LICENSE +504 -0
  4. data/Manifest.txt +72 -0
  5. data/README.rdoc +588 -0
  6. data/Rakefile +19 -0
  7. data/benchmarks/README.txt +1 -0
  8. data/benchmarks/benchmark.rb +6 -0
  9. data/benchmarks/benchmark3.rb +23 -0
  10. data/benchmarks/benchmark4.rb +71 -0
  11. data/benchmarks/benchmark5.rb +91 -0
  12. data/benchmarks/benchmark6.rb +23 -0
  13. data/benchmarks/meta_benchmark.rb +67 -0
  14. data/benchmarks/meta_benchmark2.rb +39 -0
  15. data/chingu.gemspec +34 -0
  16. data/examples/example1.rb +37 -0
  17. data/examples/example10.rb +75 -0
  18. data/examples/example11.rb +51 -0
  19. data/examples/example12.rb +67 -0
  20. data/examples/example2.rb +115 -0
  21. data/examples/example3.rb +40 -0
  22. data/examples/example4.rb +175 -0
  23. data/examples/example5.rb +107 -0
  24. data/examples/example6.rb +57 -0
  25. data/examples/example7.rb +133 -0
  26. data/examples/example8.rb +109 -0
  27. data/examples/example9.rb +106 -0
  28. data/examples/media/Parallax-scroll-example-layer-0.png +0 -0
  29. data/examples/media/Parallax-scroll-example-layer-1.png +0 -0
  30. data/examples/media/Parallax-scroll-example-layer-2.png +0 -0
  31. data/examples/media/Parallax-scroll-example-layer-3.png +0 -0
  32. data/examples/media/background1.png +0 -0
  33. data/examples/media/fire_bullet.png +0 -0
  34. data/examples/media/fireball.png +0 -0
  35. data/examples/media/particle.png +0 -0
  36. data/examples/media/ruby.png +0 -0
  37. data/examples/media/spaceship.png +0 -0
  38. data/examples/media/stickfigure.bmp +0 -0
  39. data/examples/media/stickfigure.png +0 -0
  40. data/examples/media/video_games.png +0 -0
  41. data/lib/chingu.rb +32 -0
  42. data/lib/chingu/actor.rb +17 -0
  43. data/lib/chingu/animation.rb +142 -0
  44. data/lib/chingu/assets.rb +64 -0
  45. data/lib/chingu/basic_game_object.rb +132 -0
  46. data/lib/chingu/core_extensions.rb +53 -0
  47. data/lib/chingu/effects.rb +36 -0
  48. data/lib/chingu/fpscounter.rb +62 -0
  49. data/lib/chingu/game_object.rb +127 -0
  50. data/lib/chingu/game_object_list.rb +91 -0
  51. data/lib/chingu/game_state.rb +137 -0
  52. data/lib/chingu/game_state_manager.rb +284 -0
  53. data/lib/chingu/game_states/debug.rb +65 -0
  54. data/lib/chingu/game_states/fade_to.rb +91 -0
  55. data/lib/chingu/game_states/pause.rb +57 -0
  56. data/lib/chingu/gfx_helpers.rb +89 -0
  57. data/lib/chingu/helpers.rb +166 -0
  58. data/lib/chingu/inflector.rb +34 -0
  59. data/lib/chingu/input.rb +100 -0
  60. data/lib/chingu/named_resource.rb +254 -0
  61. data/lib/chingu/parallax.rb +83 -0
  62. data/lib/chingu/particle.rb +21 -0
  63. data/lib/chingu/rect.rb +612 -0
  64. data/lib/chingu/require_all.rb +133 -0
  65. data/lib/chingu/text.rb +56 -0
  66. data/lib/chingu/traits/collision_detection.rb +172 -0
  67. data/lib/chingu/traits/effect.rb +113 -0
  68. data/lib/chingu/traits/input.rb +38 -0
  69. data/lib/chingu/traits/retrofy.rb +53 -0
  70. data/lib/chingu/traits/rotation_center.rb +84 -0
  71. data/lib/chingu/traits/timer.rb +90 -0
  72. data/lib/chingu/traits/velocity.rb +67 -0
  73. data/lib/chingu/window.rb +170 -0
  74. metadata +162 -0
  75. metadata.gz.sig +1 -0
@@ -0,0 +1,51 @@
1
+ require 'rubygems'
2
+ require File.join(File.dirname($0), "..", "lib", "chingu")
3
+ include Gosu
4
+
5
+ #
6
+ # Parallax-example
7
+ # Images from http://en.wikipedia.org/wiki/Parallax_scrolling
8
+ #
9
+ class Game < Chingu::Window
10
+ def initialize
11
+ super
12
+ self.input = { :holding_left => :scroll_left,
13
+ :holding_right => :scroll_right,
14
+ :holding_up => :scroll_up,
15
+ :holding_down => :scroll_down,
16
+ :escape => :exit }
17
+
18
+ self.caption = "Chingu::Parallax example. Scroll with left/right arrows."
19
+
20
+ @parallax = Chingu::Parallax.create(:x => 0, :y => 0, :center_x => 0, :center_y => 0)
21
+
22
+ #
23
+ # If no :zorder is given to @parallax.add_background it defaults to first added -> lowest zorder
24
+ # Everywhere the :image argument is used, theese 2 values are the Same:
25
+ # 1) Image["foo.png"] 2) "foo.png"
26
+ #
27
+ # TODO: scrolling to left borks outm, fix. + get rid of center_x / center_y args in a clean way.
28
+ @parallax << {:image => "paralaxx2", :damping => 100, :center => 0)
29
+ @parallax << {:image => "parallax-scroll-example-layer-1.png", :damping => 10, :center => 0)
30
+ @parallax << {:image => "paralaxx2.png", :damping => 5, :center => 0)
31
+ end
32
+
33
+ def scroll_left
34
+ @parallax.x -= 2
35
+ end
36
+
37
+ def scroll_right
38
+ @parallax.x += 2
39
+ end
40
+
41
+ def scroll_up
42
+ @parallax.y -= 2
43
+ end
44
+
45
+ def scroll_down
46
+ @parallax.y += 2
47
+ end
48
+
49
+ end
50
+
51
+ Game.new.show
@@ -0,0 +1,67 @@
1
+ require 'rubygems'
2
+ require File.join(File.dirname($0), "..", "lib", "chingu")
3
+ include Gosu
4
+ include Chingu
5
+
6
+ class Game < Chingu::Window
7
+ def initialize
8
+ super(640,400)
9
+ self.input = {:esc => :exit}
10
+ self.caption = "Example of Chingus :timer trait (arrows,space,return sets timers that affects @x,@y & @color)"
11
+
12
+ Cube.create(:x => 200, :y => 200)
13
+ end
14
+ end
15
+
16
+ class Cube < GameObject
17
+ has_trait :timer
18
+
19
+ def initialize(options)
20
+ super
21
+ @white = Color.new(0xFFFFFFFF)
22
+ @red = Color.new(0xFFFF0000)
23
+ @blue = Color.new(0xFF0000FF)
24
+ self.input = { :left => :left, :right => :right, :up => :up, :down => :down,
25
+ :space => :shake1, :return => :shake2 }
26
+ end
27
+
28
+ def left
29
+ during(500) { @x -= 1 }
30
+ end
31
+
32
+ def right
33
+ during(500) { @x += 1 }
34
+ end
35
+
36
+ def up
37
+ @color = @red
38
+ during(500) { @y -= 1 }.then { @color = @white }
39
+ end
40
+
41
+ def down
42
+ @color = @blue
43
+ during(500) { @y += 1 }.then { @color = @white }
44
+ end
45
+
46
+ def shake1
47
+ #
48
+ # Nesting works too!
49
+ #
50
+ during(50) {@y -= 4}.then { during(100) {@y += 4}.then { during(50) {@y -= 4} } }
51
+ end
52
+
53
+ def shake2
54
+ #
55
+ # Does the exact same as "shake1" but using between() instead of during()
56
+ #
57
+ between(0,50) {@y -= 4}
58
+ between(50,150) {@y += 4}
59
+ between(150,200) {@y -= 4}
60
+ end
61
+
62
+ def draw
63
+ $window.fill_rect([@x, @y, 40, 40], @color)
64
+ end
65
+ end
66
+
67
+ Game.new.show
@@ -0,0 +1,115 @@
1
+ require 'rubygems'
2
+ require File.join(File.dirname($0), "..", "lib", "chingu")
3
+ include Gosu
4
+
5
+ #
6
+ # A little more complicated example where we do our own #update and #draw code.
7
+ # We also add another Actor - a bullet fired with space.
8
+ #
9
+ # Also tests out the Debug game state.
10
+ #
11
+ class Game < Chingu::Window
12
+ def initialize
13
+ #
14
+ # See http://www.libgosu.org/rdoc/classes/Gosu/Window.html#M000034 for options
15
+ # By default Chingu does 640 x 480 non-fullscreen.
16
+ #
17
+ super
18
+
19
+ push_game_state(Play)
20
+ end
21
+ end
22
+
23
+ #
24
+ # Our Player
25
+ #
26
+ class Player < Chingu::GameObject
27
+ def initialize(options = {})
28
+ super
29
+ @image = Image["spaceship.png"]
30
+ end
31
+
32
+ def move_left; @x -= 1; end
33
+ def move_right; @x += 1; end
34
+ def move_up; @y -= 1; end
35
+ def move_down; @y += 1; end
36
+
37
+ def fire
38
+ Bullet.create(:x => @x, :y => @y)
39
+ end
40
+ end
41
+
42
+ class Bullet < Chingu::GameObject
43
+ #
44
+ # If we need our own initialize, just call super and Chingu does it's thing.
45
+ # Here we merge in an extra argument, specifying the bullet-image.
46
+ #
47
+ def initialize(options)
48
+ super(options.merge(:image => Image["fire_bullet.png"]))
49
+ end
50
+
51
+ # Move the bullet forward
52
+ def update
53
+ @y -= 2
54
+ end
55
+
56
+ end
57
+
58
+ class Play < Chingu::GameState
59
+
60
+ def initialize
61
+ super
62
+ @player = Player.create(:x => 200, :y => 200)
63
+ @player.input = { :holding_left => :move_left,
64
+ :holding_right => :move_right,
65
+ :holding_up => :move_up,
66
+ :holding_down => :move_down,
67
+ :space => :fire,
68
+ :escape => :exit,
69
+ }
70
+ self.input = { :f1 => :debug }
71
+ end
72
+
73
+ def debug
74
+ #puts "--------"
75
+ #GameObject.all.each do |game_object|
76
+ # puts game_object.class
77
+ #end
78
+ #return
79
+
80
+ push_game_state(Chingu::GameStates::Debug)
81
+ end
82
+
83
+ #
84
+ # If we want to add extra graphics drawn just define your own draw.
85
+ # Be sure to call #super for enabling Chingus autodrawing of Actors.
86
+ # Putting #super before or after the background-draw-call really doesn't matter since Gosu work with "zorder".
87
+ #
88
+ def draw
89
+ # Raw Gosu Image.draw(x,y,zorder)-call
90
+ Image["background1.png"].draw(0, 0, 0)
91
+ super
92
+ end
93
+
94
+ #
95
+ # Gosus place for gamelogic is #update in the mainwindow
96
+ #
97
+ # A #super call here would call #update on all Chingu::Actors and check their inputs, and call the specified method.
98
+ #
99
+ def update
100
+ Bullet.destroy_if { |bullet| bullet.outside_window? }
101
+ #Bullet.destroy_if(&:outside_window?)
102
+
103
+ #
104
+ # Bullet.each_collision(Enemy) do |bullet, enemy|
105
+ # enemy.collision_with(bullet)
106
+ # bullet.destroy!
107
+ # end
108
+ #
109
+
110
+ super
111
+ $window.caption = "FPS: #{$window.fps} - milliseconds_since_last_tick: #{$window.milliseconds_since_last_tick} - game objects# #{current_game_state.game_objects.size} Bullets# #{Bullet.size}"
112
+ end
113
+ end
114
+
115
+ Game.new.show
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require File.join(File.dirname($0), "..", "lib", "chingu")
3
+ include Gosu
4
+
5
+ #
6
+ # Parallax-example
7
+ # Images from http://en.wikipedia.org/wiki/Parallax_scrolling
8
+ #
9
+ class Game < Chingu::Window
10
+ def initialize
11
+ super
12
+ self.input = { :holding_left => :scroll_left, :holding_right => :scroll_right, :escape => :exit }
13
+
14
+ self.caption = "Chingu::Parallax example. Scroll with left/right arrows."
15
+
16
+ @parallax = Chingu::Parallax.create(:x => 0, :y => 0, :center_x => 0, :center_y => 0)
17
+
18
+ #
19
+ # If no :zorder is given to @parallax.add_background it defaults to first added -> lowest zorder
20
+ # Everywhere the :image argument is used, theese 2 values are the Same:
21
+ # 1) Image["foo.png"] 2) "foo.png"
22
+ #
23
+ # TODO: scrolling to left borks outm, fix. + get rid of center_x / center_y args in a clean way.
24
+ @parallax.add_background(:image => "Parallax-scroll-example-layer-0.png", :damping => 100, :center => 0)
25
+ @parallax.add_background(:image => "Parallax-scroll-example-layer-1.png", :damping => 10, :center => 0)
26
+ @parallax.add_background(:image => "Parallax-scroll-example-layer-2.png", :damping => 5, :center => 0)
27
+ @parallax << {:image => "Parallax-scroll-example-layer-3.png", :damping => 1, :center => 0} # you can also add like this
28
+ end
29
+
30
+ def scroll_left
31
+ @parallax.x -= 2
32
+ end
33
+
34
+ def scroll_right
35
+ @parallax.x += 2
36
+ end
37
+
38
+ end
39
+
40
+ Game.new.show
@@ -0,0 +1,175 @@
1
+ require 'rubygems'
2
+ require File.join(File.dirname($0), "..", "lib", "chingu")
3
+ include Gosu
4
+
5
+ #
6
+ # Example demonstrating jumping between 4 different game states.
7
+ #
8
+ # push_game_state, pop_game_state, current_game_state previous_game_state are 4 helper-methods that Chingu mixes in
9
+ # into Chingu::Window and Chingu::GameState
10
+ #
11
+ # Behind the scenes they work against @game_state_manager that's autocreated within Chingu::Window.
12
+ #
13
+ # Execution in example4 flows like this:
14
+ #
15
+ # 1) Core Gosu calls instancemethods draw / update in the class based on Gosu::Window
16
+ # In this example 'Game' since "Game < Chingu::Window" and "Chingu::Window < Gosu::Window"
17
+ #
18
+ # 2) In its turn Game (Chingu::Window) calls @game_state_manager.draw / update
19
+ #
20
+ # 3) @game_state_manager calls draw / update on the current active game state
21
+ #
22
+ # 4) Each game state keeps a collection @game_objects which it calls draw / update on.
23
+ # Any object based on Chingu::GameObject (In this example Player and Text) automatically
24
+ # gets added to the correct state or or main window.
25
+ #
26
+
27
+ #
28
+ # Our standard Chingu::Window that makes all the magic happen.
29
+ #
30
+ class Game < Chingu::Window
31
+ def initialize
32
+ super
33
+
34
+ push_game_state(Intro)
35
+
36
+ # Yes you can do crazy things like this :)
37
+ self.input = { :left_mouse_button => lambda{Chingu::Text.create(:text => "Woff!")}, :esc => :exit}
38
+ end
39
+ end
40
+
41
+ # Our Player
42
+ class Player < Chingu::GameObject
43
+ def initialize(options = {})
44
+ super
45
+ @image = Image["spaceship.png"]
46
+ end
47
+
48
+ def move_left; @x -= 1; end
49
+ def move_right; @x += 1; end
50
+ def move_up; @y -= 1; end
51
+ def move_down; @y += 1; end
52
+
53
+ def fire
54
+ #puts $window.current_parent.to_s
55
+ #puts $window.game_state_manager.inside_state
56
+ Bullet.create(:x => @x - 20, :y => @y)
57
+ Bullet.create(:x => @x, :y => @y)
58
+ Bullet.create(:x => @x + 20, :y => @y)
59
+ end
60
+ end
61
+
62
+ # The bullet the Player fires
63
+ class Bullet < Chingu::GameObject
64
+ def initialize(options)
65
+ super
66
+ @image = Image["fire_bullet.png"]
67
+ end
68
+
69
+ def update
70
+ @y -= 2
71
+ end
72
+ end
73
+
74
+
75
+ #
76
+ # GAMESTATE #1 - INTRO
77
+ #
78
+ class Intro < Chingu::GameState
79
+ def initialize(options = {})
80
+ super
81
+ @title = Chingu::Text.create(:text=>"Press and release F1", :x=>200, :y=>50, :size=>30)
82
+ self.input = { :f1 => :pressed, :released_f1 => :released, :f2 => Menu}
83
+ end
84
+
85
+ def pressed
86
+ @title.text = "F1 pressed (F2 to continue)"
87
+ end
88
+
89
+ def released
90
+ @title.text = "F1 released (F2 to continue)"
91
+ end
92
+ end
93
+
94
+ #
95
+ # GAMESTATE #2 - MENU
96
+ #
97
+ class Menu < Chingu::GameState
98
+ def initialize(options = {})
99
+ super
100
+ @title = Chingu::Text.create(:text => "Press 'S' to Start game", :x=>100, :y=>50, :size=>30)
101
+ self.input = { :s => Level.new(:level => 10) }
102
+ end
103
+ end
104
+
105
+ #
106
+ # GAMESTATE #3 - LEVEL (Gameplay, yay)
107
+ #
108
+ class Level < Chingu::GameState
109
+ #
110
+ # initialize() is called when you create the game state
111
+ #
112
+ def initialize(options = {})
113
+ super
114
+ @title = Chingu::Text.create(:text=>"Level #{options[:level].to_s}. P: pause R:restart", :x=>20, :y=>10, :size=>30)
115
+ @player = Player.create
116
+ @player.input = { :holding_left => :move_left,
117
+ :holding_right => :move_right,
118
+ :holding_up => :move_up,
119
+ :holding_down => :move_down,
120
+ :space => :fire}
121
+
122
+ #
123
+ # The input-handler understands gamestates. P is pressed --> push_gamegate(Pause)
124
+ # You can also give it Procs/Lambdas which it will execute when key is pressed.
125
+ #
126
+ self.input = {:p => Pause, :r => lambda{ current_game_state.setup } }
127
+ end
128
+
129
+ def update
130
+ super
131
+ Bullet.destroy_if {|bullet| bullet.outside_window? }
132
+ $window.caption = "FPS: #{$window.fps} - GameObjects: #{game_objects.size} - Bullets: #{Bullet.size}"
133
+ end
134
+
135
+ #
136
+ # setup() is called each time you switch to the game state (and on creation time).
137
+ # You can skip setup by switching with push_game_state(:setup => false) or pop_game_state(:setup => false)
138
+ #
139
+ # This can be useful if you want to display some kind of box above the gameplay (pause/options/info/... box)
140
+ #
141
+ def setup
142
+ # Destroy all created objects of class Bullet
143
+ #p Bullet.size
144
+ #puts Bullet.all
145
+ Bullet.destroy_all
146
+
147
+ # Place player in a good starting position
148
+ @player.x = $window.width/2
149
+ @player.y = $window.height - @player.image.height
150
+ end
151
+ end
152
+
153
+ #
154
+ # SPECIAL GAMESTATE - Pause
155
+ #
156
+ # NOTICE: Chingu now comes with a predefined Chingu::GameStates::Pause that works simular to this!
157
+ #
158
+ class Pause < Chingu::GameState
159
+ def initialize(options = {})
160
+ super
161
+ @title = Chingu::Text.create(:text=>"PAUSED (press 'u' to un-pause)", :x=>100, :y=>200, :size=>20, :color => Color.new(0xFF00FF00))
162
+ self.input = { :u => :un_pause }
163
+ end
164
+
165
+ def un_pause
166
+ pop_game_state(:setup => false) # Return the previous game state, dont call setup()
167
+ end
168
+
169
+ def draw
170
+ previous_game_state.draw # Draw prev game state onto screen (in this case our level)
171
+ super # Draw game objects in current game state, this includes Chingu::Texts
172
+ end
173
+ end
174
+
175
+ Game.new.show