chingu 0.5.5.3
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/History.txt +21 -0
- data/LICENSE +504 -0
- data/Manifest.txt +72 -0
- data/README.rdoc +588 -0
- data/Rakefile +19 -0
- data/benchmarks/README.txt +1 -0
- data/benchmarks/benchmark.rb +6 -0
- data/benchmarks/benchmark3.rb +23 -0
- data/benchmarks/benchmark4.rb +71 -0
- data/benchmarks/benchmark5.rb +91 -0
- data/benchmarks/benchmark6.rb +23 -0
- data/benchmarks/meta_benchmark.rb +67 -0
- data/benchmarks/meta_benchmark2.rb +39 -0
- data/chingu.gemspec +34 -0
- data/examples/example1.rb +37 -0
- data/examples/example10.rb +75 -0
- data/examples/example11.rb +51 -0
- data/examples/example12.rb +67 -0
- data/examples/example2.rb +115 -0
- data/examples/example3.rb +40 -0
- data/examples/example4.rb +175 -0
- data/examples/example5.rb +107 -0
- data/examples/example6.rb +57 -0
- data/examples/example7.rb +133 -0
- data/examples/example8.rb +109 -0
- data/examples/example9.rb +106 -0
- data/examples/media/Parallax-scroll-example-layer-0.png +0 -0
- data/examples/media/Parallax-scroll-example-layer-1.png +0 -0
- data/examples/media/Parallax-scroll-example-layer-2.png +0 -0
- data/examples/media/Parallax-scroll-example-layer-3.png +0 -0
- data/examples/media/background1.png +0 -0
- data/examples/media/fire_bullet.png +0 -0
- data/examples/media/fireball.png +0 -0
- data/examples/media/particle.png +0 -0
- data/examples/media/ruby.png +0 -0
- data/examples/media/spaceship.png +0 -0
- data/examples/media/stickfigure.bmp +0 -0
- data/examples/media/stickfigure.png +0 -0
- data/examples/media/video_games.png +0 -0
- data/lib/chingu.rb +32 -0
- data/lib/chingu/actor.rb +17 -0
- data/lib/chingu/animation.rb +142 -0
- data/lib/chingu/assets.rb +64 -0
- data/lib/chingu/basic_game_object.rb +132 -0
- data/lib/chingu/core_extensions.rb +53 -0
- data/lib/chingu/effects.rb +36 -0
- data/lib/chingu/fpscounter.rb +62 -0
- data/lib/chingu/game_object.rb +127 -0
- data/lib/chingu/game_object_list.rb +91 -0
- data/lib/chingu/game_state.rb +137 -0
- data/lib/chingu/game_state_manager.rb +284 -0
- data/lib/chingu/game_states/debug.rb +65 -0
- data/lib/chingu/game_states/fade_to.rb +91 -0
- data/lib/chingu/game_states/pause.rb +57 -0
- data/lib/chingu/gfx_helpers.rb +89 -0
- data/lib/chingu/helpers.rb +166 -0
- data/lib/chingu/inflector.rb +34 -0
- data/lib/chingu/input.rb +100 -0
- data/lib/chingu/named_resource.rb +254 -0
- data/lib/chingu/parallax.rb +83 -0
- data/lib/chingu/particle.rb +21 -0
- data/lib/chingu/rect.rb +612 -0
- data/lib/chingu/require_all.rb +133 -0
- data/lib/chingu/text.rb +56 -0
- data/lib/chingu/traits/collision_detection.rb +172 -0
- data/lib/chingu/traits/effect.rb +113 -0
- data/lib/chingu/traits/input.rb +38 -0
- data/lib/chingu/traits/retrofy.rb +53 -0
- data/lib/chingu/traits/rotation_center.rb +84 -0
- data/lib/chingu/traits/timer.rb +90 -0
- data/lib/chingu/traits/velocity.rb +67 -0
- data/lib/chingu/window.rb +170 -0
- metadata +162 -0
- metadata.gz.sig +1 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Chingu -- Game framework built on top of the opengl accelerated gamelib Gosu
|
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
|
+
|
23
|
+
#
|
24
|
+
# Effect-class
|
25
|
+
#
|
26
|
+
module Chingu
|
27
|
+
class Effect
|
28
|
+
def initialize(options)
|
29
|
+
super({:mode => :additive}.merge(options))
|
30
|
+
@trail = options[:trail] || 10
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Chingu -- Game framework built on top of the opengl accelerated gamelib Gosu
|
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
|
+
|
23
|
+
module Chingu
|
24
|
+
#
|
25
|
+
# Calculates a fps and a tick-time for use in update-calls
|
26
|
+
# register_tick() must be called every game loop iteration
|
27
|
+
#
|
28
|
+
class FPSCounter
|
29
|
+
attr_reader :fps, :milliseconds_since_last_tick, :ticks
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
@current_second = Gosu::milliseconds / 1000
|
33
|
+
@accum_fps = 0
|
34
|
+
@fps = 0
|
35
|
+
@ticks = 0
|
36
|
+
|
37
|
+
@milliseconds_since_last_tick = 0
|
38
|
+
@last_value = Gosu::milliseconds
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# This should be called once every game-iteration, preferable in update()
|
43
|
+
#
|
44
|
+
def register_tick
|
45
|
+
@accum_fps += 1
|
46
|
+
@ticks += 1
|
47
|
+
current_second = Gosu::milliseconds / 1000
|
48
|
+
if current_second != @current_second
|
49
|
+
@current_second = current_second
|
50
|
+
@fps = @accum_fps
|
51
|
+
@accum_fps = 0
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# Calculate how many milliseconds passed since last game loop iteration.
|
56
|
+
#
|
57
|
+
@milliseconds_since_last_tick = Gosu::milliseconds - @last_value
|
58
|
+
@last_value = Gosu::milliseconds
|
59
|
+
return @milliseconds_since_last_tick
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Chingu -- Game framework built on top of the opengl accelerated gamelib Gosu
|
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
|
+
|
23
|
+
module Chingu
|
24
|
+
#
|
25
|
+
# GameObject is our BasisGameObject (class with framespecific stuff)
|
26
|
+
#
|
27
|
+
# On top of that, it encapsulates GOSUs Image#draw_rot and all its parameters.
|
28
|
+
#
|
29
|
+
class GameObject < Chingu::BasicGameObject
|
30
|
+
attr_accessor :image, :x, :y, :angle, :center_x, :center_y, :factor_x, :factor_y, :color, :mode, :zorder
|
31
|
+
attr_reader :paused, :visible, :factor, :center
|
32
|
+
has_trait :input, :rotation_center
|
33
|
+
|
34
|
+
def initialize(options = {})
|
35
|
+
super
|
36
|
+
|
37
|
+
# All encapsulated draw_rot arguments can be set with hash-options at creation time
|
38
|
+
if options[:image].is_a?(Gosu::Image)
|
39
|
+
@image = options[:image]
|
40
|
+
elsif options[:image].is_a? String
|
41
|
+
@image = Image[options[:image]]
|
42
|
+
end
|
43
|
+
|
44
|
+
@x = options[:x] || 0
|
45
|
+
@y = options[:y] || 0
|
46
|
+
@angle = options[:angle] || 0
|
47
|
+
|
48
|
+
self.center = options[:center] || 0.5
|
49
|
+
self.factor = options[:factor] || 1.0
|
50
|
+
@center_x = options[:center_x] if options[:center_x]
|
51
|
+
@center_y = options[:center_y] if options[:center_y]
|
52
|
+
@factor_x = options[:factor_x] if options[:factor_x]
|
53
|
+
@factor_y = options[:factor_y] if options[:factor_y]
|
54
|
+
|
55
|
+
if options[:color].is_a?(Gosu::Color)
|
56
|
+
@color = options[:color]
|
57
|
+
else
|
58
|
+
@color = Gosu::Color.new(options[:color] || 0xFFFFFFFF)
|
59
|
+
end
|
60
|
+
|
61
|
+
@mode = options[:mode] || :default # :additive is also available.
|
62
|
+
@zorder = options[:zorder] || 100
|
63
|
+
|
64
|
+
# gameloop/framework logic (TODO: use or get rid of)
|
65
|
+
@paused = options[:paused] || false
|
66
|
+
@visible = options[:visible] || true
|
67
|
+
|
68
|
+
setup_trait(options) if respond_to?(:setup_trait)
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Disable auto-updating of traits
|
73
|
+
#
|
74
|
+
def pause!
|
75
|
+
@paused = true
|
76
|
+
end
|
77
|
+
#
|
78
|
+
# Enable auto-update of traits
|
79
|
+
#
|
80
|
+
def unpause!
|
81
|
+
@paused = false
|
82
|
+
end
|
83
|
+
#
|
84
|
+
# Disable auto-drawing of object
|
85
|
+
#
|
86
|
+
def hide!
|
87
|
+
@visible = false
|
88
|
+
end
|
89
|
+
#
|
90
|
+
# Enable auto-drawing of object
|
91
|
+
#
|
92
|
+
def show!
|
93
|
+
@visible = true
|
94
|
+
end
|
95
|
+
|
96
|
+
# Quick way of setting both factor_x and factor_y
|
97
|
+
def factor=(factor)
|
98
|
+
@factor = factor
|
99
|
+
@factor_x = @factor_y = factor
|
100
|
+
end
|
101
|
+
|
102
|
+
# Quick way of setting both center_x and center_y
|
103
|
+
def center=(center)
|
104
|
+
@center = center
|
105
|
+
@center_x = @center_y = center
|
106
|
+
end
|
107
|
+
|
108
|
+
# Returns true if object is inside the game window, false if outside
|
109
|
+
def inside_window?(x = @x, y = @y)
|
110
|
+
x >= 0 && x <= $window.width && y >= 0 && y <= $window.height
|
111
|
+
end
|
112
|
+
|
113
|
+
# Returns true object is outside the game window
|
114
|
+
def outside_window?(x = @x, y = @y)
|
115
|
+
not inside_window?(x,y)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Calculates the distance from self to a given objevt
|
119
|
+
def distance_to(object)
|
120
|
+
distance(self.x, self.y, object.x, object.y)
|
121
|
+
end
|
122
|
+
|
123
|
+
def draw
|
124
|
+
@image.draw_rot(@x, @y, @zorder, @angle, @center_x, @center_y, @factor_x, @factor_y, @color, @mode) if @visible
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Chingu -- Game framework built on top of the opengl accelerated gamelib Gosu
|
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
|
+
|
23
|
+
module Chingu
|
24
|
+
#
|
25
|
+
# Manages a list of game objects
|
26
|
+
# An instance of GameObjectList is automaticly created as "game_objects" if using Chingu::Window
|
27
|
+
#
|
28
|
+
class GameObjectList
|
29
|
+
|
30
|
+
def initialize
|
31
|
+
@game_objects = Array.new
|
32
|
+
#@game_objects_by_class = Hash.new
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
"#{@game_objects.size} game objects."
|
37
|
+
end
|
38
|
+
|
39
|
+
def of_class(klass)
|
40
|
+
@game_objects.select { |game_object| game_object.is_a? klass }
|
41
|
+
#@game_objects_by_class[klass] || []
|
42
|
+
end
|
43
|
+
|
44
|
+
def remove_all
|
45
|
+
@game_objects.clear
|
46
|
+
#@game_objects_of_class.clear
|
47
|
+
end
|
48
|
+
alias :clear :remove_all
|
49
|
+
|
50
|
+
def add_game_object(object)
|
51
|
+
@game_objects.push(object)
|
52
|
+
#(@game_objects_by_class[object.class] ||= []).push(object)
|
53
|
+
end
|
54
|
+
|
55
|
+
def remove_game_object(object)
|
56
|
+
@game_objects.delete(object)
|
57
|
+
#@game_objects_by_class[object.class].delete(object)
|
58
|
+
end
|
59
|
+
|
60
|
+
def destroy_if
|
61
|
+
@game_objects.reject! { |object| yield(object) }
|
62
|
+
#@game_objects_by_class.delete_if { |klass, object| yield(object) }
|
63
|
+
end
|
64
|
+
|
65
|
+
def size
|
66
|
+
@game_objects.size
|
67
|
+
end
|
68
|
+
|
69
|
+
def draw
|
70
|
+
@game_objects.each{ |object| object.visible }.each do |object|
|
71
|
+
object.draw_trait
|
72
|
+
object.draw
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def update
|
77
|
+
@game_objects.select{ |object| not object.paused }.each do |object|
|
78
|
+
object.update_trait
|
79
|
+
object.update
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def each
|
84
|
+
@game_objects.each { |object| yield object }
|
85
|
+
end
|
86
|
+
|
87
|
+
def select
|
88
|
+
@game_objects.select { |object| yield object }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
#--
|
2
|
+
#
|
3
|
+
# Chingu -- Game framework built on top of the opengl accelerated gamelib Gosu
|
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
|
+
|
23
|
+
module Chingu
|
24
|
+
#
|
25
|
+
# Chingu incorporates a basic push/pop game state system (as discussed here: http://www.gamedev.net/community/forums/topic.asp?topic_id=477320).
|
26
|
+
# Game states is a way of organizing your intros, menus, levels.
|
27
|
+
# Game states aren't complicated. In Chingu a GameState is a class that behaves mostly like your default Gosu::Window (or in our case Chingu::Window) game loop.
|
28
|
+
#
|
29
|
+
# # A simple GameState-example
|
30
|
+
# class Intro < Chingu::GameState
|
31
|
+
# def update
|
32
|
+
# # game logic here
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# def draw
|
36
|
+
# # screen manipulation here
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# # Called when we enter the game state
|
40
|
+
# def setup
|
41
|
+
# @player.angle = 0 # point player upwards
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# # Called when we leave the current game state
|
45
|
+
# def finalize
|
46
|
+
# push_game_state(Menu) # switch to game state "Menu"
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
|
51
|
+
class GameState
|
52
|
+
include Chingu::GameStateHelpers # Easy access to the global game state-queue
|
53
|
+
include Chingu::GFXHelpers # Adds fill(), fade() etc to each game state
|
54
|
+
include Chingu::GameObjectHelpers # adds game_objects_of_class etc ...
|
55
|
+
include Chingu::InputDispatcher # dispatch-helpers
|
56
|
+
include Chingu::InputClient
|
57
|
+
|
58
|
+
attr_reader :options # so jlnr can access his :level-number
|
59
|
+
attr_accessor :game_state_manager, :game_objects
|
60
|
+
|
61
|
+
def initialize(options = {})
|
62
|
+
@options = options
|
63
|
+
## @game_state_manager = options[:game_state_manager] || $window.game_state_manager
|
64
|
+
@game_objects = GameObjectList.new
|
65
|
+
@input_clients = Set.new # Set is like a unique Array with Hash lookupspeed
|
66
|
+
|
67
|
+
# Game state mamanger can be run alone
|
68
|
+
if defined?($window) && $window.respond_to?(:game_state_manager)
|
69
|
+
$window.game_state_manager.inside_state = self
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# An unique identifier for the GameState-class,
|
75
|
+
# Used in game state manager to keep track of created states.
|
76
|
+
#
|
77
|
+
def to_sym
|
78
|
+
self.class.to_s.to_sym
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_s
|
82
|
+
self.class.to_s
|
83
|
+
end
|
84
|
+
|
85
|
+
def setup
|
86
|
+
# Your game state setup logic here.
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Called when a button is pressed and a game state is active
|
91
|
+
#
|
92
|
+
def button_down(id)
|
93
|
+
dispatch_button_down(id, self)
|
94
|
+
@input_clients.each { |object| dispatch_button_down(id, object) } if @input_clients
|
95
|
+
end
|
96
|
+
|
97
|
+
#
|
98
|
+
# Called when a button is released and a game state active
|
99
|
+
#
|
100
|
+
def button_up(id)
|
101
|
+
dispatch_button_up(id, self)
|
102
|
+
@input_clients.each { |object| dispatch_button_up(id, object) } if @input_clients
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# Calls update on each game object that has current game state as parent (created inside that game state)
|
107
|
+
#
|
108
|
+
def update
|
109
|
+
dispatch_input_for(self)
|
110
|
+
|
111
|
+
@input_clients.each { |game_object| dispatch_input_for(game_object) }
|
112
|
+
|
113
|
+
@game_objects.update
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# Calls Draw on each game object that has current game state as parent (created inside that game state)
|
118
|
+
#
|
119
|
+
def draw
|
120
|
+
@game_objects.draw
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# Closes game state by poping it off the stack (and activating the game state below)
|
125
|
+
#
|
126
|
+
def close
|
127
|
+
pop_game_state
|
128
|
+
end
|
129
|
+
|
130
|
+
#
|
131
|
+
# Closes main window and terminates the application
|
132
|
+
#
|
133
|
+
def close_game
|
134
|
+
$window.close
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|