chingu 0.8.0.5 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/benchmarks/array_vs_hash.rb +20 -0
- data/benchmarks/game_object_list_benchmark.rb +92 -0
- data/benchmarks/game_objects_benchmark.rb +48 -12
- data/benchmarks/lookup_benchmark.rb +9 -0
- data/benchmarks/trait_benchmark.rb +62 -0
- data/benchmarks/window_benchmark.rb +37 -0
- data/chingu.gemspec +10 -2
- data/examples/example17_gosu_tutorial.rb +3 -2
- data/examples/example21_sidescroller_with_edit.rb +6 -4
- data/examples/example23_chipmunk.rb +1 -0
- data/lib/chingu.rb +1 -1
- data/lib/chingu/animation.rb +2 -1
- data/lib/chingu/basic_game_object.rb +25 -9
- data/lib/chingu/game_object_list.rb +42 -26
- data/lib/chingu/game_object_map.rb +31 -8
- data/lib/chingu/helpers/game_object.rb +14 -0
- data/lib/chingu/traits/retrofy.rb +18 -10
- data/lib/chingu/traits/simple_sprite.rb +252 -0
- data/lib/chingu/traits/sprite.rb +22 -11
- data/spec/chingu/basic_game_object_spec.rb +27 -11
- data/spec/chingu/console_spec.rb +5 -1
- data/spec/chingu/game_object_list_spec.rb +19 -1
- data/spec/chingu/game_object_map_spec.rb +96 -0
- data/spec/chingu/game_object_spec.rb +2 -0
- metadata +11 -4
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'benchmark'
|
4
|
+
|
5
|
+
|
6
|
+
@array = []
|
7
|
+
@hash = {}
|
8
|
+
Benchmark.bm(22) do |x|
|
9
|
+
x.report('add/remove from array') { 100000.times { |nr| @array.push(nr); @array.delete(nr-1) if nr > 100 } }
|
10
|
+
x.report('add/remove from hash') { 100000.times { |nr| @hash[nr] = true; @hash.delete(nr-1) if nr > 100 } }
|
11
|
+
|
12
|
+
@array.clear
|
13
|
+
@hash.clear
|
14
|
+
x.report('add to array') { 100000.times { |nr| @array.push(nr) } }
|
15
|
+
x.report('add to hash') { 100000.times { |nr| @hash[nr] = true } }
|
16
|
+
|
17
|
+
x.report('array.each') { 100.times { |nr| @array.each { |x| x } } }
|
18
|
+
x.report('hash.each') { 100.times { |nr| @hash.each { |k,v| k } } }
|
19
|
+
x.report('hash.each_key') { 100.times { |nr| @hash.each_key { |x| x } } }
|
20
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'benchmark'
|
4
|
+
require File.join(File.dirname($0), "..", "lib", "chingu")
|
5
|
+
#gem 'chingu', '0.6'
|
6
|
+
#require 'chingu'
|
7
|
+
include Gosu
|
8
|
+
include Chingu
|
9
|
+
|
10
|
+
class MyGameObject < GameObject
|
11
|
+
end
|
12
|
+
|
13
|
+
class MyBasicGameObject < GameObject
|
14
|
+
end
|
15
|
+
|
16
|
+
class ObjectWithTraits < GameObject
|
17
|
+
traits :velocity, :timer
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
class Game < Chingu::Window
|
22
|
+
def initialize
|
23
|
+
super(600,200)
|
24
|
+
self.input = { :esc => :exit }
|
25
|
+
|
26
|
+
Benchmark.bm(22) do |x|
|
27
|
+
x.report('create 50000 game objects') { 50000.times { MyGameObject.create } }
|
28
|
+
x.report('force_update') { 60.times { $window.game_objects.force_update } }
|
29
|
+
x.report('force_draw') { 60.times { $window.game_objects.force_draw } }
|
30
|
+
x.report('update') { 60.times { $window.game_objects.update } }
|
31
|
+
x.report('draw') { 60.times { $window.game_objects.draw } }
|
32
|
+
x.report('update + create') { 60.times { $window.game_objects.update; MyGameObject.create; } }
|
33
|
+
x.report('draw + create') { 60.times { $window.game_objects.draw; MyGameObject.create; } }
|
34
|
+
x.report('update + create + destroy') { 60.times { $window.game_objects.update; MyGameObject.create; MyGameObject.all.first.destroy } }
|
35
|
+
x.report('draw + create + destroy') { 60.times { $window.game_objects.draw; MyGameObject.create; MyGameObject.all.first.destroy } }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
Game.new.show
|
41
|
+
|
42
|
+
#
|
43
|
+
# BEFORE GameObjectList visible_game_object/unpaused_game_object - refactor
|
44
|
+
#
|
45
|
+
#create 50000 game objects 1.919000 0.000000 1.919000 ( 1.906109)
|
46
|
+
#force_update 0.702000 0.000000 0.702000 ( 0.716041)
|
47
|
+
#force_draw 0.920000 0.000000 0.920000 ( 0.924053)
|
48
|
+
#update 1.420000 0.000000 1.420000 ( 1.421081)
|
49
|
+
#draw 1.497000 0.000000 1.497000 ( 1.520087)
|
50
|
+
#update + create 1.420000 0.000000 1.420000 ( 1.420081)
|
51
|
+
#draw + create 1.497000 0.000000 1.497000 ( 1.528088)
|
52
|
+
#update + create + destroy 2.106000 0.000000 2.106000 ( 2.099120)
|
53
|
+
#draw + create + destroy 2.262000 0.000000 2.262000 ( 2.265129)
|
54
|
+
|
55
|
+
#
|
56
|
+
# AFTER
|
57
|
+
#
|
58
|
+
#create 50000 game objects 1.934000 0.000000 1.934000 ( 1.927111)
|
59
|
+
#force_update 0.718000 0.000000 0.718000 ( 0.712040)
|
60
|
+
#force_draw 0.920000 0.000000 0.920000 ( 0.929053)
|
61
|
+
#update 0.702000 0.000000 0.702000 ( 0.708041)
|
62
|
+
#draw 0.904000 0.000000 0.904000 ( 0.932053)
|
63
|
+
#update + create 0.671000 0.000000 0.671000 ( 0.688040)
|
64
|
+
#draw + create 0.921000 0.000000 0.921000 ( 0.915052)
|
65
|
+
#update + create + destroy 1.950000 0.000000 1.950000 ( 1.957112)
|
66
|
+
#draw + create + destroy 2.184000 0.000000 2.184000 ( 2.230128)
|
67
|
+
|
68
|
+
#
|
69
|
+
# WITH HASH instead of ARRAY
|
70
|
+
#
|
71
|
+
#create 50000 game objects 0.733000 0.016000 0.749000 ( 0.737042)
|
72
|
+
#force_update 1.045000 0.000000 1.045000 ( 1.048060)
|
73
|
+
#force_draw 1.154000 0.000000 1.154000 ( 1.150065)
|
74
|
+
#update 1.014000 0.000000 1.014000 ( 1.028058)
|
75
|
+
#draw 1.139000 0.000000 1.139000 ( 1.152066)
|
76
|
+
#update + create 1.045000 0.000000 1.045000 ( 1.041060)
|
77
|
+
#draw + create 1.155000 0.000000 1.155000 ( 1.155066)
|
78
|
+
#update + create + destroy 1.529000 0.000000 1.529000 ( 1.525087)
|
79
|
+
#draw + create + destroy 1.653000 0.000000 1.653000 ( 1.661095)
|
80
|
+
|
81
|
+
|
82
|
+
#
|
83
|
+
# CONCLUSION
|
84
|
+
#
|
85
|
+
# Even when we're adding or destroying objects each game tick
|
86
|
+
# we benefit greatly from keeping separate draw and update lists
|
87
|
+
# instead of checking visible/paused flags in the draw/update loop itself
|
88
|
+
#
|
89
|
+
# Hash would be better then Array if we create/destroy tons of object.
|
90
|
+
# Arrays are faster to iterate through, which we do alot of gametick.
|
91
|
+
#
|
92
|
+
#
|
@@ -10,13 +10,28 @@ include Chingu
|
|
10
10
|
class ObjectX < GameObject; end;
|
11
11
|
class ObjectY < GameObject; end;
|
12
12
|
class ObjectZ < GameObject; end;
|
13
|
+
class ObjectWithTraits < GameObject
|
14
|
+
traits :velocity, :timer
|
15
|
+
end
|
16
|
+
|
17
|
+
class Test
|
18
|
+
@instances = []
|
19
|
+
class << self; attr_accessor :instances end
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
self.class.instances << self
|
23
|
+
end
|
24
|
+
end
|
13
25
|
|
14
26
|
class Game < Chingu::Window
|
15
27
|
def initialize
|
16
28
|
super(600,200)
|
17
|
-
self.input = { :esc => :exit }
|
18
|
-
|
29
|
+
self.input = { :esc => :exit }
|
30
|
+
end
|
31
|
+
|
32
|
+
def update
|
19
33
|
Benchmark.bm(22) do |x|
|
34
|
+
game_object = Test.new
|
20
35
|
game_object = GameObject.new
|
21
36
|
x.report('respond_to?') { 100000.times { game_object.respond_to?(:update_trait) } }
|
22
37
|
x.report('call empty method') { 100000.times { game_object.update_trait } }
|
@@ -25,20 +40,41 @@ class Game < Chingu::Window
|
|
25
40
|
game_objects.clear
|
26
41
|
x.report('basic_game_objects') { 10000.times { BasicGameObject.create } }
|
27
42
|
game_objects.clear
|
28
|
-
x.report('ObjectX') {
|
29
|
-
x.report('ObjectY') {
|
30
|
-
x.report('ObjectZ') {
|
31
|
-
|
32
|
-
|
33
|
-
x.report('
|
34
|
-
x.report('
|
35
|
-
|
43
|
+
x.report('ObjectX') { 100000.times { ObjectX.create } }
|
44
|
+
x.report('ObjectY') { 100000.times { ObjectY.create } }
|
45
|
+
x.report('ObjectZ') { 100000.times { ObjectZ.create } }
|
46
|
+
x.report('ObjectWithTraits') { 100000.times { ObjectWithTraits.create } }
|
47
|
+
|
48
|
+
x.report('ObjectX full update') { ObjectX.each { |x| x.update_trait; x.update; } }
|
49
|
+
x.report('ObjectWithTraits full update') { ObjectWithTraits.each { |x| x.update_trait; x.update; } }
|
50
|
+
|
51
|
+
x.report('ObjectX.each') { ObjectX.all.each { |x| x } }
|
52
|
+
x.report('ObjectY.each') { ObjectY.all.each { |y| y } }
|
53
|
+
x.report('ObjectZ.each') { ObjectZ.all.each { |z| z } }
|
54
|
+
|
55
|
+
|
36
56
|
p game_objects.size
|
37
|
-
x.report('ObjectX destroy') { ObjectX.each_with_index { |x, i| x.destroy if i%2==0 }; game_objects.sync; }
|
57
|
+
#x.report('ObjectX destroy') { ObjectX.each_with_index { |x, i| x.destroy if i%2==0 }; game_objects.sync; }
|
38
58
|
p game_objects.size
|
59
|
+
exit
|
39
60
|
end
|
40
|
-
|
41
61
|
end
|
42
62
|
end
|
43
63
|
|
44
64
|
Game.new.show
|
65
|
+
|
66
|
+
|
67
|
+
# user system total real
|
68
|
+
#respond_to? 0.015000 0.000000 0.015000 ( 0.016001)
|
69
|
+
#call empty method 0.016000 0.000000 0.016000 ( 0.013001)
|
70
|
+
#game_objects 0.327000 0.000000 0.327000 ( 0.329019)
|
71
|
+
#basic_game_objects 0.047000 0.000000 0.047000 ( 0.038002)
|
72
|
+
#ObjectX 0.312000 0.000000 0.312000 ( 0.314018)
|
73
|
+
#ObjectY 0.375000 0.000000 0.375000 ( 0.372021)
|
74
|
+
#ObjectZ 0.327000 0.000000 0.327000 ( 0.335020)
|
75
|
+
#ObjectWithTraits 0.484000 0.000000 0.484000 ( 0.484027)
|
76
|
+
#ObjectX full update 0.015000 0.000000 0.015000 ( 0.012001)
|
77
|
+
#ObjectWithTraits full update 0.032000 0.000000 0.032000 ( 0.034002)
|
78
|
+
#ObjectX.each 0.015000 0.000000 0.015000 ( 0.009000)
|
79
|
+
#ObjectY.each 0.000000 0.000000 0.000000 ( 0.010001)
|
80
|
+
#ObjectZ.each 0.016000 0.000000 0.016000 ( 0.009001)
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
|
3
|
+
Benchmark.bm(22) do |x|
|
4
|
+
@map = Array.new
|
5
|
+
@map[0] = Array.new
|
6
|
+
@map[0][0] = "item"
|
7
|
+
x.report('lookup fail exception') { 1000000.times { @map[0][10] rescue nil } }
|
8
|
+
x.report('lookup fail') { 1000000.times { @map[0] && @map[0][10] } }
|
9
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'benchmark'
|
4
|
+
require File.join(File.dirname($0), "..", "lib", "chingu")
|
5
|
+
include Gosu
|
6
|
+
include Chingu
|
7
|
+
|
8
|
+
# This includes trait :sprite
|
9
|
+
class SimpleGameObject < BasicGameObject
|
10
|
+
trait :simple_sprite
|
11
|
+
end
|
12
|
+
|
13
|
+
class ObjectX < GameObject
|
14
|
+
traits :velocity, :timer
|
15
|
+
end
|
16
|
+
|
17
|
+
class Test
|
18
|
+
@instances = []
|
19
|
+
class << self; attr_accessor :instances end
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
self.class.instances << self
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Game < Chingu::Window
|
27
|
+
def initialize
|
28
|
+
super(600,200)
|
29
|
+
self.input = { :esc => :exit }
|
30
|
+
|
31
|
+
Benchmark.bm(22) do |x|
|
32
|
+
#x.report('GameObject.destroy_all') { GameObject.destroy_all } # SLOW!
|
33
|
+
x.report('SimpleameObject.create') { 50000.times { SimpleGameObject.create } }
|
34
|
+
x.report('ClassicGameObject.create') { 50000.times { ClassicGameObject.create } }
|
35
|
+
x.report('GameObject.create') { 50000.times { GameObject.create } }
|
36
|
+
x.report('GameObject.create') { 50000.times { GameObject.create } }
|
37
|
+
x.report('GameObject.create') { 50000.times { GameObject.create } }
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
Game.new.show
|
45
|
+
|
46
|
+
|
47
|
+
# 50000 x GameObject
|
48
|
+
|
49
|
+
#
|
50
|
+
# With set_options()
|
51
|
+
# user system total real
|
52
|
+
#GameObject.create 1.825000 0.000000 1.825000 ( 1.824104)
|
53
|
+
#GameObject.create 2.044000 0.016000 2.060000 ( 2.083119)
|
54
|
+
#GameObject.create 1.934000 0.000000 1.934000 ( 1.996114)
|
55
|
+
|
56
|
+
#
|
57
|
+
# With oldschool option-parsing
|
58
|
+
#
|
59
|
+
# user system total real
|
60
|
+
#GameObject.create 0.577000 0.000000 0.577000 ( 0.574033)
|
61
|
+
#GameObject.create 0.577000 0.015000 0.592000 ( 0.599034)
|
62
|
+
#GameObject.create 0.624000 0.000000 0.624000 ( 0.623036)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'benchmark'
|
4
|
+
require File.join(File.dirname($0), "..", "lib", "chingu")
|
5
|
+
#gem 'chingu', '0.6'
|
6
|
+
#require 'chingu'
|
7
|
+
include Gosu
|
8
|
+
include Chingu
|
9
|
+
|
10
|
+
class MyGameObject < GameObject
|
11
|
+
end
|
12
|
+
|
13
|
+
class Player < GameObject
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
class Game < Chingu::Window
|
19
|
+
def initialize
|
20
|
+
super(600,200)
|
21
|
+
|
22
|
+
player = Player.create
|
23
|
+
|
24
|
+
|
25
|
+
Benchmark.bm(22) do |x|
|
26
|
+
x.report('create 10000 game objects') { 10000.times { MyGameObject.create } }
|
27
|
+
x.report('update') { 60.times { $window.update } }
|
28
|
+
|
29
|
+
self.input = { :esc => :exit, :d => :exit, :a => :exit }
|
30
|
+
player.input = { :holding_up => :exit, :holding_down => :exit, :holding_left => :exit, :holding_right => :exit, :space => :exit, :left_ctrl => :exit }
|
31
|
+
|
32
|
+
x.report('update window/player input') { 60.times { $window.update } }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
Game.new.show
|
data/chingu.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{chingu}
|
8
|
-
s.version = "0.8.
|
8
|
+
s.version = "0.8.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["ippa"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-08}
|
13
13
|
s.description = %q{OpenGL accelerated 2D game framework for Ruby. Builds on Gosu (Ruby/C++) which provides all the core functionality. Chingu adds simple yet powerful game states, prettier input handling, deployment safe asset-handling, a basic re-usable game object and stackable game logic.}
|
14
14
|
s.email = %q{ippa@rubylicio.us}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -23,15 +23,20 @@ Gem::Specification.new do |s|
|
|
23
23
|
"README.rdoc",
|
24
24
|
"Rakefile",
|
25
25
|
"benchmarks/README.txt",
|
26
|
+
"benchmarks/array_vs_hash.rb",
|
26
27
|
"benchmarks/arrays_bench.rb",
|
27
28
|
"benchmarks/benchmark.rb",
|
28
29
|
"benchmarks/benchmark3.rb",
|
29
30
|
"benchmarks/benchmark4.rb",
|
30
31
|
"benchmarks/benchmark5.rb",
|
31
32
|
"benchmarks/benchmark6.rb",
|
33
|
+
"benchmarks/game_object_list_benchmark.rb",
|
32
34
|
"benchmarks/game_objects_benchmark.rb",
|
35
|
+
"benchmarks/lookup_benchmark.rb",
|
33
36
|
"benchmarks/meta_benchmark.rb",
|
34
37
|
"benchmarks/meta_benchmark2.rb",
|
38
|
+
"benchmarks/trait_benchmark.rb",
|
39
|
+
"benchmarks/window_benchmark.rb",
|
35
40
|
"chingu.gemspec",
|
36
41
|
"examples/example10_traits_retrofy.rb",
|
37
42
|
"examples/example11_animation.rb",
|
@@ -155,6 +160,7 @@ Gem::Specification.new do |s|
|
|
155
160
|
"lib/chingu/traits/collision_detection.rb",
|
156
161
|
"lib/chingu/traits/effect.rb",
|
157
162
|
"lib/chingu/traits/retrofy.rb",
|
163
|
+
"lib/chingu/traits/simple_sprite.rb",
|
158
164
|
"lib/chingu/traits/sprite.rb",
|
159
165
|
"lib/chingu/traits/timer.rb",
|
160
166
|
"lib/chingu/traits/velocity.rb",
|
@@ -167,6 +173,7 @@ Gem::Specification.new do |s|
|
|
167
173
|
"spec/chingu/console_spec.rb",
|
168
174
|
"spec/chingu/fpscounter_spec.rb",
|
169
175
|
"spec/chingu/game_object_list_spec.rb",
|
176
|
+
"spec/chingu/game_object_map_spec.rb",
|
170
177
|
"spec/chingu/game_object_spec.rb",
|
171
178
|
"spec/chingu/game_state_manager_spec.rb",
|
172
179
|
"spec/chingu/helpers/input_client_spec.rb",
|
@@ -224,6 +231,7 @@ Gem::Specification.new do |s|
|
|
224
231
|
"spec/chingu/console_spec.rb",
|
225
232
|
"spec/chingu/fpscounter_spec.rb",
|
226
233
|
"spec/chingu/game_object_list_spec.rb",
|
234
|
+
"spec/chingu/game_object_map_spec.rb",
|
227
235
|
"spec/chingu/game_object_spec.rb",
|
228
236
|
"spec/chingu/game_state_manager_spec.rb",
|
229
237
|
"spec/chingu/helpers/input_client_spec.rb",
|
@@ -78,9 +78,10 @@ class Star < GameObject
|
|
78
78
|
trait :collision_detection
|
79
79
|
|
80
80
|
def initialize(options={})
|
81
|
-
super
|
82
|
-
@animation = Chingu::Animation.new(:file =>
|
81
|
+
super
|
82
|
+
@animation = Chingu::Animation.new(:file => "Star.png", :size => 25)
|
83
83
|
@image = @animation.next
|
84
|
+
self.zorder = 1
|
84
85
|
self.color = Gosu::Color.new(0xff000000)
|
85
86
|
self.color.red = rand(255 - 40) + 40
|
86
87
|
self.color.green = rand(255 - 40) + 40
|
@@ -10,8 +10,8 @@ include Chingu
|
|
10
10
|
#
|
11
11
|
class Game < Chingu::Window
|
12
12
|
def initialize
|
13
|
-
|
14
|
-
super(1024,768, true)
|
13
|
+
super(1000,700)
|
14
|
+
#super(1024,768, true)
|
15
15
|
end
|
16
16
|
|
17
17
|
def setup
|
@@ -89,7 +89,7 @@ class Droid < Chingu::GameObject
|
|
89
89
|
trait :bounding_box, :scale => 0.80
|
90
90
|
traits :timer, :collision_detection , :timer, :velocity
|
91
91
|
|
92
|
-
attr_reader :
|
92
|
+
attr_reader :jumping
|
93
93
|
|
94
94
|
def setup
|
95
95
|
self.input = { [:holding_left, :holding_a] => :holding_left,
|
@@ -110,8 +110,9 @@ class Droid < Chingu::GameObject
|
|
110
110
|
self.acceleration_y = 0.5
|
111
111
|
self.max_velocity = 10
|
112
112
|
self.rotation_center = :bottom_center
|
113
|
-
|
113
|
+
|
114
114
|
update
|
115
|
+
cache_bounding_box
|
115
116
|
end
|
116
117
|
|
117
118
|
def die
|
@@ -287,6 +288,7 @@ class Block < GameObject
|
|
287
288
|
def setup
|
288
289
|
@image = Image["black_block.png"]
|
289
290
|
@color = Color.new(0xff808080)
|
291
|
+
cache_bounding_box
|
290
292
|
end
|
291
293
|
end
|
292
294
|
|
data/lib/chingu.rb
CHANGED
data/lib/chingu/animation.rb
CHANGED
@@ -25,7 +25,8 @@ module Chingu
|
|
25
25
|
# - step: [steps] move animation forward [steps] frames each time we call #next
|
26
26
|
#
|
27
27
|
def initialize(options)
|
28
|
-
options = {:step => 1, :loop => true, :bounce => false, :width => 32, :height => 32, :index => 0, :delay => 100}.merge(options)
|
28
|
+
#options = {:step => 1, :loop => true, :bounce => false, :width => 32, :height => 32, :index => 0, :delay => 100}.merge(options)
|
29
|
+
options = {:step => 1, :loop => true, :bounce => false, :index => 0, :delay => 100}.merge(options)
|
29
30
|
|
30
31
|
@loop = options[:loop]
|
31
32
|
@bounce = options[:bounce]
|