chingu 0.7.0 → 0.7.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|