lotu 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. data/README.rdoc +33 -17
  2. data/VERSION +1 -1
  3. data/examples/hello_world/hello_world.rb +18 -9
  4. data/examples/media/animations/missile.png +0 -0
  5. data/examples/media/animations/missile.txt +18 -0
  6. data/examples/media/images/cohete-big.png +0 -0
  7. data/examples/media/images/cohete-medium.png +0 -0
  8. data/examples/media/images/cohete-small.png +0 -0
  9. data/examples/media/images/crosshair-1.png +0 -0
  10. data/examples/media/images/crosshair-2.png +0 -0
  11. data/examples/media/images/crosshair-3.png +0 -0
  12. data/examples/media/images/missile-med.png +0 -0
  13. data/examples/media/images/silo.png +0 -0
  14. data/examples/mouse_pointer/mouse_pointer.rb +26 -22
  15. data/examples/steering_behaviors/steering.rb +9 -5
  16. data/lib/lotu/actor.rb +61 -18
  17. data/lib/lotu/behaviors/collidable.rb +1 -1
  18. data/lib/lotu/cursor.rb +0 -1
  19. data/lib/lotu/game.rb +25 -12
  20. data/lib/lotu/system.rb +15 -0
  21. data/lib/lotu/systems/animation_system.rb +55 -0
  22. data/lib/lotu/systems/fps_system.rb +4 -4
  23. data/lib/lotu/systems/stalker_system.rb +10 -3
  24. data/lib/lotu/systems/steering_system.rb +6 -2
  25. data/lib/lotu.rb +2 -2
  26. data/lotu.gemspec +15 -20
  27. data/test/actor_test.rb +30 -16
  28. metadata +16 -21
  29. data/examples/media/Beep.wav +0 -0
  30. data/examples/media/CptnRuby Gem.png +0 -0
  31. data/examples/media/CptnRuby Map.txt +0 -25
  32. data/examples/media/CptnRuby Tileset.png +0 -0
  33. data/examples/media/CptnRuby.png +0 -0
  34. data/examples/media/Cursor.png +0 -0
  35. data/examples/media/Earth.png +0 -0
  36. data/examples/media/Explosion.wav +0 -0
  37. data/examples/media/LargeStar.png +0 -0
  38. data/examples/media/Smoke.png +0 -0
  39. data/examples/media/Soldier.png +0 -0
  40. data/examples/media/Space.png +0 -0
  41. data/examples/media/Star.png +0 -0
  42. data/examples/media/Starfighter.bmp +0 -0
  43. data/examples/media/amenoske.png +0 -0
  44. data/examples/media/crosshair.png +0 -0
  45. data/examples/media/title.png +0 -0
  46. /data/examples/media/{lobo_tuerto.png → images/lobo_tuerto.png} +0 -0
data/README.rdoc CHANGED
@@ -25,32 +25,48 @@ So, what can you do if you spot some patters here, a few more there? well, you d
25
25
 
26
26
  If you have any questions of suggestions don't hesitate and send me a message!
27
27
 
28
+ #--
29
+ == So you want to make a game with *lotu*?
28
30
 
29
- == Features
30
- * Easy way to manage input, rendering, updating, etc.
31
- * Simple access to game resources (images, sounds, songs, etc).
32
- * Steering behaviors
31
+ Ok, then you need to know a bit about the facilities it provides. Let's start with the main classes:
33
32
 
33
+ === Main classes
34
34
 
35
- == Coming features
36
- * Utility classes for viewports, game states, etc.
37
- * Pathfinding and more AI stuff
35
+ ==== Game
38
36
 
37
+ ==== Actor
38
+
39
+ ==== Cursor
40
+
41
+ ==== TextBox
42
+
43
+ === Systems
44
+
45
+ ==== Collision
46
+
47
+ ==== Fps
48
+
49
+ ==== Input
50
+
51
+ ==== Stalker
52
+
53
+ ==== Steering
54
+ #++
39
55
 
40
56
  == Game frameworks
41
57
  Here are some other Gosu based frameworks:
42
- * [Chingu] (http://github.com/ippa/chingu)
43
- * [Exuberant] (http://github.com/adamsanderson/lexery/tree/master/lib/exuberant)
44
- * [FWD] (http://github.com/walski/FWD)
45
- * [Nimo] (http://github.com/moonpxi/nimo)
46
- * [PuitUniverse] (http://github.com/oneup/puituniverse)
47
- * [Ramverk] (http://github.com/deps/Ramverk)
48
- * [Space Shooter Engine] (http://github.com/belen-albeza/space-shooter/tree/master/engine/)
49
- * [SpriteJam] (http://github.com/richardeden/spritejam)
58
+ * Chingu[http://github.com/ippa/chingu]
59
+ * Exuberant[http://github.com/adamsanderson/lexery/tree/master/lib/exuberant]
60
+ * FWD[http://github.com/walski/FWD]
61
+ * Nimo[http://github.com/moonpxi/nimo]
62
+ * PuitUniverse[http://github.com/oneup/puituniverse]
63
+ * Ramverk[http://github.com/deps/Ramverk]
64
+ * {Space Shooter Engine}[http://github.com/belen-albeza/space-shooter/tree/master/engine/]
65
+ * SpriteJam[http://github.com/richardeden/spritejam]
50
66
 
51
67
  There are others not base on Gosu you might like to check out:
52
- * [gamebox](http://github.com/shawn42/gamebox)
53
- * [jemini](http://github.com/jemini/jemini-core)
68
+ * gamebox[http://github.com/shawn42/gamebox]
69
+ * jemini[http://github.com/jemini/jemini-core]
54
70
 
55
71
  Be sure I will take inspiration from them. ;)
56
72
  Nevertheless I'm doing this because I want to become better at architecturing software. And this seems like fitting practice. :D
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.10
1
+ 0.1.11
@@ -10,12 +10,7 @@ class MovingRuby < Actor
10
10
  def initialize(opts={})
11
11
  super
12
12
  # Use the image which filename is CptnRuby Gem.png
13
- set_image 'CptnRuby Gem.png'
14
- # Map keys to some methods
15
- set_keys(KbRight => :move_right,
16
- KbLeft => :move_left,
17
- KbUp => :move_up,
18
- KbDown => :move_down)
13
+ set_image 'lobo_tuerto.png', :factor_x => 0.5, :factor_y => 0.5
19
14
  end
20
15
 
21
16
  # Let's define some basic movement methods
@@ -45,22 +40,36 @@ class Example < Game
45
40
  # declared in the parent class
46
41
  super
47
42
  # When the Escape key is pressed, call the close method on class Example
48
- set_keys(KbEscape => :close)
43
+ set_keys(KbEscape => :close,
44
+ KbD => [:debug!, false])
49
45
  end
50
46
 
51
47
  def load_resources
52
48
  # From this file,
53
49
  with_path_from_file(__FILE__) do
54
50
  # go back one dir and search inside media/
55
- load_images '../media/'
51
+ load_images '../media/images'
56
52
  end
57
53
  end
58
54
 
59
55
  def setup_actors
56
+ # Create a ruby in the middle of the screen
60
57
  @ruby = MovingRuby.new(:x => width/2, :y => height/2)
58
+ # Map keys to some methods
59
+ @ruby.set_keys(KbRight => :move_right,
60
+ KbLeft => :move_left,
61
+ KbUp => :move_up,
62
+ KbDown => :move_down)
63
+ @ruby2 = MovingRuby.new(:x => width/2, :y => height/2)
64
+ # Map keys to some methods
65
+ @ruby2.set_keys(KbRight => :move_left,
66
+ KbLeft => :move_right,
67
+ KbUp => :move_up,
68
+ KbDown => :move_down)
61
69
  # Create a TextBox so we can display a message on screen
62
70
  @info = TextBox.new
63
- @info.text("Move around with arrow keys")
71
+ @info.text("Hello world!")
72
+ @info.text("Move around with arrow keys", :size => 16, :color => 0xff33ccff)
64
73
  end
65
74
 
66
75
  end
@@ -0,0 +1,18 @@
1
+ miss0000 = 380 0 75 75
2
+ miss0001 = 380 76 75 75
3
+ miss0002 = 304 76 75 75
4
+ miss0003 = 304 0 75 75
5
+ miss0004 = 228 152 75 75
6
+ miss0005 = 76 228 75 75
7
+ miss0006 = 152 228 75 75
8
+ miss0007 = 0 228 75 75
9
+ miss0008 = 304 152 75 75
10
+ miss0009 = 380 152 75 75
11
+ miss0010 = 228 76 75 75
12
+ miss0011 = 0 76 75 75
13
+ miss0012 = 76 76 75 75
14
+ miss0013 = 152 0 75 75
15
+ miss0014 = 0 0 75 75
16
+ miss0015 = 76 0 75 75
17
+ miss0016 = 152 152 75 75
18
+ miss0017 = 228 0 75 75
Binary file
@@ -8,7 +8,7 @@ include Lotu
8
8
  class WarpingRuby < Actor
9
9
  def initialize(opts={})
10
10
  super
11
- set_image 'CptnRuby Gem.png'
11
+ set_image 'lobo_tuerto.png', :factor_x => 0.3, :factor_y => 0.3
12
12
  end
13
13
 
14
14
  def warp(x, y)
@@ -23,13 +23,12 @@ class Example < Game
23
23
  # declared in the parent class
24
24
  super
25
25
  # Custom setup methods for this class
26
- setup_input
27
26
  setup_events
28
27
  end
29
28
 
30
29
  def load_resources
31
30
  with_path_from_file(__FILE__) do
32
- load_images '../media'
31
+ load_images '../media/images'
33
32
  end
34
33
  end
35
34
 
@@ -37,15 +36,31 @@ class Example < Game
37
36
  # It's important to call super here to setup the InputSystem
38
37
  super
39
38
  use(FpsSystem)
40
- use(StalkerSystem, :stalk => [Actor, Cursor, WarpingRuby, TextBox, Object])
39
+ use(StalkerSystem, :stalk => [Actor, Cursor, TextBox, WarpingRuby, Object])
40
+ end
41
+
42
+ def setup_input
43
+ set_keys(KbEscape => :close,
44
+ KbD => [:debug!, false])
45
+ end
46
+
47
+ def setup_events
48
+ @cursor1.on(:click) do |x,y|
49
+ @ruby.warp(x,y)
50
+ end
51
+ @cursor2.on(:click) do |x,y|
52
+ @ruby.warp(x,y)
53
+ end
41
54
  end
42
55
 
43
56
  def setup_actors
44
57
  @ruby = WarpingRuby.new(:x => width/2, :y => height/2)
45
- @cursor1 = Cursor.new(:image => 'crosshair.png',
58
+ @cursor1 = Cursor.new(:image => 'crosshair-1.png',
46
59
  :keys => {MsLeft => [:click, false]},
47
- :color => 0xff0099ff)
48
- @cursor2 = Cursor.new(:image => 'crosshair.png',
60
+ :color => 0xff0099ff,
61
+ :width => 100,
62
+ :height => 100)
63
+ @cursor2 = Cursor.new(:image => 'crosshair-2.png',
49
64
  :use_mouse => false,
50
65
  :keys => {
51
66
  KbSpace => [:click, false],
@@ -53,14 +68,16 @@ class Example < Game
53
68
  KbDown => :down,
54
69
  KbLeft => :left,
55
70
  KbRight => :right},
56
- :color => 0xff99ff00)
71
+ :color => 0xff99ff00,
72
+ :factor_x => 0.5,
73
+ :factor_y => 0.5)
57
74
  @cursor2.x = width*3/4
58
75
  @cursor2.y = height/2
59
76
 
60
77
  # Create a TextBox with default option :size => 15
61
78
  @info = TextBox.new(:size => 15)
62
79
  @info.watch(@systems[FpsSystem])
63
- @info.watch(@systems[StalkerSystem])
80
+ @info.watch(@systems[StalkerSystem], :color => 0xff3ffccf)
64
81
  # We can change the size for a specific line of text
65
82
  @info.watch("@cursor1 data:", :size => 20)
66
83
  # Color too
@@ -70,19 +87,6 @@ class Example < Game
70
87
  @info.text("Move @cursor1 with mouse and @cursor2 with arrow keys (click with space!)")
71
88
  end
72
89
 
73
- def setup_input
74
- set_keys KbEscape => :close
75
- end
76
-
77
- def setup_events
78
- @cursor1.on(:click) do |x,y|
79
- @ruby.warp(x,y)
80
- end
81
- @cursor2.on(:click) do |x,y|
82
- @ruby.warp(x,y)
83
- end
84
- end
85
-
86
90
  end
87
91
 
88
92
  Example.new.show
@@ -8,7 +8,6 @@ include Lotu
8
8
  class SteeringRuby < Actor
9
9
  def initialize(opts={})
10
10
  super
11
- set_image 'CptnRuby Gem.png'
12
11
  use(SteeringSystem, opts)
13
12
  end
14
13
 
@@ -24,40 +23,45 @@ class Example < Game
24
23
  # declared in the parent class
25
24
  super
26
25
  # Custom setup methods for this class
27
- setup_input
28
26
  setup_events
29
27
  end
30
28
 
31
29
  def load_resources
32
30
  with_path_from_file(__FILE__) do
33
- load_images '../media'
31
+ load_images '../media/images'
32
+ load_animations '../media/animations'
34
33
  end
35
34
  end
36
35
 
37
36
  def setup_input
38
37
  set_keys(KbEscape => :close,
39
- MsRight => :reset_ruby)
38
+ MsRight => :reset_ruby,
39
+ KbD => [:debug!, false])
40
40
  end
41
41
 
42
42
  def setup_systems
43
43
  # It's important to call super here to setup the InputSystem
44
44
  super
45
45
  use(FpsSystem)
46
+ use(StalkerSystem, :stalk => [Actor, Vector2d, Object])
46
47
  end
47
48
 
48
49
  def setup_actors
49
50
  @ruby = SteeringRuby.new(:mass => 0.3, :max_speed => 100, :max_turn_rate => 140)
50
51
  @ruby.warp(width/2, height/2)
51
52
  @ruby.activate(:evade)
53
+ @ruby.play_animation('missile.png')
52
54
 
53
55
  @ruby2 = SteeringRuby.new
54
56
  @ruby2.activate(:pursuit)
57
+ @ruby2.play_animation('missile.png', :factor_x => 0.5, :factor_y => 0.5, :fps => 60)
55
58
 
56
- @cursor = Cursor.new(:image => 'crosshair.png',
59
+ @cursor = Cursor.new(:image => 'crosshair-1.png',
57
60
  :keys => {MsLeft => [:click, false]})
58
61
 
59
62
  @window_info = TextBox.new(:size => 15)
60
63
  @window_info.watch(@systems[FpsSystem])
64
+ @window_info.watch(@systems[StalkerSystem])
61
65
  @window_info.watch(@cursor, :color => 0xffff0000)
62
66
  @window_info.text("Click to start the simulation")
63
67
  @window_info.text("One will pursuit while the other evades, right click to center evader on screen")
data/lib/lotu/actor.rb CHANGED
@@ -2,7 +2,8 @@ module Lotu
2
2
  class Actor
3
3
  attr_accessor :parent, :x, :y, :systems,
4
4
  :z, :angle, :center_x, :center_y,
5
- :factor_x, :factor_y, :color, :mode, :image
5
+ :factor_x, :factor_y, :color, :mode, :image,
6
+ :width, :height
6
7
 
7
8
  include SystemUser
8
9
  include Controllable
@@ -21,25 +22,17 @@ module Lotu
21
22
  :mode => :default,
22
23
  :parent => $lotu
23
24
  }
24
- @opts = default_opts.merge!(opts)
25
- @image = nil
26
- @x = @opts[:x]
27
- @y = @opts[:y]
28
- @z = @opts[:z]
29
- @angle = @opts[:angle]
30
- @center_x = @opts[:center_x]
31
- @center_y = @opts[:center_y]
32
- @factor_x = @opts[:factor_x]
33
- @factor_y = @opts[:factor_y]
34
- @color = @opts[:color]
35
- @mode = @opts[:mode]
36
- @parent = @opts[:parent]
25
+ opts = default_opts.merge!(opts)
26
+ @parent = opts[:parent]
37
27
  @parent.manage_me(self)
28
+ set_image(opts[:image], opts) if opts[:image]
29
+ parse_options(opts)
38
30
  @systems = {}
39
31
 
40
32
  # Add extra functionality
41
33
  self.extend Eventful
42
34
  self.extend Collidable
35
+ use(AnimationSystem)
43
36
  end
44
37
 
45
38
  # Easy access to delta-time
@@ -47,12 +40,49 @@ module Lotu
47
40
  $lotu.dt
48
41
  end
49
42
 
50
- def set_image(image)
43
+ def parse_options(opts)
44
+ @x = opts[:x] || @x
45
+ @y = opts[:y] || @y
46
+ @z = opts[:z] || @z
47
+ @angle = opts[:angle] || @angle
48
+ @center_x = opts[:center_x] || @center_x
49
+ @center_y = opts[:center_y] || @center_y
50
+ @factor_x = opts[:factor_x] || @factor_x
51
+ @factor_y = opts[:factor_y] || @factor_y
52
+ @color = opts[:color] || @color
53
+ @mode = opts[:mode] || @mode
54
+ end
55
+
56
+ def set_image(image, opts={})
51
57
  @image = @parent.image(image)
58
+ puts "Image \"#{image}\" not found".red if @image.nil?
59
+ parse_options(opts)
60
+ @width = opts[:width] || @image.width
61
+ @height = opts[:height] || @image.height
62
+ calc_zoom
63
+ end
64
+
65
+ def set_gosu_image(image, opts={})
66
+ @image = image
67
+ parse_options(opts)
68
+ @width = opts[:width] || @image.width
69
+ @height = opts[:height] || @image.height
70
+ calc_zoom
71
+ end
72
+
73
+ def width=(width)
74
+ @width = width
75
+ calc_zoom
52
76
  end
53
77
 
54
- def unset_image
55
- @image = nil
78
+ def height=(height)
79
+ @height = height
80
+ calc_zoom
81
+ end
82
+
83
+ def calc_zoom
84
+ @zoom_x = Float(@width)/@image.width
85
+ @zoom_y = Float(@height)/@image.height
56
86
  end
57
87
 
58
88
  # Remove ourselves from the update queue
@@ -67,7 +97,20 @@ module Lotu
67
97
  end
68
98
 
69
99
  def draw
70
- @image.draw_rot(@x, @y, @z, @angle, @center_x, @center_y, @factor_x, @factor_y, @color, @mode) unless @image.nil?
100
+ @image.draw_rot(@x, @y, @z, @angle, @center_x, @center_y, @factor_x*@zoom_x, @factor_y*@zoom_y, @color, @mode) unless @image.nil?
101
+ draw_debug if $lotu.debug? unless @image.nil?
102
+ end
103
+
104
+ def draw_debug
105
+ draw_box(@x-@image.width/2, @y-@image.height/2, @image.width, @image.height)
106
+ draw_box(@x-@width/2, @y-@height/2, @width, @height, 0xff00ff00)
107
+ end
108
+
109
+ def draw_box(x, y, w, h, c = 0xffff0000)
110
+ $lotu.draw_line(x, y, c, x+w, y, c)
111
+ $lotu.draw_line(x, y, c, x, y+h, c)
112
+ $lotu.draw_line(x+w, y+h, c, x+w, y, c)
113
+ $lotu.draw_line(x+w, y+h, c, x, y+h, c)
71
114
  end
72
115
 
73
116
  end
@@ -20,7 +20,7 @@ module Lotu
20
20
 
21
21
  def die
22
22
  super
23
- @parent.systems[CollisionSystem].remove_entity(self, @collision_tag)
23
+ @parent.systems[CollisionSystem].remove_entity(self, @collision_tag) if @parent.systems[CollisionSystem]
24
24
  end
25
25
 
26
26
  end
data/lib/lotu/cursor.rb CHANGED
@@ -18,7 +18,6 @@ module Lotu
18
18
  @clicked_x = @clicked_y = 0
19
19
  @speed = opts[:speed]
20
20
  @use_mouse = opts[:use_mouse]
21
- set_image(opts[:image]) unless opts[:image].nil?
22
21
  set_keys(opts[:keys]) unless opts[:keys].nil?
23
22
  end
24
23
 
data/lib/lotu/game.rb CHANGED
@@ -12,7 +12,7 @@ module Lotu
12
12
 
13
13
  # Handy global window variable
14
14
  $lotu = self
15
- @debug = true
15
+ @debug = false
16
16
  setup_containers
17
17
 
18
18
  # For timer initialization
@@ -24,12 +24,21 @@ module Lotu
24
24
  load_resources
25
25
  setup_systems
26
26
  setup_actors
27
+ setup_input
27
28
  end
28
29
 
30
+ def debug!
31
+ @debug = !@debug
32
+ end
33
+
34
+ def debug?
35
+ @debug
36
+ end
29
37
 
30
38
  # Hook methods, these are meant to be replaced by subclasses
31
39
  def load_resources;end
32
40
  def setup_actors;end
41
+ def setup_input;end
33
42
 
34
43
  def setup_systems
35
44
  use(InputSystem)
@@ -49,7 +58,7 @@ module Lotu
49
58
  @images = {}
50
59
  @sounds = {}
51
60
  @songs = {}
52
- @animations = {}
61
+ @animations = Hash.new{|h,k| h[k] = []}
53
62
  end
54
63
 
55
64
  # Main update loop
@@ -149,19 +158,23 @@ module Lotu
149
158
  end
150
159
 
151
160
  def load_animations(path)
152
- path = File.expand_path(File.join(@path, path))
153
- puts "Loading from: #{path}"
161
+ coords = Hash.new{|h,k| h[k] = []}
162
+
163
+ with_files(/\.txt/, path) do |file_name, file_path|
164
+ name = File.basename(file_name, '.txt')
165
+ File.open(file_path) do |file|
166
+ file.lines.each do |line|
167
+ coords[name] << line.scan(/\d+/).map!(&:to_i)
168
+ end
169
+ end
170
+ end
154
171
 
155
- count = 0
156
- Dir.entries(path).grep(regexp).each do |entry|
157
- begin
158
- @animations[entry] = klass.new($lotu, File.join(path, entry))
159
- count += 1
160
- rescue Exception => e
161
- puts e, File.join(path, entry)
172
+ with_files(/\.png|\.jpg|\.bmp/, path) do |file_name, file_path|
173
+ name, extension = file_name.split('.')
174
+ coords[name].each do |index, x, y, width, height|
175
+ @animations[file_name] << Gosu::Image.new($lotu, file_path, true, x, y, width, height)
162
176
  end
163
177
  end
164
- puts "#{count} #{klass} files loaded."
165
178
  end
166
179
 
167
180
  def with_path_from_file(path, &blk)
@@ -0,0 +1,15 @@
1
+ module Lotu
2
+ class System
3
+
4
+ def initialize(user, opts={})
5
+ @user = user
6
+ end
7
+
8
+ def dt
9
+ $lotu.dt
10
+ end
11
+
12
+ def draw;end
13
+
14
+ end
15
+ end
@@ -0,0 +1,55 @@
1
+ module Lotu
2
+ class AnimationSystem < System
3
+
4
+ def initialize(user, opts={})
5
+ super
6
+ @user.extend(UserMethods)
7
+ end
8
+
9
+ def animated?
10
+ defined?(@length)
11
+ end
12
+
13
+ def play_animation(name, opts={})
14
+ default_opts = {
15
+ :fps => 30
16
+ }
17
+ opts = default_opts.merge!(opts)
18
+ @name = name
19
+ @length = $lotu.animation(@name).length
20
+ @time_per_frame = 1.0/opts[:fps]
21
+ @current_frame = 0
22
+ @accum_time = 0
23
+ @user.set_gosu_image($lotu.animation(@name)[0], opts)
24
+ end
25
+
26
+ def update
27
+ if animated?
28
+ @accum_time += dt
29
+ if @accum_time >= @time_per_frame
30
+ frames = @accum_time/@time_per_frame
31
+ @current_frame += frames
32
+ @accum_time -= @time_per_frame * frames
33
+ @current_frame = 0 if @current_frame >= @length
34
+ image = $lotu.animation(@name)[@current_frame]
35
+ @user.image = image
36
+ end
37
+ end
38
+ end
39
+
40
+ def to_s
41
+ ["Name: #{@name}",
42
+ "Current frame: #{@current_frame}",
43
+ "Accumulated time: #{format('%.2f', @accum_time)}",
44
+ "Time per frame: #{format('%.2f', @time_per_frame)}",
45
+ "Length: #{@length}"]
46
+ end
47
+
48
+ module UserMethods
49
+ def play_animation(name, opts={})
50
+ @systems[AnimationSystem].play_animation(name, opts)
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -3,19 +3,19 @@ module Lotu
3
3
 
4
4
  def initialize(user, opts={})
5
5
  default_opts = {
6
- :samples => 10
6
+ :ticks_per_update => 10
7
7
  }
8
8
  opts = default_opts.merge!(opts)
9
9
  @accum = 0.0
10
10
  @ticks = 0
11
11
  @fps = 0.0
12
- @samples = opts[:samples]
12
+ @ticks_per_update = opts[:ticks_per_update]
13
13
  end
14
14
 
15
15
  def update
16
16
  @ticks += 1
17
17
  @accum += $lotu.dt
18
- if @ticks >= @samples
18
+ if @ticks >= @ticks_per_update
19
19
  @fps = @ticks/@accum
20
20
  @ticks = 0
21
21
  @accum = 0.0
@@ -23,7 +23,7 @@ module Lotu
23
23
  end
24
24
 
25
25
  def to_s
26
- "Samples per second: #{@samples} | FPS: #{format("%.2f",@fps)}"
26
+ "Ticks per update: #{@ticks_per_update} | FPS: #{format("%.2f",@fps)}"
27
27
  end
28
28
 
29
29
  def draw;end
@@ -3,9 +3,12 @@ module Lotu
3
3
 
4
4
  def initialize(user, opts={})
5
5
  default_opts = {
6
- :stalk => [Actor]
6
+ :stalk => [Actor],
7
+ :ticks_per_update => 30
7
8
  }
8
9
  opts = default_opts.merge!(opts)
10
+ @ticks = 0
11
+ @ticks_per_update = opts[:ticks_per_update]
9
12
  @stalked = {}
10
13
  opts[:stalk].each do |type|
11
14
  @stalked[type] = 0
@@ -13,8 +16,12 @@ module Lotu
13
16
  end
14
17
 
15
18
  def update
16
- @stalked.each_key do |type|
17
- @stalked[type] = ObjectSpace.each_object(type).count
19
+ @ticks += 1
20
+ if @ticks >= @ticks_per_update
21
+ @stalked.each_key do |type|
22
+ @stalked[type] = ObjectSpace.each_object(type).count
23
+ end
24
+ @ticks = 0
18
25
  end
19
26
  end
20
27
 
@@ -157,10 +157,10 @@ module Lotu
157
157
  module UserMethods
158
158
 
159
159
  def self.extended(instance)
160
- instance.steering_setup
160
+ instance.setup_steering
161
161
  end
162
162
 
163
- def steering_setup
163
+ def setup_steering
164
164
  # Create accessors for the user
165
165
  class << self
166
166
  attr_accessor :mass, :pos, :heading, :vel, :accel,
@@ -193,6 +193,10 @@ module Lotu
193
193
 
194
194
  def draw
195
195
  super
196
+ draw_debug if $lotu.debug?
197
+ end
198
+
199
+ def draw_debug
196
200
  $lotu.draw_line(0, 0, 0xff999999, @pos.x, @pos.y, 0xff333333)
197
201
  $lotu.draw_line(@pos.x, @pos.y, 0xffffffff, (@pos + @heading*50).x, (@pos+@heading*50).y, 0xffff0000)
198
202
  $lotu.draw_line(@pos.x, @pos.y, 0xffffffff, @target.x, @target.y, 0xff00ff00) if @target
data/lib/lotu.rb CHANGED
@@ -4,5 +4,5 @@ $LOAD_PATH.unshift(LOTU_ROOT)
4
4
  require 'gosu'
5
5
  %w{vector2d string}.each{|file| require "misc/#{file}"}
6
6
  %w{system_user collidable controllable eventful}.each{|file| require "behaviors/#{file}"}
7
- %w{input_system stalker_system fps_system collision_system steering_system}.each{|file| require "systems/#{file}"}
8
- %w{game actor cursor text_box}.each{|file| require file}
7
+ %w{game system actor cursor text_box}.each{|file| require file}
8
+ %w{animation_system input_system stalker_system fps_system collision_system steering_system}.each{|file| require "systems/#{file}"}
data/lotu.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{lotu}
8
- s.version = "0.1.10"
8
+ s.version = "0.1.11"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["lobo_tuerto"]
12
- s.date = %q{2010-03-26}
12
+ s.date = %q{2010-03-27}
13
13
  s.description = %q{lotu aims to bring an agile and simple game development framework to life. It provides useful abstractions so you can concentrate on developing your game.}
14
14
  s.email = %q{dev@lobotuerto.com}
15
15
  s.extra_rdoc_files = [
@@ -25,24 +25,17 @@ Gem::Specification.new do |s|
25
25
  "Rakefile",
26
26
  "VERSION",
27
27
  "examples/hello_world/hello_world.rb",
28
- "examples/media/Beep.wav",
29
- "examples/media/CptnRuby Gem.png",
30
- "examples/media/CptnRuby Map.txt",
31
- "examples/media/CptnRuby Tileset.png",
32
- "examples/media/CptnRuby.png",
33
- "examples/media/Cursor.png",
34
- "examples/media/Earth.png",
35
- "examples/media/Explosion.wav",
36
- "examples/media/LargeStar.png",
37
- "examples/media/Smoke.png",
38
- "examples/media/Soldier.png",
39
- "examples/media/Space.png",
40
- "examples/media/Star.png",
41
- "examples/media/Starfighter.bmp",
42
- "examples/media/amenoske.png",
43
- "examples/media/crosshair.png",
44
- "examples/media/lobo_tuerto.png",
45
- "examples/media/title.png",
28
+ "examples/media/animations/missile.png",
29
+ "examples/media/animations/missile.txt",
30
+ "examples/media/images/cohete-big.png",
31
+ "examples/media/images/cohete-medium.png",
32
+ "examples/media/images/cohete-small.png",
33
+ "examples/media/images/crosshair-1.png",
34
+ "examples/media/images/crosshair-2.png",
35
+ "examples/media/images/crosshair-3.png",
36
+ "examples/media/images/lobo_tuerto.png",
37
+ "examples/media/images/missile-med.png",
38
+ "examples/media/images/silo.png",
46
39
  "examples/mouse_pointer/mouse_pointer.rb",
47
40
  "examples/steering_behaviors/steering.rb",
48
41
  "lib/lotu.rb",
@@ -55,6 +48,8 @@ Gem::Specification.new do |s|
55
48
  "lib/lotu/game.rb",
56
49
  "lib/lotu/misc/string.rb",
57
50
  "lib/lotu/misc/vector2d.rb",
51
+ "lib/lotu/system.rb",
52
+ "lib/lotu/systems/animation_system.rb",
58
53
  "lib/lotu/systems/collision_system.rb",
59
54
  "lib/lotu/systems/fps_system.rb",
60
55
  "lib/lotu/systems/input_system.rb",
data/test/actor_test.rb CHANGED
@@ -3,7 +3,9 @@ require 'rubygems'
3
3
  require 'protest'
4
4
  require 'rr'
5
5
  require File.dirname(__FILE__) + '/../lib/lotu'
6
-
6
+
7
+ include Lotu
8
+
7
9
  class Protest::TestCase
8
10
  include RR::Adapters::TestUnit
9
11
  end
@@ -12,34 +14,46 @@ Protest.report_with(:documentation)
12
14
 
13
15
  Protest.context('An Actor') do
14
16
  setup do
15
- $lotu = Lotu::Window.new
16
- @actor = Lotu::Actor.new
17
+ @game = Game.new
18
+ @actor = Actor.new
17
19
  end
18
20
 
19
- it 'has an x coordinate. (default: 0)' do
21
+ it 'has an x coordinate (default: 0)' do
20
22
  assert_equal 0, @actor.x
21
23
  end
22
24
 
23
- it 'has an y coordinate. (default: 0)' do
25
+ it 'has an y coordinate (default: 0)' do
24
26
  assert_equal 0, @actor.y
25
27
  end
26
28
 
27
- # faltaría el attr_reader :color en actor.rb
28
- #
29
- it 'has a color. (default: 0xffffffff)' do
30
- pending
31
- #assert_equal Gosu::Color::WHITE, @actor.color
29
+ it 'has a color (default: 0xffffffff)' do
30
+ assert_equal 0xffffffff, @actor.color
32
31
  end
33
32
 
34
- it 'has a window reference.' do
35
- assert_equal $lotu, @actor.parent
33
+ it 'has a parent reference == Game' do
34
+ assert_equal @game, @actor.parent
35
+ end
36
+
37
+ context 'when creating' do
38
+ it 'asks Game to manage it' do
39
+ pending
40
+ #crear método 'init' para poder probar esto?
41
+ end
36
42
  end
37
43
 
38
- # some context...
39
- #
40
44
  context 'when dying' do
41
- it 'removes itself from Window update_queue.' do
42
- mock.proxy($lotu.update_queue).delete(@actor)
45
+ it 'asks Game to kill it' do
46
+ mock.proxy(@game).kill_me(@actor)
47
+ @actor.die
48
+ end
49
+
50
+ it 'is removed from Game update_queue' do
51
+ mock.proxy(@game.update_queue).delete(@actor)
52
+ @actor.die
53
+ end
54
+
55
+ it 'is removed from Game draw_queue' do
56
+ mock.proxy(@game.update_queue).delete(@actor)
43
57
  @actor.die
44
58
  end
45
59
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 10
9
- version: 0.1.10
8
+ - 11
9
+ version: 0.1.11
10
10
  platform: ruby
11
11
  authors:
12
12
  - lobo_tuerto
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-26 00:00:00 -06:00
17
+ date: 2010-03-27 00:00:00 -06:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -49,24 +49,17 @@ files:
49
49
  - Rakefile
50
50
  - VERSION
51
51
  - examples/hello_world/hello_world.rb
52
- - examples/media/Beep.wav
53
- - examples/media/CptnRuby Gem.png
54
- - examples/media/CptnRuby Map.txt
55
- - examples/media/CptnRuby Tileset.png
56
- - examples/media/CptnRuby.png
57
- - examples/media/Cursor.png
58
- - examples/media/Earth.png
59
- - examples/media/Explosion.wav
60
- - examples/media/LargeStar.png
61
- - examples/media/Smoke.png
62
- - examples/media/Soldier.png
63
- - examples/media/Space.png
64
- - examples/media/Star.png
65
- - examples/media/Starfighter.bmp
66
- - examples/media/amenoske.png
67
- - examples/media/crosshair.png
68
- - examples/media/lobo_tuerto.png
69
- - examples/media/title.png
52
+ - examples/media/animations/missile.png
53
+ - examples/media/animations/missile.txt
54
+ - examples/media/images/cohete-big.png
55
+ - examples/media/images/cohete-medium.png
56
+ - examples/media/images/cohete-small.png
57
+ - examples/media/images/crosshair-1.png
58
+ - examples/media/images/crosshair-2.png
59
+ - examples/media/images/crosshair-3.png
60
+ - examples/media/images/lobo_tuerto.png
61
+ - examples/media/images/missile-med.png
62
+ - examples/media/images/silo.png
70
63
  - examples/mouse_pointer/mouse_pointer.rb
71
64
  - examples/steering_behaviors/steering.rb
72
65
  - lib/lotu.rb
@@ -79,6 +72,8 @@ files:
79
72
  - lib/lotu/game.rb
80
73
  - lib/lotu/misc/string.rb
81
74
  - lib/lotu/misc/vector2d.rb
75
+ - lib/lotu/system.rb
76
+ - lib/lotu/systems/animation_system.rb
82
77
  - lib/lotu/systems/collision_system.rb
83
78
  - lib/lotu/systems/fps_system.rb
84
79
  - lib/lotu/systems/input_system.rb
Binary file
Binary file
@@ -1,25 +0,0 @@
1
- #....................................................#
2
- #....................................................#
3
- #.............xx......x.x............................#
4
- #............x..x....................................#
5
- #x....x...x..x.......#####..xxx....................x.#
6
- #.x.........................xxx.........##.........x.#
7
- #...............""..........###...##..........##.....#
8
- #..##..###..##..##...................................#
9
- #........................................xx........###
10
- #.............................###....................#
11
- ##....##.............................................#
12
- #....................##....##......##....##....##....#
13
- #.................................................x..#
14
- #...x....##....##.......x...x.....................x..#
15
- #.....x...............x...x...x...................x..#
16
- #......x...##.....##.................................#
17
- #.......x.........................................#..#
18
- #...........##........#...#...#..#.......x...........#
19
- #...#................................................#
20
- #....."""".................x.......#..#####...###....#
21
- #x....#......................##......................#
22
- #"""""#.....#.....x..................#...............#
23
- ##xxxx......#........................................#
24
- ##xxxx...#####............."...""""".................#
25
- ######"""#############################################
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file