chingu 0.7.5 → 0.7.6
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/README.rdoc +60 -14
- data/Rakefile +1 -1
- data/chingu.gemspec +16 -6
- data/examples/example14_bounding_box_circle.rb +8 -1
- data/examples/{example19_game_objects.yml → example19.yml} +1014 -4
- data/examples/example19_edit_viewport.rb +34 -8
- data/examples/example21.yml +2145 -0
- data/examples/example21_sidescroller_with_edit.rb +298 -0
- data/examples/game_of_life.rb +3 -3
- data/examples/media/battery.png +0 -0
- data/examples/media/big_star.png +0 -0
- data/examples/media/big_stone_wall.bmp +0 -0
- data/examples/media/black_block.png +0 -0
- data/examples/media/cog_wheel.png +0 -0
- data/examples/media/saw.png +0 -0
- data/examples/media/tube.png +0 -0
- data/lib/chingu.rb +1 -1
- data/lib/chingu/animation.rb +8 -3
- data/lib/chingu/basic_game_object.rb +3 -1
- data/lib/chingu/game_object.rb +23 -11
- data/lib/chingu/game_state.rb +11 -0
- data/lib/chingu/game_states/edit.rb +405 -137
- data/lib/chingu/helpers/game_object.rb +15 -9
- data/lib/chingu/input.rb +2 -2
- data/lib/chingu/traits/animation.rb +5 -4
- data/lib/chingu/traits/bounding_box.rb +9 -4
- data/lib/chingu/traits/bounding_circle.rb +2 -0
- data/lib/chingu/traits/collision_detection.rb +32 -16
- data/lib/chingu/traits/velocity.rb +37 -19
- data/lib/chingu/traits/viewport.rb +1 -0
- data/lib/chingu/viewport.rb +10 -5
- metadata +18 -8
@@ -52,21 +52,23 @@ module Chingu
|
|
52
52
|
# Creates game objects from a Chingu-spezed game objects file (created with game state 'Edit')
|
53
53
|
#
|
54
54
|
def load_game_objects(options = {})
|
55
|
-
file = options[:file] ||
|
55
|
+
file = options[:file] || self.filename + ".yml"
|
56
56
|
debug = options[:debug]
|
57
|
+
except = Array(options[:except]) || []
|
57
58
|
|
58
59
|
require 'yaml'
|
59
60
|
|
60
61
|
puts "* Loading game objects from #{file}" if debug
|
61
62
|
if File.exists?(file)
|
62
|
-
|
63
|
-
|
64
|
-
|
63
|
+
objects = YAML.load_file(file)
|
64
|
+
objects.each do |object|
|
65
|
+
object.each_pair do |klassname, attributes|
|
65
66
|
begin
|
66
67
|
klass = Kernel::const_get(klassname)
|
67
|
-
unless klass.class == "GameObject"
|
68
|
+
unless klass.class == "GameObject" && !except.include?(klass)
|
68
69
|
puts "Creating #{klassname.to_s}: #{attributes.to_s}" if debug
|
69
|
-
klass.create(attributes)
|
70
|
+
object = klass.create(attributes)
|
71
|
+
object.options[:created_with_editor] = true if object.options
|
70
72
|
end
|
71
73
|
rescue
|
72
74
|
puts "Couldn't create class '#{klassname}'"
|
@@ -74,6 +76,7 @@ module Chingu
|
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
79
|
+
self.game_objects.sync
|
77
80
|
end
|
78
81
|
|
79
82
|
#
|
@@ -91,7 +94,8 @@ module Chingu
|
|
91
94
|
require 'yaml'
|
92
95
|
objects = []
|
93
96
|
game_objects.each do |game_object|
|
94
|
-
|
97
|
+
# Only save specified classes, if given.
|
98
|
+
next if classes and !classes.empty? and !classes.include?(game_object.class)
|
95
99
|
|
96
100
|
objects << {game_object.class.to_s =>
|
97
101
|
{
|
@@ -99,8 +103,10 @@ module Chingu
|
|
99
103
|
:y => game_object.y,
|
100
104
|
:angle => game_object.angle,
|
101
105
|
:zorder => game_object.zorder,
|
102
|
-
|
103
|
-
|
106
|
+
:factor_x => game_object.factor_x,
|
107
|
+
:factor_y => game_object.factor_y,
|
108
|
+
:color => game_object.color.argb,
|
109
|
+
#:color => sprintf("0x%x",game_object.color.argb)
|
104
110
|
#:center_x => game_object.center_x,
|
105
111
|
#:center_y => game_object.center_y,
|
106
112
|
}
|
data/lib/chingu/input.rb
CHANGED
@@ -53,10 +53,10 @@ module Chingu
|
|
53
53
|
KbLeftShift => [:left_shift, :lshift],
|
54
54
|
|
55
55
|
|
56
|
-
KbNumpadAdd => [:"+", :add],
|
56
|
+
KbNumpadAdd => [:"+", :add, :plus],
|
57
57
|
KbNumpadDivide => [:"/", :divide],
|
58
58
|
KbNumpadMultiply => [:"*", :multiply],
|
59
|
-
KbNumpadSubtract => [:"-", :subtract],
|
59
|
+
KbNumpadSubtract => [:"-", :subtract, :minus],
|
60
60
|
KbPageDown => [:page_down],
|
61
61
|
KbPageUp => [:page_up],
|
62
62
|
# KbPause => [:pause],
|
@@ -54,16 +54,17 @@ module Chingu
|
|
54
54
|
#
|
55
55
|
def load_animations
|
56
56
|
animations = {}
|
57
|
-
glob = "#{trait_options[:animation][:directory]}/#{self.filename}
|
57
|
+
glob = "#{trait_options[:animation][:directory]}/#{self.filename}*"
|
58
58
|
puts "Animations? #{glob}" if trait_options[:animation][:debug]
|
59
59
|
Dir[glob].each do |tile_file|
|
60
|
-
|
60
|
+
puts tile_file if trait_options[:animation][:debug]
|
61
61
|
if tile_file =~ /[a-zA-Z\_+]_*(\d+)x(\d+)_*([a-zA-Z]*)\.(bmp|png)/
|
62
|
-
#if tile_file =~ /_*([a-zA-Z]*)\.(bmp|png)\Z/
|
63
|
-
#if tile_file =~ /#{self.filename}\.(bmp|png)/
|
64
62
|
state = $3.length > 0 ? $3 : "default"
|
65
63
|
animations[state.to_sym] = Chingu::Animation.new(trait_options[:animation].merge(:file => tile_file))
|
64
|
+
elsif tile_file =~ /[a-zA-Z\_+]\.(bmp|png)/
|
65
|
+
animations[:default] = Chingu::Animation.new(trait_options[:animation].merge(:file => tile_file))
|
66
66
|
end
|
67
|
+
|
67
68
|
end
|
68
69
|
return animations
|
69
70
|
end
|
@@ -26,6 +26,8 @@ module Chingu
|
|
26
26
|
# x, y, factor_x, factor_y and rotation_center
|
27
27
|
#
|
28
28
|
module BoundingBox
|
29
|
+
CENTER_TO_FACTOR = { 0 => -1, 0.5 => 0, 1 => 1 }
|
30
|
+
attr_accessor :collidable
|
29
31
|
|
30
32
|
module ClassMethods
|
31
33
|
def initialize_trait(options = {})
|
@@ -35,6 +37,7 @@ module Chingu
|
|
35
37
|
|
36
38
|
def setup_trait(options)
|
37
39
|
@cached_bounding_box = nil
|
40
|
+
@collidable = true
|
38
41
|
super
|
39
42
|
end
|
40
43
|
|
@@ -60,10 +63,12 @@ module Chingu
|
|
60
63
|
width = width * trait_options[:bounding_box][:scale]
|
61
64
|
height = height * trait_options[:bounding_box][:scale]
|
62
65
|
end
|
63
|
-
|
64
|
-
x = self.x -
|
65
|
-
y = self.y -
|
66
|
-
|
66
|
+
|
67
|
+
x = self.x - width * self.center_x
|
68
|
+
y = self.y - height * self.center_y
|
69
|
+
x += width * CENTER_TO_FACTOR[self.center_x] if self.factor_x < 0
|
70
|
+
y += height * CENTER_TO_FACTOR[self.center_y] if self.factor_y < 0
|
71
|
+
|
67
72
|
return Rect.new(x, y, width, height)
|
68
73
|
end
|
69
74
|
alias :bb :bounding_box
|
@@ -28,6 +28,7 @@ module Chingu
|
|
28
28
|
# ...this usually only makes sense with rotation_center = :center
|
29
29
|
#
|
30
30
|
module BoundingCircle
|
31
|
+
attr_accessor :collidable
|
31
32
|
|
32
33
|
module ClassMethods
|
33
34
|
def initialize_trait(options = {})
|
@@ -37,6 +38,7 @@ module Chingu
|
|
37
38
|
|
38
39
|
def setup_trait(options)
|
39
40
|
@cached_radius = nil
|
41
|
+
@collidable = true
|
40
42
|
super
|
41
43
|
end
|
42
44
|
|
@@ -33,6 +33,7 @@ module Chingu
|
|
33
33
|
# radius - a number
|
34
34
|
#
|
35
35
|
module CollisionDetection
|
36
|
+
attr_accessor :collidable
|
36
37
|
|
37
38
|
module ClassMethods
|
38
39
|
def initialize_trait(options = {})
|
@@ -40,6 +41,11 @@ module Chingu
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
44
|
+
def setup_trait(options)
|
45
|
+
@collidable = true
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
43
49
|
#
|
44
50
|
# The standard method called when self needs to be checked for a collision with another object
|
45
51
|
# By default it calls bounding_box_collision? which will check for intersectons between the
|
@@ -61,6 +67,7 @@ module Chingu
|
|
61
67
|
# Returns true if colliding.
|
62
68
|
#
|
63
69
|
def bounding_box_collision?(object2)
|
70
|
+
return false unless self.collidable && object2.collidable
|
64
71
|
self.bounding_box.collide_rect?(object2.bounding_box)
|
65
72
|
end
|
66
73
|
|
@@ -69,6 +76,7 @@ module Chingu
|
|
69
76
|
# Returns true if colliding.
|
70
77
|
#
|
71
78
|
def bounding_circle_collision?(object2)
|
79
|
+
return false unless self.collidable && object2.collidable
|
72
80
|
Gosu.distance(self.x, self.y, object2.x, object2.y) < self.radius + object2.radius
|
73
81
|
end
|
74
82
|
|
@@ -78,6 +86,8 @@ module Chingu
|
|
78
86
|
# http://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection
|
79
87
|
#
|
80
88
|
def bounding_box_bounding_circle_collision?(object2)
|
89
|
+
return false unless self.collidable && object2.collidable
|
90
|
+
|
81
91
|
rect = self.respond_to?(:bounding_box) ? self.bounding_box : object2.bounding_box
|
82
92
|
circle = self.respond_to?(:radius) ? self : object2
|
83
93
|
radius = circle.radius.to_i
|
@@ -101,7 +111,7 @@ module Chingu
|
|
101
111
|
#
|
102
112
|
def each_collision(*klasses)
|
103
113
|
Array(klasses).each do |klass|
|
104
|
-
klass.all.each do |object|
|
114
|
+
(klass.respond_to?(:all) ? klass.all : klass).each do |object|
|
105
115
|
yield(self, object) if collides?(object)
|
106
116
|
end
|
107
117
|
end
|
@@ -109,7 +119,7 @@ module Chingu
|
|
109
119
|
|
110
120
|
def first_collision(*klasses)
|
111
121
|
Array(klasses).each do |klass|
|
112
|
-
klass.all.each do |object|
|
122
|
+
(klass.respond_to?(:all) ? klass.all : klass).each do |object|
|
113
123
|
return object if collides?(object)
|
114
124
|
end
|
115
125
|
end
|
@@ -122,7 +132,8 @@ module Chingu
|
|
122
132
|
#
|
123
133
|
def each_bounding_circle_collision(*klasses)
|
124
134
|
Array(klasses).each do |klass|
|
125
|
-
klass.all.each do |object|
|
135
|
+
(klass.respond_to?(:all) ? klass.all : klass).each do |object|
|
136
|
+
next unless self.collidable && object.collidable
|
126
137
|
yield(self, object) if Gosu.distance(self.x, self.y, object.x, object.y) < self.radius + object.radius
|
127
138
|
end
|
128
139
|
end
|
@@ -134,7 +145,8 @@ module Chingu
|
|
134
145
|
#
|
135
146
|
def each_bounding_box_collision(*klasses)
|
136
147
|
Array(klasses).each do |klass|
|
137
|
-
klass.all.each do |object|
|
148
|
+
(klass.respond_to?(:all) ? klass.all : klass).each do |object|
|
149
|
+
return false unless self.collidable && object.collidable
|
138
150
|
yield(self, object) if self.bounding_box.collide_rect?(object.bounding_box)
|
139
151
|
end
|
140
152
|
end
|
@@ -147,12 +159,13 @@ module Chingu
|
|
147
159
|
#
|
148
160
|
def each_bounding_circle_collision(*klasses)
|
149
161
|
Array(klasses).each do |klass|
|
150
|
-
object2_list = klass.all
|
162
|
+
object2_list = (klass.respond_to?(:all) ? klass.all : klass)
|
151
163
|
#total_radius = object1.radius + object2.radius # possible optimization?
|
152
164
|
|
153
165
|
self.all.each do |object1|
|
154
166
|
object2_list.each do |object2|
|
155
167
|
next if object1 == object2 # Don't collide objects with themselves
|
168
|
+
next unless object1.collidable && object2.collidable
|
156
169
|
yield object1, object2 if Gosu.distance(object1.x, object1.y, object2.x, object2.y) < object1.radius + object2.radius
|
157
170
|
end
|
158
171
|
end
|
@@ -164,10 +177,11 @@ module Chingu
|
|
164
177
|
#
|
165
178
|
def each_bounding_box_collision(*klasses)
|
166
179
|
Array(klasses).each do |klass|
|
167
|
-
object2_list = klass.all
|
180
|
+
object2_list = (klass.respond_to?(:all) ? klass.all : klass)
|
168
181
|
self.all.each do |object1|
|
169
182
|
object2_list.each do |object2|
|
170
183
|
next if object1 == object2 # Don't collide objects with themselves
|
184
|
+
next unless object1.collidable && object2.collidable
|
171
185
|
yield object1, object2 if object1.bounding_box.collide_rect?(object2.bounding_box)
|
172
186
|
end
|
173
187
|
end
|
@@ -189,18 +203,20 @@ module Chingu
|
|
189
203
|
# Make sure klasses is always an array.
|
190
204
|
Array(klasses).each do |klass|
|
191
205
|
|
192
|
-
if self.
|
193
|
-
self.
|
194
|
-
|
206
|
+
if self.respond_to?(:instance_methods) && klass.respond_to?(:instance_methods)
|
207
|
+
if self.instance_methods.include?(:radius) && klass.instance_methods.include?(:radius)
|
208
|
+
self.each_bounding_circle_collision(klass) do |o1, o2|
|
209
|
+
yield o1, o2
|
210
|
+
end
|
211
|
+
next
|
195
212
|
end
|
196
|
-
next
|
197
|
-
end
|
198
213
|
|
199
|
-
|
200
|
-
|
201
|
-
|
214
|
+
if self.instance_methods.include?(:bounding_box) && klass.instance_methods.include?(:bounding_box)
|
215
|
+
self.each_bounding_box_collision(klass) do |o1, o2|
|
216
|
+
yield o1, o2
|
217
|
+
end
|
218
|
+
next
|
202
219
|
end
|
203
|
-
next
|
204
220
|
end
|
205
221
|
|
206
222
|
#
|
@@ -217,7 +233,7 @@ module Chingu
|
|
217
233
|
# end
|
218
234
|
# end
|
219
235
|
#end
|
220
|
-
object2_list = klass.all
|
236
|
+
object2_list = (klass.respond_to?(:all) ? klass.all : klass)
|
221
237
|
self.all.each do |object1|
|
222
238
|
object2_list.each do |object2|
|
223
239
|
next if object1 == object2 # Don't collide objects with themselves
|
@@ -42,40 +42,40 @@ module Chingu
|
|
42
42
|
|
43
43
|
@velocity_x = options[:velocity_x] || 0
|
44
44
|
@velocity_y = options[:velocity_y] || 0
|
45
|
-
|
45
|
+
self.velocity = options[:velocity] if options[:velocity]
|
46
46
|
|
47
47
|
@acceleration_x = options[:acceleration_x] || 0
|
48
48
|
@acceleration_y = options[:acceleration_y] || 0
|
49
|
-
|
49
|
+
self.acceleration = options[:acceleration] if options[:acceleration]
|
50
50
|
|
51
51
|
@max_velocity = options[:max_velocity] || 1000
|
52
52
|
super
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
55
|
+
#
|
56
|
+
# Sets X and Y velocity with one single call. Takes an Array-argument with 2 values.
|
57
|
+
#
|
58
|
+
def velocity=(velocity)
|
59
|
+
@velocity_x, @velocity_y = velocity
|
60
|
+
end
|
61
61
|
|
62
|
-
|
62
|
+
def velocity; [@velocity_x, @velocity_y]; end
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
64
|
+
#
|
65
|
+
# Sets X and Y acceleration with one single call. Takes an Array-argument with 2 values.
|
66
|
+
#
|
67
|
+
def acceleration=(acceleration)
|
68
|
+
@acceleration_x, @acceleration_y = acceleration
|
69
|
+
end
|
70
70
|
|
71
|
-
|
71
|
+
def acceleration; [@acceleration_x, @acceleration_y]; end
|
72
72
|
|
73
73
|
#
|
74
74
|
# Modifies X & Y of parent
|
75
75
|
#
|
76
76
|
def update_trait
|
77
|
-
@velocity_y += @acceleration_y
|
78
|
-
@velocity_x += @acceleration_x
|
77
|
+
@velocity_y += @acceleration_y if (@velocity_y + @acceleration_y).abs < @max_velocity
|
78
|
+
@velocity_x += @acceleration_x if (@velocity_x + @acceleration_x).abs < @max_velocity
|
79
79
|
|
80
80
|
@previous_y = @y
|
81
81
|
@previous_x = @x
|
@@ -91,11 +91,29 @@ module Chingu
|
|
91
91
|
super
|
92
92
|
end
|
93
93
|
|
94
|
+
#
|
95
|
+
# Setts velocity_x and velocity_y to 0, stopping the game object
|
96
|
+
# Note it doesn't reset the acceleration!
|
97
|
+
#
|
94
98
|
def stop
|
95
99
|
# @acceleration_y = @acceleration_x = 0
|
96
100
|
@velocity_x = 0
|
97
101
|
@velocity_y = 0
|
98
|
-
end
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# Returns true if both velocity_x and velocity_y is 0
|
106
|
+
#
|
107
|
+
def stopped?
|
108
|
+
@velocity_x == 0 && @velocity_y == 0
|
109
|
+
end
|
110
|
+
|
111
|
+
#
|
112
|
+
# Did game object move last tick
|
113
|
+
#
|
114
|
+
def moved?
|
115
|
+
@x != @previous_x || @y != @previous_y
|
116
|
+
end
|
99
117
|
end
|
100
118
|
end
|
101
119
|
end
|
data/lib/chingu/viewport.rb
CHANGED
@@ -82,14 +82,15 @@ module Chingu
|
|
82
82
|
# This is a very flawed implementation, it Should take inte account objects
|
83
83
|
# height,width,factor_x,factor_y,center_x,center_y as well...
|
84
84
|
#
|
85
|
-
def inside?(object)
|
86
|
-
|
87
|
-
|
85
|
+
def inside?(object, y = nil)
|
86
|
+
x, y = y ? [object,y] : [object.x, object.y]
|
87
|
+
x >= @x && x <= (@x + $window.width) &&
|
88
|
+
y >= @y && y <= (@y + $window.height)
|
88
89
|
end
|
89
90
|
|
90
91
|
# Returns true object is outside the view port
|
91
|
-
def outside?(object)
|
92
|
-
not
|
92
|
+
def outside?(object, y)
|
93
|
+
not inside?(object, y)
|
93
94
|
end
|
94
95
|
|
95
96
|
#
|
@@ -145,5 +146,9 @@ module Chingu
|
|
145
146
|
end
|
146
147
|
end
|
147
148
|
|
149
|
+
def apply(&block)
|
150
|
+
$window.translate(-@x, -@y, &block)
|
151
|
+
end
|
152
|
+
|
148
153
|
end
|
149
154
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chingu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 7
|
9
|
-
-
|
10
|
-
version: 0.7.
|
9
|
+
- 6
|
10
|
+
version: 0.7.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- ippa
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-17 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -26,12 +26,12 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
29
|
+
hash: 47
|
30
30
|
segments:
|
31
31
|
- 0
|
32
32
|
- 7
|
33
|
-
-
|
34
|
-
version: 0.7.
|
33
|
+
- 22
|
34
|
+
version: 0.7.22
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
description: 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.
|
@@ -68,10 +68,12 @@ files:
|
|
68
68
|
- examples/example16_online_high_scores.rb
|
69
69
|
- examples/example17_gosu_tutorial.rb
|
70
70
|
- examples/example18_animation_trait.rb
|
71
|
+
- examples/example19.yml
|
71
72
|
- examples/example19_edit_viewport.rb
|
72
|
-
- examples/example19_game_objects.yml
|
73
73
|
- examples/example1_basics.rb
|
74
74
|
- examples/example20_trait_inheritence_test.rb
|
75
|
+
- examples/example21.yml
|
76
|
+
- examples/example21_sidescroller_with_edit.rb
|
75
77
|
- examples/example2_gamestate_basics.rb
|
76
78
|
- examples/example3_parallax.rb
|
77
79
|
- examples/example4_gamestates.rb
|
@@ -90,11 +92,16 @@ files:
|
|
90
92
|
- examples/media/Star.png
|
91
93
|
- examples/media/Starfighter.bmp
|
92
94
|
- examples/media/background1.png
|
95
|
+
- examples/media/battery.png
|
96
|
+
- examples/media/big_star.png
|
97
|
+
- examples/media/big_stone_wall.bmp
|
98
|
+
- examples/media/black_block.png
|
93
99
|
- examples/media/bullet.png
|
94
100
|
- examples/media/bullet_hit.wav
|
95
101
|
- examples/media/circle.png
|
96
102
|
- examples/media/city1.png
|
97
103
|
- examples/media/city2.png
|
104
|
+
- examples/media/cog_wheel.png
|
98
105
|
- examples/media/droid.bmp
|
99
106
|
- examples/media/droid_11x15.bmp
|
100
107
|
- examples/media/droid_11x15.gal
|
@@ -111,11 +118,13 @@ files:
|
|
111
118
|
- examples/media/ruby.png
|
112
119
|
- examples/media/saucer.gal
|
113
120
|
- examples/media/saucer.png
|
121
|
+
- examples/media/saw.png
|
114
122
|
- examples/media/spaceship.png
|
115
123
|
- examples/media/star_25x25_default.png
|
116
124
|
- examples/media/star_25x25_explode.gal
|
117
125
|
- examples/media/star_25x25_explode.png
|
118
126
|
- examples/media/stone_wall.bmp
|
127
|
+
- examples/media/tube.png
|
119
128
|
- examples/media/video_games.png
|
120
129
|
- examples/media/wood.png
|
121
130
|
- lib/chingu.rb
|
@@ -208,6 +217,7 @@ test_files:
|
|
208
217
|
- examples/example19_edit_viewport.rb
|
209
218
|
- examples/example1_basics.rb
|
210
219
|
- examples/example20_trait_inheritence_test.rb
|
220
|
+
- examples/example21_sidescroller_with_edit.rb
|
211
221
|
- examples/example2_gamestate_basics.rb
|
212
222
|
- examples/example3_parallax.rb
|
213
223
|
- examples/example4_gamestates.rb
|