lotu 0.1.9 → 0.1.10
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.
- data/VERSION +1 -1
- data/examples/hello_world/hello_world.rb +5 -3
- data/examples/mouse_pointer/mouse_pointer.rb +23 -19
- data/examples/steering_behaviors/steering.rb +13 -9
- data/lib/lotu/actor.rb +39 -11
- data/lib/lotu/behaviors/controllable.rb +1 -9
- data/lib/lotu/cursor.rb +8 -8
- data/lib/lotu/{window.rb → game.rb} +10 -10
- data/lib/lotu/systems/fps_system.rb +1 -1
- data/lib/lotu/systems/input_system.rb +76 -0
- data/lib/lotu/systems/steering_system.rb +3 -3
- data/lib/lotu/text_box.rb +2 -5
- data/lib/lotu.rb +3 -3
- data/lotu.gemspec +4 -5
- data/test/actor_test.rb +3 -3
- metadata +5 -6
- data/lib/lotu/behaviors/controllable/input_controller.rb +0 -56
- data/lib/lotu/behaviors/drawable.rb +0 -61
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.10
|
@@ -1,9 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
LIB_PATH = File.join(File.dirname(__FILE__), '..', '..', 'lib', 'lotu.rb')
|
3
3
|
require File.expand_path(LIB_PATH)
|
4
|
+
|
4
5
|
include Gosu::Button
|
6
|
+
include Lotu
|
5
7
|
|
6
|
-
class MovingRuby <
|
8
|
+
class MovingRuby < Actor
|
7
9
|
|
8
10
|
def initialize(opts={})
|
9
11
|
super
|
@@ -35,7 +37,7 @@ class MovingRuby < Lotu::Actor
|
|
35
37
|
|
36
38
|
end
|
37
39
|
|
38
|
-
class Example <
|
40
|
+
class Example < Game
|
39
41
|
|
40
42
|
def initialize
|
41
43
|
# This will call the hooks:
|
@@ -57,7 +59,7 @@ class Example < Lotu::Window
|
|
57
59
|
def setup_actors
|
58
60
|
@ruby = MovingRuby.new(:x => width/2, :y => height/2)
|
59
61
|
# Create a TextBox so we can display a message on screen
|
60
|
-
@info =
|
62
|
+
@info = TextBox.new
|
61
63
|
@info.text("Move around with arrow keys")
|
62
64
|
end
|
63
65
|
|
@@ -1,9 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
LIB_PATH = File.join(File.dirname(__FILE__), '..', '..', 'lib', 'lotu.rb')
|
3
3
|
require File.expand_path(LIB_PATH)
|
4
|
+
|
4
5
|
include Gosu::Button
|
6
|
+
include Lotu
|
5
7
|
|
6
|
-
class WarpingRuby <
|
8
|
+
class WarpingRuby < Actor
|
7
9
|
def initialize(opts={})
|
8
10
|
super
|
9
11
|
set_image 'CptnRuby Gem.png'
|
@@ -14,7 +16,7 @@ class WarpingRuby < Lotu::Actor
|
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
17
|
-
class Example <
|
19
|
+
class Example < Game
|
18
20
|
def initialize
|
19
21
|
# This will call the hooks:
|
20
22
|
# load_resources, setup_systems and setup_actors
|
@@ -32,31 +34,33 @@ class Example < Lotu::Window
|
|
32
34
|
end
|
33
35
|
|
34
36
|
def setup_systems
|
35
|
-
|
36
|
-
|
37
|
+
# It's important to call super here to setup the InputSystem
|
38
|
+
super
|
39
|
+
use(FpsSystem)
|
40
|
+
use(StalkerSystem, :stalk => [Actor, Cursor, WarpingRuby, TextBox, Object])
|
37
41
|
end
|
38
42
|
|
39
43
|
def setup_actors
|
40
44
|
@ruby = WarpingRuby.new(:x => width/2, :y => height/2)
|
41
|
-
@cursor1 =
|
42
|
-
|
43
|
-
|
44
|
-
@cursor2 =
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
@cursor1 = Cursor.new(:image => 'crosshair.png',
|
46
|
+
:keys => {MsLeft => [:click, false]},
|
47
|
+
:color => 0xff0099ff)
|
48
|
+
@cursor2 = Cursor.new(:image => 'crosshair.png',
|
49
|
+
:use_mouse => false,
|
50
|
+
:keys => {
|
51
|
+
KbSpace => [:click, false],
|
52
|
+
KbUp => :up,
|
53
|
+
KbDown => :down,
|
54
|
+
KbLeft => :left,
|
55
|
+
KbRight => :right},
|
56
|
+
:color => 0xff99ff00)
|
53
57
|
@cursor2.x = width*3/4
|
54
58
|
@cursor2.y = height/2
|
55
59
|
|
56
60
|
# Create a TextBox with default option :size => 15
|
57
|
-
@info =
|
58
|
-
@info.watch(@systems[
|
59
|
-
@info.watch(@systems[
|
61
|
+
@info = TextBox.new(:size => 15)
|
62
|
+
@info.watch(@systems[FpsSystem])
|
63
|
+
@info.watch(@systems[StalkerSystem])
|
60
64
|
# We can change the size for a specific line of text
|
61
65
|
@info.watch("@cursor1 data:", :size => 20)
|
62
66
|
# Color too
|
@@ -1,13 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
LIB_PATH = File.join(File.dirname(__FILE__), '..', '..', 'lib', 'lotu.rb')
|
3
3
|
require File.expand_path(LIB_PATH)
|
4
|
+
|
4
5
|
include Gosu::Button
|
6
|
+
include Lotu
|
5
7
|
|
6
|
-
class SteeringRuby <
|
8
|
+
class SteeringRuby < Actor
|
7
9
|
def initialize(opts={})
|
8
10
|
super
|
9
11
|
set_image 'CptnRuby Gem.png'
|
10
|
-
use(
|
12
|
+
use(SteeringSystem, opts)
|
11
13
|
end
|
12
14
|
|
13
15
|
def warp(x, y)
|
@@ -15,7 +17,7 @@ class SteeringRuby < Lotu::Actor
|
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
|
-
class Example <
|
20
|
+
class Example < Game
|
19
21
|
def initialize
|
20
22
|
# This will call the hooks:
|
21
23
|
# load_resources, setup_systems and setup_actors
|
@@ -38,7 +40,9 @@ class Example < Lotu::Window
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def setup_systems
|
41
|
-
|
43
|
+
# It's important to call super here to setup the InputSystem
|
44
|
+
super
|
45
|
+
use(FpsSystem)
|
42
46
|
end
|
43
47
|
|
44
48
|
def setup_actors
|
@@ -49,16 +53,16 @@ class Example < Lotu::Window
|
|
49
53
|
@ruby2 = SteeringRuby.new
|
50
54
|
@ruby2.activate(:pursuit)
|
51
55
|
|
52
|
-
@cursor =
|
53
|
-
|
56
|
+
@cursor = Cursor.new(:image => 'crosshair.png',
|
57
|
+
:keys => {MsLeft => [:click, false]})
|
54
58
|
|
55
|
-
@window_info =
|
56
|
-
@window_info.watch(@systems[
|
59
|
+
@window_info = TextBox.new(:size => 15)
|
60
|
+
@window_info.watch(@systems[FpsSystem])
|
57
61
|
@window_info.watch(@cursor, :color => 0xffff0000)
|
58
62
|
@window_info.text("Click to start the simulation")
|
59
63
|
@window_info.text("One will pursuit while the other evades, right click to center evader on screen")
|
60
64
|
|
61
|
-
@ruby_info =
|
65
|
+
@ruby_info = TextBox.new(:attach_to => @ruby, :size => 14)
|
62
66
|
@ruby_info.watch(@ruby)
|
63
67
|
end
|
64
68
|
|
data/lib/lotu/actor.rb
CHANGED
@@ -1,37 +1,63 @@
|
|
1
1
|
module Lotu
|
2
2
|
class Actor
|
3
|
-
attr_accessor :parent, :x, :y, :systems
|
3
|
+
attr_accessor :parent, :x, :y, :systems,
|
4
|
+
:z, :angle, :center_x, :center_y,
|
5
|
+
:factor_x, :factor_y, :color, :mode, :image
|
4
6
|
|
5
7
|
include SystemUser
|
8
|
+
include Controllable
|
6
9
|
|
7
10
|
def initialize(opts={})
|
8
11
|
default_opts = {
|
9
12
|
:x => 0,
|
10
|
-
:y => 0
|
13
|
+
:y => 0,
|
14
|
+
:z => 0,
|
15
|
+
:angle => 0.0,
|
16
|
+
:center_x => 0.5,
|
17
|
+
:center_y => 0.5,
|
18
|
+
:factor_x => 1.0,
|
19
|
+
:factor_y => 1.0,
|
20
|
+
:color => 0xffffffff,
|
21
|
+
:mode => :default,
|
22
|
+
:parent => $lotu
|
11
23
|
}
|
12
24
|
@opts = default_opts.merge!(opts)
|
25
|
+
@image = nil
|
13
26
|
@x = @opts[:x]
|
14
27
|
@y = @opts[:y]
|
15
|
-
@
|
16
|
-
@
|
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]
|
37
|
+
@parent.manage_me(self)
|
38
|
+
@systems = {}
|
17
39
|
|
18
40
|
# Add extra functionality
|
19
|
-
self.extend Drawable
|
20
|
-
self.extend Controllable
|
21
41
|
self.extend Eventful
|
22
42
|
self.extend Collidable
|
23
|
-
|
24
|
-
@systems = {}
|
25
43
|
end
|
26
44
|
|
27
45
|
# Easy access to delta-time
|
28
46
|
def dt
|
29
|
-
$
|
47
|
+
$lotu.dt
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_image(image)
|
51
|
+
@image = @parent.image(image)
|
52
|
+
end
|
53
|
+
|
54
|
+
def unset_image
|
55
|
+
@image = nil
|
30
56
|
end
|
31
57
|
|
32
58
|
# Remove ourselves from the update queue
|
33
59
|
def die
|
34
|
-
@parent.
|
60
|
+
@parent.kill_me(self)
|
35
61
|
end
|
36
62
|
|
37
63
|
def update
|
@@ -40,7 +66,9 @@ module Lotu
|
|
40
66
|
end
|
41
67
|
end
|
42
68
|
|
43
|
-
def draw
|
69
|
+
def draw
|
70
|
+
@image.draw_rot(@x, @y, @z, @angle, @center_x, @center_y, @factor_x, @factor_y, @color, @mode) unless @image.nil?
|
71
|
+
end
|
44
72
|
|
45
73
|
end
|
46
74
|
end
|
@@ -2,14 +2,6 @@
|
|
2
2
|
module Lotu
|
3
3
|
module Controllable
|
4
4
|
|
5
|
-
def self.extended(instance)
|
6
|
-
instance.init_behavior
|
7
|
-
end
|
8
|
-
|
9
|
-
def init_behavior
|
10
|
-
@input_controller = nil
|
11
|
-
end
|
12
|
-
|
13
5
|
# This will call #go_up every game loop
|
14
6
|
# Gosu::Button::KbUp => :go_up
|
15
7
|
# This is the same as the above
|
@@ -21,7 +13,7 @@ module Lotu
|
|
21
13
|
# This will call #go_up every 50ms
|
22
14
|
# Gosu::Button::KbUp => [:go_up, 50]
|
23
15
|
def set_keys(keys)
|
24
|
-
@
|
16
|
+
@parent.systems[InputSystem].set_keys(self, keys)
|
25
17
|
end
|
26
18
|
|
27
19
|
end
|
data/lib/lotu/cursor.rb
CHANGED
@@ -8,13 +8,13 @@ module Lotu
|
|
8
8
|
default_opts = {
|
9
9
|
:use_mouse => true,
|
10
10
|
:speed => 100,
|
11
|
-
:x => $
|
12
|
-
:y => $
|
11
|
+
:x => $lotu.width/2,
|
12
|
+
:y => $lotu.height/2
|
13
13
|
}
|
14
14
|
opts = default_opts.merge!(opts)
|
15
15
|
super
|
16
|
-
$
|
17
|
-
$
|
16
|
+
$lotu.mouse_x = opts[:x]
|
17
|
+
$lotu.mouse_y = opts[:y]
|
18
18
|
@clicked_x = @clicked_y = 0
|
19
19
|
@speed = opts[:speed]
|
20
20
|
@use_mouse = opts[:use_mouse]
|
@@ -24,8 +24,8 @@ module Lotu
|
|
24
24
|
|
25
25
|
def update
|
26
26
|
if @use_mouse
|
27
|
-
@x = $
|
28
|
-
@y = $
|
27
|
+
@x = $lotu.mouse_x
|
28
|
+
@y = $lotu.mouse_y
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -40,8 +40,8 @@ module Lotu
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def adjust_mouse
|
43
|
-
$
|
44
|
-
$
|
43
|
+
$lotu.mouse_y = @y
|
44
|
+
$lotu.mouse_x = @x
|
45
45
|
end
|
46
46
|
|
47
47
|
def up
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Lotu
|
2
|
-
class
|
2
|
+
class Game < Gosu::Window
|
3
3
|
# Accessors for time delta, systems and fonts
|
4
4
|
attr_reader :dt, :systems, :fonts
|
5
5
|
# Accessors for queues
|
@@ -11,7 +11,7 @@ module Lotu
|
|
11
11
|
super(800, 600, false)
|
12
12
|
|
13
13
|
# Handy global window variable
|
14
|
-
$
|
14
|
+
$lotu = self
|
15
15
|
@debug = true
|
16
16
|
setup_containers
|
17
17
|
|
@@ -20,9 +20,6 @@ module Lotu
|
|
20
20
|
# Memoize fonts by size
|
21
21
|
@fonts = Hash.new{|h,k| h[k] = Gosu::Font.new(self, Gosu::default_font_name, k)}
|
22
22
|
|
23
|
-
# Add extra functionality
|
24
|
-
extend Controllable
|
25
|
-
|
26
23
|
# Call hook methods
|
27
24
|
load_resources
|
28
25
|
setup_systems
|
@@ -32,9 +29,12 @@ module Lotu
|
|
32
29
|
|
33
30
|
# Hook methods, these are meant to be replaced by subclasses
|
34
31
|
def load_resources;end
|
35
|
-
def setup_systems;end
|
36
32
|
def setup_actors;end
|
37
33
|
|
34
|
+
def setup_systems
|
35
|
+
use(InputSystem)
|
36
|
+
end
|
37
|
+
|
38
38
|
# Setup various containers
|
39
39
|
def setup_containers
|
40
40
|
# For systems
|
@@ -132,19 +132,19 @@ module Lotu
|
|
132
132
|
|
133
133
|
def load_images(path)
|
134
134
|
with_files(/\.png|\.jpg|\.bmp/, path) do |file_name, file_path|
|
135
|
-
@images[file_name] = Gosu::Image.new($
|
135
|
+
@images[file_name] = Gosu::Image.new($lotu, file_path)
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
139
|
def load_sounds(path)
|
140
140
|
with_files(/\.ogg|\.mp3|\.wav/, path) do |file_name, file_path|
|
141
|
-
@sounds[file_name] = Gosu::Sample.new($
|
141
|
+
@sounds[file_name] = Gosu::Sample.new($lotu, file_path)
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
145
145
|
def load_songs(path)
|
146
146
|
with_files(/\.ogg|\.mp3|\.wav/, path) do |file_name, file_path|
|
147
|
-
@songs[file_name] = Gosu::Song.new($
|
147
|
+
@songs[file_name] = Gosu::Song.new($lotu, file_path)
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
@@ -155,7 +155,7 @@ module Lotu
|
|
155
155
|
count = 0
|
156
156
|
Dir.entries(path).grep(regexp).each do |entry|
|
157
157
|
begin
|
158
|
-
@animations[entry] = klass.new($
|
158
|
+
@animations[entry] = klass.new($lotu, File.join(path, entry))
|
159
159
|
count += 1
|
160
160
|
rescue Exception => e
|
161
161
|
puts e, File.join(path, entry)
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Lotu
|
2
|
+
class InputSystem
|
3
|
+
|
4
|
+
def initialize(user, opts={})
|
5
|
+
user.extend UserMethods
|
6
|
+
# Current ongoing actions (button is being pushed)
|
7
|
+
@actions = []
|
8
|
+
@unique_actions = []
|
9
|
+
|
10
|
+
# Last time an action was executed (so we can implement some
|
11
|
+
# rate of fire)
|
12
|
+
@last_time_fired = Hash.new{|h,k| h[k] = Hash.new{|h,k| h[k] = 0}}
|
13
|
+
|
14
|
+
# Think of it like a reverse proxy
|
15
|
+
@reverse_register = Hash.new{|h,k| h[k] = []}
|
16
|
+
end
|
17
|
+
|
18
|
+
# If there are some actions currently going on, dispatch them
|
19
|
+
def update
|
20
|
+
@unique_actions.each do |client, action_name, rate|
|
21
|
+
client.send(action_name)
|
22
|
+
end.clear
|
23
|
+
|
24
|
+
@actions.each do |client, action_name, rate|
|
25
|
+
# action usually is a [:action_name, rate_of_fire] pair, for
|
26
|
+
# example: [:fire, 50] will call #fire every 50ms
|
27
|
+
time_now = Gosu.milliseconds
|
28
|
+
if @last_time_fired[client][action_name] + (rate || 0) < time_now
|
29
|
+
client.send(action_name)
|
30
|
+
@last_time_fired[client][action_name] = time_now
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def set_keys(client, keys)
|
36
|
+
keys.each do |key, action|
|
37
|
+
@reverse_register[key] << [client, action]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def button_down(key)
|
42
|
+
@reverse_register[key].each do |client, action|
|
43
|
+
action_name, rate = action
|
44
|
+
if rate == false
|
45
|
+
@unique_actions << [client, action_name, rate]
|
46
|
+
else
|
47
|
+
@actions << [client, action_name, rate]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def button_up(key)
|
53
|
+
@reverse_register[key].each do |client, action|
|
54
|
+
action_name, rate = action
|
55
|
+
@actions.delete [client, action_name, rate]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def draw;end
|
60
|
+
|
61
|
+
module UserMethods
|
62
|
+
def set_keys(keys)
|
63
|
+
systems[InputSystem].set_keys(self, keys)
|
64
|
+
end
|
65
|
+
|
66
|
+
def button_down(key)
|
67
|
+
systems[InputSystem].button_down(key)
|
68
|
+
end
|
69
|
+
|
70
|
+
def button_up(key)
|
71
|
+
systems[InputSystem].button_up(key)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -193,9 +193,9 @@ module Lotu
|
|
193
193
|
|
194
194
|
def draw
|
195
195
|
super
|
196
|
-
$
|
197
|
-
$
|
198
|
-
$
|
196
|
+
$lotu.draw_line(0, 0, 0xff999999, @pos.x, @pos.y, 0xff333333)
|
197
|
+
$lotu.draw_line(@pos.x, @pos.y, 0xffffffff, (@pos + @heading*50).x, (@pos+@heading*50).y, 0xffff0000)
|
198
|
+
$lotu.draw_line(@pos.x, @pos.y, 0xffffffff, @target.x, @target.y, 0xff00ff00) if @target
|
199
199
|
end
|
200
200
|
|
201
201
|
# to_s utility methods
|
data/lib/lotu/text_box.rb
CHANGED
@@ -13,9 +13,6 @@ module Lotu
|
|
13
13
|
@watch_list = []
|
14
14
|
@size = opts[:size]
|
15
15
|
@attached_to = opts[:attach_to]
|
16
|
-
# Since we aren't setting an image for this, we need to specify
|
17
|
-
# this actor needs to be drawed
|
18
|
-
draw_me
|
19
16
|
end
|
20
17
|
|
21
18
|
def text(text, opts={})
|
@@ -44,11 +41,11 @@ module Lotu
|
|
44
41
|
my_color = opts[:color] || @color
|
45
42
|
my_text = watched.to_s
|
46
43
|
if my_text.is_a?(String)
|
47
|
-
$
|
44
|
+
$lotu.fonts[my_size].draw(my_text, @x, @y + pos_y, @z, @factor_x, @factor_y, my_color)
|
48
45
|
pos_y += my_size
|
49
46
|
else
|
50
47
|
my_text.each do |line|
|
51
|
-
$
|
48
|
+
$lotu.fonts[my_size].draw(line, @x, @y + pos_y, @z, @factor_x, @factor_y, my_color)
|
52
49
|
pos_y += my_size
|
53
50
|
end
|
54
51
|
end
|
data/lib/lotu.rb
CHANGED
@@ -3,6 +3,6 @@ $LOAD_PATH.unshift(LOTU_ROOT)
|
|
3
3
|
|
4
4
|
require 'gosu'
|
5
5
|
%w{vector2d string}.each{|file| require "misc/#{file}"}
|
6
|
-
%w{system_user collidable controllable
|
7
|
-
%w{stalker_system fps_system collision_system steering_system}.each{|file| require "systems/#{file}"}
|
8
|
-
%w{
|
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}
|
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.
|
8
|
+
s.version = "0.1.10"
|
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-
|
12
|
+
s.date = %q{2010-03-26}
|
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 = [
|
@@ -49,19 +49,18 @@ Gem::Specification.new do |s|
|
|
49
49
|
"lib/lotu/actor.rb",
|
50
50
|
"lib/lotu/behaviors/collidable.rb",
|
51
51
|
"lib/lotu/behaviors/controllable.rb",
|
52
|
-
"lib/lotu/behaviors/controllable/input_controller.rb",
|
53
|
-
"lib/lotu/behaviors/drawable.rb",
|
54
52
|
"lib/lotu/behaviors/eventful.rb",
|
55
53
|
"lib/lotu/behaviors/system_user.rb",
|
56
54
|
"lib/lotu/cursor.rb",
|
55
|
+
"lib/lotu/game.rb",
|
57
56
|
"lib/lotu/misc/string.rb",
|
58
57
|
"lib/lotu/misc/vector2d.rb",
|
59
58
|
"lib/lotu/systems/collision_system.rb",
|
60
59
|
"lib/lotu/systems/fps_system.rb",
|
60
|
+
"lib/lotu/systems/input_system.rb",
|
61
61
|
"lib/lotu/systems/stalker_system.rb",
|
62
62
|
"lib/lotu/systems/steering_system.rb",
|
63
63
|
"lib/lotu/text_box.rb",
|
64
|
-
"lib/lotu/window.rb",
|
65
64
|
"lotu.gemspec",
|
66
65
|
"test/actor_test.rb"
|
67
66
|
]
|
data/test/actor_test.rb
CHANGED
@@ -12,7 +12,7 @@ Protest.report_with(:documentation)
|
|
12
12
|
|
13
13
|
Protest.context('An Actor') do
|
14
14
|
setup do
|
15
|
-
$
|
15
|
+
$lotu = Lotu::Window.new
|
16
16
|
@actor = Lotu::Actor.new
|
17
17
|
end
|
18
18
|
|
@@ -32,14 +32,14 @@ Protest.context('An Actor') do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'has a window reference.' do
|
35
|
-
assert_equal $
|
35
|
+
assert_equal $lotu, @actor.parent
|
36
36
|
end
|
37
37
|
|
38
38
|
# some context...
|
39
39
|
#
|
40
40
|
context 'when dying' do
|
41
41
|
it 'removes itself from Window update_queue.' do
|
42
|
-
mock.proxy($
|
42
|
+
mock.proxy($lotu.update_queue).delete(@actor)
|
43
43
|
@actor.die
|
44
44
|
end
|
45
45
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 10
|
9
|
+
version: 0.1.10
|
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-
|
17
|
+
date: 2010-03-26 00:00:00 -06:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -73,19 +73,18 @@ files:
|
|
73
73
|
- lib/lotu/actor.rb
|
74
74
|
- lib/lotu/behaviors/collidable.rb
|
75
75
|
- lib/lotu/behaviors/controllable.rb
|
76
|
-
- lib/lotu/behaviors/controllable/input_controller.rb
|
77
|
-
- lib/lotu/behaviors/drawable.rb
|
78
76
|
- lib/lotu/behaviors/eventful.rb
|
79
77
|
- lib/lotu/behaviors/system_user.rb
|
80
78
|
- lib/lotu/cursor.rb
|
79
|
+
- lib/lotu/game.rb
|
81
80
|
- lib/lotu/misc/string.rb
|
82
81
|
- lib/lotu/misc/vector2d.rb
|
83
82
|
- lib/lotu/systems/collision_system.rb
|
84
83
|
- lib/lotu/systems/fps_system.rb
|
84
|
+
- lib/lotu/systems/input_system.rb
|
85
85
|
- lib/lotu/systems/stalker_system.rb
|
86
86
|
- lib/lotu/systems/steering_system.rb
|
87
87
|
- lib/lotu/text_box.rb
|
88
|
-
- lib/lotu/window.rb
|
89
88
|
- lotu.gemspec
|
90
89
|
- test/actor_test.rb
|
91
90
|
- TODO
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module Lotu
|
2
|
-
class InputController
|
3
|
-
attr_accessor :subject, :keys
|
4
|
-
|
5
|
-
def initialize(subject, keys)
|
6
|
-
# The subject being controlled
|
7
|
-
@subject = subject
|
8
|
-
|
9
|
-
# Key mappings {Gosu::Button::KbEscape => :quit, ...}
|
10
|
-
@keys = keys
|
11
|
-
|
12
|
-
# Current ongoing actions (button is being pushed)
|
13
|
-
@actions = []
|
14
|
-
@once_actions = []
|
15
|
-
|
16
|
-
# Last time an action was executed (so we can implement some
|
17
|
-
# rate of fire)
|
18
|
-
@executed_at = {}
|
19
|
-
|
20
|
-
# Register this controller with the main window
|
21
|
-
$window.register_for_input(self)
|
22
|
-
end
|
23
|
-
|
24
|
-
# If there are some actions currently going on, dispatch them
|
25
|
-
def update
|
26
|
-
@once_actions.each do |action_name, rate|
|
27
|
-
@subject.send(action_name)
|
28
|
-
end.clear
|
29
|
-
|
30
|
-
@actions.each do |action_name, rate|
|
31
|
-
# action usually is a [:action_name, rate_of_fire] pair, for
|
32
|
-
# example: [:fire, 50] will call #fire every 50ms
|
33
|
-
time_now = Gosu.milliseconds
|
34
|
-
if @executed_at[action_name] + (rate || 0) < time_now
|
35
|
-
@executed_at[action_name] = time_now
|
36
|
-
@subject.send(action_name)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def button_down(id)
|
42
|
-
action_name, rate = @keys[id]
|
43
|
-
@executed_at[action_name] ||= 0
|
44
|
-
if rate == false
|
45
|
-
@once_actions << @keys[id]
|
46
|
-
else
|
47
|
-
@actions << @keys[id]
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def button_up(id)
|
52
|
-
@actions.delete(@keys[id])
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
module Lotu
|
2
|
-
module Drawable
|
3
|
-
|
4
|
-
def self.extended(instance)
|
5
|
-
instance.init_behavior
|
6
|
-
end
|
7
|
-
|
8
|
-
def init_behavior
|
9
|
-
class << self
|
10
|
-
attr_accessor :z, :angle, :center_x, :center_y,
|
11
|
-
:factor_x, :factor_y, :color, :mode
|
12
|
-
end
|
13
|
-
|
14
|
-
default_opts = {
|
15
|
-
:z => 0,
|
16
|
-
:angle => 0.0,
|
17
|
-
:center_x => 0.5,
|
18
|
-
:center_y => 0.5,
|
19
|
-
:factor_x => 1.0,
|
20
|
-
:factor_y => 1.0,
|
21
|
-
:color => 0xffffffff,
|
22
|
-
:mode => :default
|
23
|
-
}
|
24
|
-
@opts = default_opts.merge!(@opts)
|
25
|
-
|
26
|
-
@image = nil
|
27
|
-
@z = @opts[:z]
|
28
|
-
@angle = @opts[:angle]
|
29
|
-
@center_x = @opts[:center_x]
|
30
|
-
@center_y = @opts[:center_y]
|
31
|
-
@factor_x = @opts[:factor_x]
|
32
|
-
@factor_y = @opts[:factor_y]
|
33
|
-
@color = @opts[:color]
|
34
|
-
@mode = @opts[:mode]
|
35
|
-
end
|
36
|
-
|
37
|
-
def draw_me
|
38
|
-
@parent.draw_queue << self unless @parent.draw_queue.include?(self)
|
39
|
-
end
|
40
|
-
|
41
|
-
def image
|
42
|
-
@image
|
43
|
-
end
|
44
|
-
|
45
|
-
def set_image(image)
|
46
|
-
@image = @parent.image(image)
|
47
|
-
draw_me
|
48
|
-
end
|
49
|
-
|
50
|
-
def draw
|
51
|
-
super
|
52
|
-
@image.draw_rot(@x, @y, @z, @angle, @center_x, @center_y, @factor_x, @factor_y, @color, @mode) unless @image.nil?
|
53
|
-
end
|
54
|
-
|
55
|
-
def die
|
56
|
-
super
|
57
|
-
@parent.draw_queue.delete(self)
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|