chingu 0.7.0 → 0.7.5
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/History.txt +1 -1
- data/README.rdoc +110 -49
- data/benchmarks/game_objects_benchmark.rb +50 -0
- data/chingu.gemspec +24 -12
- data/examples/example10_traits_retrofy.rb +6 -4
- data/examples/example11_animation.rb +14 -23
- data/examples/example12_trait_timer.rb +1 -1
- data/examples/example13_high_scores.rb +1 -1
- data/examples/example14_bounding_box_circle.rb +6 -10
- data/examples/example15_trait_timer2.rb +1 -1
- data/examples/example16_online_high_scores.rb +1 -1
- data/examples/example17_gosu_tutorial.rb +4 -4
- data/examples/example18_animation_trait.rb +98 -0
- data/examples/example19_edit_viewport.rb +223 -0
- data/examples/example19_game_objects.yml +1591 -0
- data/examples/example20_trait_inheritence_test.rb +58 -0
- data/examples/example3_parallax.rb +1 -1
- data/examples/example4_gamestates.rb +1 -1
- data/examples/example7_gfx_helpers.rb +14 -9
- data/examples/example8_traits.rb +4 -4
- data/examples/example9_collision_detection.rb +1 -1
- data/examples/game1.rb +33 -38
- data/examples/game_of_life.rb +291 -0
- data/examples/media/droid_11x15.bmp +0 -0
- data/examples/media/droid_11x15.gal +0 -0
- data/examples/media/heli.bmp +0 -0
- data/examples/media/heli.gal +0 -0
- data/examples/media/star_25x25_default.png +0 -0
- data/examples/media/star_25x25_explode.gal +0 -0
- data/examples/media/star_25x25_explode.png +0 -0
- data/examples/media/stone_wall.bmp +0 -0
- data/lib/chingu.rb +1 -1
- data/lib/chingu/animation.rb +78 -9
- data/lib/chingu/basic_game_object.rb +16 -8
- data/lib/chingu/game_object.rb +36 -7
- data/lib/chingu/game_object_list.rb +20 -3
- data/lib/chingu/game_state.rb +8 -7
- data/lib/chingu/game_states/edit.rb +177 -90
- data/lib/chingu/helpers/class_inheritable_accessor.rb +12 -5
- data/lib/chingu/helpers/game_object.rb +45 -4
- data/lib/chingu/helpers/gfx.rb +150 -172
- data/lib/chingu/helpers/input_client.rb +7 -0
- data/lib/chingu/inflector.rb +16 -2
- data/lib/chingu/traits/animation.rb +84 -0
- data/lib/chingu/traits/bounding_box.rb +16 -3
- data/lib/chingu/traits/bounding_circle.rb +18 -4
- data/lib/chingu/traits/collision_detection.rb +10 -1
- data/lib/chingu/traits/velocity.rb +26 -3
- data/lib/chingu/traits/viewport.rb +10 -9
- data/lib/chingu/viewport.rb +103 -22
- data/lib/chingu/window.rb +8 -2
- metadata +46 -16
- data/examples/example18_viewport.rb +0 -173
- data/examples/media/city1.csv +0 -2
- data/examples/media/plane.csv +0 -2
- data/examples/media/saucer.csv +0 -4
- data/examples/media/stickfigure.bmp +0 -0
- data/examples/media/stickfigure.png +0 -0
@@ -8,15 +8,15 @@ module Helpers
|
|
8
8
|
def self.included(base)
|
9
9
|
base.extend(ClassMethods)
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
module ClassMethods
|
13
13
|
def class_inheritable_accessor(*args)
|
14
14
|
@cattr_inheritable_attrs ||= [:cattr_inheritable_attrs]
|
15
15
|
@cattr_inheritable_attrs += args
|
16
16
|
args.each do |arg|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
class_eval %(
|
18
|
+
class << self; attr_accessor :#{arg} end
|
19
|
+
)
|
20
20
|
end
|
21
21
|
@cattr_inheritable_attrs
|
22
22
|
end
|
@@ -24,8 +24,15 @@ module Helpers
|
|
24
24
|
def inherited(subclass)
|
25
25
|
@cattr_inheritable_attrs.each do |inheritable_attribute|
|
26
26
|
instance_var = "@#{inheritable_attribute}"
|
27
|
-
subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
|
27
|
+
subclass.instance_variable_set(instance_var, instance_variable_get(instance_var).dup)
|
28
|
+
|
29
|
+
#if instance_var =~ /trait_options/
|
30
|
+
# puts "#{self.to_s} -> #{subclass.to_s}: #{instance_var}" # DEBUG
|
31
|
+
# puts instance_variable_get(instance_var)
|
32
|
+
# puts "------"
|
33
|
+
#end
|
28
34
|
end
|
35
|
+
super
|
29
36
|
end
|
30
37
|
end
|
31
38
|
end
|
@@ -52,18 +52,20 @@ 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
|
-
|
55
|
+
file = options[:file] || "#{self.class.to_s.downcase}.yml"
|
56
|
+
debug = options[:debug]
|
56
57
|
|
57
58
|
require 'yaml'
|
58
59
|
|
59
|
-
if
|
60
|
-
|
60
|
+
puts "* Loading game objects from #{file}" if debug
|
61
|
+
if File.exists?(file)
|
62
|
+
game_objects = YAML.load_file(file)
|
61
63
|
game_objects.each do |game_object|
|
62
64
|
game_object.each_pair do |klassname, attributes|
|
63
65
|
begin
|
64
66
|
klass = Kernel::const_get(klassname)
|
65
67
|
unless klass.class == "GameObject"
|
66
|
-
puts "Creating #{klassname.to_s}: #{attributes.to_s}"
|
68
|
+
puts "Creating #{klassname.to_s}: #{attributes.to_s}" if debug
|
67
69
|
klass.create(attributes)
|
68
70
|
end
|
69
71
|
rescue
|
@@ -73,6 +75,45 @@ module Chingu
|
|
73
75
|
end
|
74
76
|
end
|
75
77
|
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# Save given game_objects to a file. Hashoptions
|
81
|
+
#
|
82
|
+
# :file - a String, name of file to write to, default is current game_state class name.
|
83
|
+
# :game_objects - an Array, game objects to save
|
84
|
+
# :classes - an Array, save only game objects of theese classes
|
85
|
+
#
|
86
|
+
def save_game_objects(options = {})
|
87
|
+
file = options[:file] || "#{self.class.to_s.downcase}.yml"
|
88
|
+
game_objects = options[:game_objects]
|
89
|
+
classes = options[:classes]
|
90
|
+
|
91
|
+
require 'yaml'
|
92
|
+
objects = []
|
93
|
+
game_objects.each do |game_object|
|
94
|
+
next if classes and !classes.include?(game_object.class)
|
95
|
+
|
96
|
+
objects << {game_object.class.to_s =>
|
97
|
+
{
|
98
|
+
:x => game_object.x,
|
99
|
+
:y => game_object.y,
|
100
|
+
:angle => game_object.angle,
|
101
|
+
:zorder => game_object.zorder,
|
102
|
+
#:factor_x => game_object.factor_x,
|
103
|
+
#:factor_y => game_object.factor_y,
|
104
|
+
#:center_x => game_object.center_x,
|
105
|
+
#:center_y => game_object.center_y,
|
106
|
+
}
|
107
|
+
}
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
#Marshal.dump(previous_game_state.game_objects, File.open(@filename, "w"))
|
112
|
+
File.open(file, 'w') do |out|
|
113
|
+
YAML.dump(objects, out)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
76
117
|
|
77
118
|
end
|
78
119
|
|
data/lib/chingu/helpers/gfx.rb
CHANGED
@@ -1,173 +1,151 @@
|
|
1
|
-
#--
|
2
|
-
#
|
3
|
-
# Chingu -- OpenGL accelerated 2D game framework for Ruby
|
4
|
-
# Copyright (C) 2009 ippa / ippa@rubylicio.us
|
5
|
-
#
|
6
|
-
# This library is free software; you can redistribute it and/or
|
7
|
-
# modify it under the terms of the GNU Lesser General Public
|
8
|
-
# License as published by the Free Software Foundation; either
|
9
|
-
# version 2.1 of the License, or (at your option) any later version.
|
10
|
-
#
|
11
|
-
# This library is distributed in the hope that it will be useful,
|
12
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
-
# Lesser General Public License for more details.
|
15
|
-
#
|
16
|
-
# You should have received a copy of the GNU Lesser General Public
|
17
|
-
# License along with this library; if not, write to the Free Software
|
18
|
-
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
-
#
|
20
|
-
#++
|
21
|
-
|
22
|
-
module Chingu
|
23
|
-
module Helpers
|
24
|
-
|
25
|
-
#
|
26
|
-
# Various helper-methods to manipulate the screen.
|
27
|
-
# All drawings depend on the global variable $window which should be an instance of Gosu::Window or Chingu::Window
|
28
|
-
#
|
29
|
-
module GFX
|
30
|
-
|
31
|
-
#
|
32
|
-
# Fills whole window with specified 'color' and 'zorder'
|
33
|
-
#
|
34
|
-
#def fill(color, zorder = 0)
|
35
|
-
# $window.draw_quad(0, 0, color,
|
36
|
-
# $window.width, 0, color,
|
37
|
-
# $window.width, $window.height, color,
|
38
|
-
# 0, $window.height, color,
|
39
|
-
# zorder, :default)
|
40
|
-
#end
|
41
|
-
#
|
42
|
-
|
43
|
-
# Fills window or a given rect with a gradient between two colors.
|
44
|
-
#
|
45
|
-
# :from - Start with this color
|
46
|
-
# :to - End with this color
|
47
|
-
# :rect - Only fill rectangle :rect with the gradient, either a Rect-instance or [x,y,width,height] Array.
|
48
|
-
# :orientation - Either :vertical (top to bottom) or :horizontal (left to right)
|
49
|
-
#
|
50
|
-
|
51
|
-
def fill(options, zorder =
|
52
|
-
#
|
53
|
-
# if only 1 color-argument is given, assume fullscreen simple color fill.
|
54
|
-
#
|
55
|
-
if options.is_a?(Gosu::Color)
|
56
|
-
$window.draw_quad(0, 0, options,
|
57
|
-
$window.width, 0, options,
|
58
|
-
$window.width, $window.height, options,
|
59
|
-
0, $window.height, options,
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
rect
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
)
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
options = default_options.merge(options)
|
152
|
-
rect = Rect.new(options[:rect])
|
153
|
-
|
154
|
-
if options[:orientation] == :vertical
|
155
|
-
$window.draw_quad( rect.x, rect.y, options[:from],
|
156
|
-
rect.right, rect.y, options[:from],
|
157
|
-
rect.right, rect.bottom, options[:to],
|
158
|
-
rect.x, rect.bottom, options[:to],
|
159
|
-
options[:zorder], options[:mode]
|
160
|
-
)
|
161
|
-
else
|
162
|
-
$window.draw_quad( rect.x, rect.y, options[:from],
|
163
|
-
rect.x, rect.bottom, options[:from],
|
164
|
-
rect.right, rect.bottom, options[:to],
|
165
|
-
rect.right, rect.y, options[:to],
|
166
|
-
options[:zorder], options[:mode]
|
167
|
-
)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
end
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Chingu -- OpenGL accelerated 2D game framework for Ruby
|
4
|
+
# Copyright (C) 2009 ippa / ippa@rubylicio.us
|
5
|
+
#
|
6
|
+
# This library is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU Lesser General Public
|
8
|
+
# License as published by the Free Software Foundation; either
|
9
|
+
# version 2.1 of the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This library is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this library; if not, write to the Free Software
|
18
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
+
#
|
20
|
+
#++
|
21
|
+
|
22
|
+
module Chingu
|
23
|
+
module Helpers
|
24
|
+
|
25
|
+
#
|
26
|
+
# Various helper-methods to manipulate the screen.
|
27
|
+
# All drawings depend on the global variable $window which should be an instance of Gosu::Window or Chingu::Window
|
28
|
+
#
|
29
|
+
module GFX
|
30
|
+
|
31
|
+
#
|
32
|
+
# Fills whole window with specified 'color' and 'zorder'
|
33
|
+
#
|
34
|
+
#def fill(color, zorder = 0)
|
35
|
+
# $window.draw_quad(0, 0, color,
|
36
|
+
# $window.width, 0, color,
|
37
|
+
# $window.width, $window.height, color,
|
38
|
+
# 0, $window.height, color,
|
39
|
+
# zorder, :default)
|
40
|
+
#end
|
41
|
+
#
|
42
|
+
|
43
|
+
# Fills window or a given rect with a gradient between two colors.
|
44
|
+
#
|
45
|
+
# :from - Start with this color
|
46
|
+
# :to - End with this color
|
47
|
+
# :rect - Only fill rectangle :rect with the gradient, either a Rect-instance or [x,y,width,height] Array.
|
48
|
+
# :orientation - Either :vertical (top to bottom) or :horizontal (left to right)
|
49
|
+
#
|
50
|
+
|
51
|
+
def fill(options, zorder = 0)
|
52
|
+
#
|
53
|
+
# if only 1 color-argument is given, assume fullscreen simple color fill.
|
54
|
+
#
|
55
|
+
if options.is_a?(Gosu::Color)
|
56
|
+
$window.draw_quad(0, 0, options,
|
57
|
+
$window.width, 0, options,
|
58
|
+
$window.width, $window.height, options,
|
59
|
+
0, $window.height, options, zorder, :default)
|
60
|
+
else
|
61
|
+
fill_gradient(options)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# Draws an unfilled rect in given color
|
67
|
+
#
|
68
|
+
def draw_rect(rect, color, zorder)
|
69
|
+
$window.draw_line(rect.x, rect.y, color, rect.right, rect.y, color, zorder)
|
70
|
+
$window.draw_line(rect.right, rect.y, color, rect.right, rect.bottom, color, zorder)
|
71
|
+
$window.draw_line(rect.right, rect.bottom, color, rect.x, rect.bottom, color, zorder)
|
72
|
+
$window.draw_line(rect.x, rect.bottom, color, rect.x, rect.y, color, zorder)
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
#
|
77
|
+
# Draws an unfilled circle, thanks shawn24!
|
78
|
+
#
|
79
|
+
CIRCLE_STEP = 10
|
80
|
+
def draw_circle(cx,cy,r,color)
|
81
|
+
0.step(360, CIRCLE_STEP) do |a1|
|
82
|
+
a2 = a1 + CIRCLE_STEP
|
83
|
+
$window.draw_line cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r), cy + Gosu.offset_y(a2, r), color, 9999
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# Fills a given Rect 'rect' with Color 'color', drawing with zorder 'zorder'
|
89
|
+
#
|
90
|
+
def fill_rect(rect, color, zorder = 0)
|
91
|
+
rect = Rect.new(rect) # Make sure it's a rect
|
92
|
+
$window.draw_quad( rect.x, rect.y, color,
|
93
|
+
rect.right, rect.y, color,
|
94
|
+
rect.right, rect.bottom, color,
|
95
|
+
rect.x, rect.bottom, color,
|
96
|
+
zorder, :default)
|
97
|
+
end
|
98
|
+
|
99
|
+
#
|
100
|
+
# Fills window or a given rect with a gradient between two colors.
|
101
|
+
#
|
102
|
+
# :from - Start with this color
|
103
|
+
# :to - End with this color
|
104
|
+
# :rect - Only fill rectangle :rect with the gradient, either a Rect-instance or [x,y,width,height] Array.
|
105
|
+
# :orientation - Either :vertical (top to bottom) or :horizontal (left to right)
|
106
|
+
#
|
107
|
+
def fill_gradient(options)
|
108
|
+
default_options = { :from => Gosu::Color::BLACK,
|
109
|
+
:to => Gosu::Color::WHITE,
|
110
|
+
:thickness => 10,
|
111
|
+
:orientation => :vertical,
|
112
|
+
:rect => Rect.new([0, 0, $window.width, $window.height]),
|
113
|
+
:zorder => 0,
|
114
|
+
:mode => :default
|
115
|
+
}
|
116
|
+
options = default_options.merge(options)
|
117
|
+
|
118
|
+
rect = Rect.new(options[:rect])
|
119
|
+
colors = options[:colors] || options.values_at(:from, :to)
|
120
|
+
|
121
|
+
case options[:orientation]
|
122
|
+
when :vertical
|
123
|
+
rect.height /= colors.count - 1
|
124
|
+
colors.each_cons(2) do |from, to|
|
125
|
+
$window.draw_quad( rect.left, rect.top, from,
|
126
|
+
rect.right, rect.top, from,
|
127
|
+
rect.right, rect.bottom, to,
|
128
|
+
rect.left, rect.bottom, to,
|
129
|
+
options[:zorder], options[:mode]
|
130
|
+
)
|
131
|
+
rect.top += rect.height
|
132
|
+
end
|
133
|
+
when :horizontal
|
134
|
+
rect.width /= colors.count - 1
|
135
|
+
colors.each_cons(2) do |from, to|
|
136
|
+
$window.draw_quad( rect.left, rect.top, from,
|
137
|
+
rect.left, rect.bottom, from,
|
138
|
+
rect.right, rect.bottom, to,
|
139
|
+
rect.right, rect.top, to,
|
140
|
+
options[:zorder], options[:mode]
|
141
|
+
)
|
142
|
+
rect.left += rect.width
|
143
|
+
end
|
144
|
+
else
|
145
|
+
raise ArgumentError, "bad gradient orientation: #{options[:orientation]}"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
173
151
|
end
|
@@ -44,6 +44,13 @@ module Chingu
|
|
44
44
|
#
|
45
45
|
#
|
46
46
|
module InputClient
|
47
|
+
#
|
48
|
+
# Returns true or false depending on if the key is pressed
|
49
|
+
#
|
50
|
+
def holding?(key)
|
51
|
+
$window.button_down?(Chingu::Input::SYMBOL_TO_CONSTANT[key])
|
52
|
+
end
|
53
|
+
|
47
54
|
def input=(input_map)
|
48
55
|
@input ||= Hash.new
|
49
56
|
#@input = input_map
|
data/lib/chingu/inflector.rb
CHANGED
@@ -21,7 +21,11 @@
|
|
21
21
|
|
22
22
|
|
23
23
|
module Chingu
|
24
|
-
module Inflector
|
24
|
+
module Inflector
|
25
|
+
|
26
|
+
#
|
27
|
+
# "automatic_assets" -> "AutomaticAssets"
|
28
|
+
#
|
25
29
|
def Inflector.camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
|
26
30
|
if first_letter_in_uppercase
|
27
31
|
lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
@@ -29,6 +33,16 @@ module Chingu
|
|
29
33
|
lower_case_and_underscored_word.first.downcase + camelize(lower_case_and_underscored_word)[1..-1]
|
30
34
|
end
|
31
35
|
end
|
32
|
-
|
36
|
+
|
37
|
+
#
|
38
|
+
# "FireBall" -> "fire_ball"
|
39
|
+
#
|
40
|
+
def Inflector.underscore(camel_cased_word)
|
41
|
+
camel_cased_word.to_s.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
42
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
43
|
+
tr("-", "_").
|
44
|
+
downcase
|
45
|
+
end
|
46
|
+
|
33
47
|
end
|
34
48
|
end
|