chingu 0.8.1 → 0.9rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -776,6 +776,34 @@ Adds class and instance methods for basic collision detection.
776
776
  # do something
777
777
  end
778
778
 
779
+ ==== Trait "asynchronous"
780
+ Allows your code to specify a GameObject's behavior asynchronously, including
781
+ tweening, movement and even method calls. Tasks are added to a queue to be
782
+ processed in order; the task at the front of the queue is updated each tick
783
+ and removed when it has finished.
784
+
785
+ # Simple one-trick example
786
+ # This will cause an object to move from its current location to 64,64.
787
+ @guy.async.tween :x => 64, :y => 64
788
+
789
+ # Block syntax example
790
+ # This will cause a line of text to fade out and vanish.
791
+ Chingu::Text.trait :asynchronous
792
+ message = Chingu::Text.new 'Goodbye, World!'
793
+ message.async do |q|
794
+ q.wait 500
795
+ q.tween 2000, :alpha => 0, :scale => 2
796
+ q.call :destroy
797
+ end
798
+
799
+ Currently available tasks are wait(timeout, &condition), tween(timeout,
800
+ properties), call(method, *arguments) and exec { ... }.
801
+
802
+ For a more complete example of how to use this trait, see
803
+ examples/example_async.rb.
804
+
805
+
806
+
779
807
  ==== (IN DEVELOPMENT) Trait "retrofy"
780
808
  Providing easier handling of the "retrofy" effect (non-blurry zoom)
781
809
  Aims to help out when using zoom-factor to create a retrofeeling with big pixels.
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ begin
14
14
  gemspec.rubyforge_project = "chingu"
15
15
  gemspec.version = Chingu::VERSION
16
16
 
17
- gemspec.add_dependency 'gosu', '>= 0.7.25'
17
+ gemspec.add_dependency 'gosu', '>= 0.7.27'
18
18
  gemspec.add_dependency 'rest-client'
19
19
  gemspec.add_dependency 'crack'
20
20
  gemspec.add_development_dependency 'rspec', '>= 2.1.0'
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require File.join(File.dirname($0), "..", "lib", "chingu")
4
+ include Gosu
5
+ include Chingu
6
+
7
+ #
8
+ # Simple
9
+ #
10
+ class Game < Chingu::Window
11
+
12
+ def setup
13
+ on_input(:esc, :exit)
14
+
15
+ @client = Client.new
16
+ @server = Server.new
17
+
18
+ @server.start("0.0.0.0", 1234)
19
+ @client.connect("127.0.0.1", 1234)
20
+ end
21
+
22
+ def update
23
+ @client.update
24
+ @client.update_trait
25
+ @server.update
26
+ @server.update_trait
27
+ end
28
+
29
+ end
30
+
31
+ #
32
+ # Our Client. We inherit from Chingu::GameStates::NetworkClient
33
+ #
34
+ class Client < GameStates::NetworkClient
35
+ trait :timer
36
+
37
+ def on_connect
38
+ $window.caption = "[CONNECTED]"
39
+ send_msg(:timestamp => Gosu::milliseconds)
40
+ every(1000) { send_msg(:timestamp => Gosu::milliseconds) }
41
+ end
42
+
43
+ def on_msg(msg)
44
+ latency = (Gosu::milliseconds - msg[:timestamp])
45
+ #puts "PONG: #{latency}ms"
46
+ $window.caption = "PONG: #{latency}ms"
47
+ end
48
+
49
+ end
50
+
51
+ #
52
+ # Our Server. We inherit from Chingu::GameStates::NetworkServer
53
+ #
54
+ class Server < GameStates::NetworkServer
55
+
56
+ def on_msg(socket, msg)
57
+ #puts "PING: #{msg[:timestamp]}"
58
+ send_msg(socket, {:timestamp => msg[:timestamp]})
59
+ end
60
+
61
+ end
62
+
63
+ Game.new.show
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{chingu}
8
- s.version = "0.8.1"
8
+ s.version = "0.9rc1"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["ippa"]
12
- s.date = %q{2011-01-08}
12
+ s.date = %q{2011-02-20}
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 = [
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  "benchmarks/benchmark4.rb",
31
31
  "benchmarks/benchmark5.rb",
32
32
  "benchmarks/benchmark6.rb",
33
+ "benchmarks/benchmark_ping_localhost.rb",
33
34
  "benchmarks/game_object_list_benchmark.rb",
34
35
  "benchmarks/game_objects_benchmark.rb",
35
36
  "benchmarks/lookup_benchmark.rb",
@@ -60,6 +61,8 @@ Gem::Specification.new do |s|
60
61
  "examples/example25_fibers_state_machine.rb",
61
62
  "examples/example26_splash_screen.rb",
62
63
  "examples/example27_console.rb",
64
+ "examples/example28_networking.rb",
65
+ "examples/example29_asynchronous.rb",
63
66
  "examples/example2_gamestate_basics.rb",
64
67
  "examples/example3_parallax.rb",
65
68
  "examples/example4_gamestates.rb",
@@ -118,10 +121,20 @@ Gem::Specification.new do |s|
118
121
  "lib/chingu.rb",
119
122
  "lib/chingu/animation.rb",
120
123
  "lib/chingu/assets.rb",
124
+ "lib/chingu/async/basic_task.rb",
125
+ "lib/chingu/async/task_builder.rb",
126
+ "lib/chingu/async/task_list.rb",
127
+ "lib/chingu/async_tasks/call.rb",
128
+ "lib/chingu/async_tasks/exec.rb",
129
+ "lib/chingu/async_tasks/move.rb",
130
+ "lib/chingu/async_tasks/parallel.rb",
131
+ "lib/chingu/async_tasks/tween.rb",
132
+ "lib/chingu/async_tasks/wait.rb",
121
133
  "lib/chingu/basic_game_object.rb",
122
134
  "lib/chingu/classic_game_object.rb",
123
135
  "lib/chingu/console.rb",
124
136
  "lib/chingu/core_ext/array.rb",
137
+ "lib/chingu/core_ext/range.rb",
125
138
  "lib/chingu/fpscounter.rb",
126
139
  "lib/chingu/game_object.rb",
127
140
  "lib/chingu/game_object_list.rb",
@@ -132,6 +145,8 @@ Gem::Specification.new do |s|
132
145
  "lib/chingu/game_states/edit.rb",
133
146
  "lib/chingu/game_states/enter_name.rb",
134
147
  "lib/chingu/game_states/fade_to.rb",
148
+ "lib/chingu/game_states/network_client.rb",
149
+ "lib/chingu/game_states/network_server.rb",
135
150
  "lib/chingu/game_states/pause.rb",
136
151
  "lib/chingu/game_states/popup.rb",
137
152
  "lib/chingu/gosu_ext/image.rb",
@@ -155,6 +170,7 @@ Gem::Specification.new do |s|
155
170
  "lib/chingu/simple_menu.rb",
156
171
  "lib/chingu/text.rb",
157
172
  "lib/chingu/traits/animation.rb",
173
+ "lib/chingu/traits/asynchronous.rb",
158
174
  "lib/chingu/traits/bounding_box.rb",
159
175
  "lib/chingu/traits/bounding_circle.rb",
160
176
  "lib/chingu/traits/collision_detection.rb",
@@ -214,6 +230,8 @@ Gem::Specification.new do |s|
214
230
  "examples/example25_fibers_state_machine.rb",
215
231
  "examples/example26_splash_screen.rb",
216
232
  "examples/example27_console.rb",
233
+ "examples/example28_networking.rb",
234
+ "examples/example29_asynchronous.rb",
217
235
  "examples/example2_gamestate_basics.rb",
218
236
  "examples/example3_parallax.rb",
219
237
  "examples/example4_gamestates.rb",
@@ -250,14 +268,14 @@ Gem::Specification.new do |s|
250
268
  s.specification_version = 3
251
269
 
252
270
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
253
- s.add_runtime_dependency(%q<gosu>, [">= 0.7.25"])
271
+ s.add_runtime_dependency(%q<gosu>, [">= 0.7.27"])
254
272
  s.add_runtime_dependency(%q<rest-client>, [">= 0"])
255
273
  s.add_runtime_dependency(%q<crack>, [">= 0"])
256
274
  s.add_development_dependency(%q<rspec>, [">= 2.1.0"])
257
275
  s.add_development_dependency(%q<watchr>, [">= 0"])
258
276
  s.add_development_dependency(%q<rcov>, [">= 0"])
259
277
  else
260
- s.add_dependency(%q<gosu>, [">= 0.7.25"])
278
+ s.add_dependency(%q<gosu>, [">= 0.7.27"])
261
279
  s.add_dependency(%q<rest-client>, [">= 0"])
262
280
  s.add_dependency(%q<crack>, [">= 0"])
263
281
  s.add_dependency(%q<rspec>, [">= 2.1.0"])
@@ -265,7 +283,7 @@ Gem::Specification.new do |s|
265
283
  s.add_dependency(%q<rcov>, [">= 0"])
266
284
  end
267
285
  else
268
- s.add_dependency(%q<gosu>, [">= 0.7.25"])
286
+ s.add_dependency(%q<gosu>, [">= 0.7.27"])
269
287
  s.add_dependency(%q<rest-client>, [">= 0"])
270
288
  s.add_dependency(%q<crack>, [">= 0"])
271
289
  s.add_dependency(%q<rspec>, [">= 2.1.0"])
@@ -24,7 +24,11 @@ class Cube < GameObject
24
24
  def initialize(options)
25
25
  super
26
26
  self.input = { :left => :left, :right => :right, :up => :up, :down => :down,
27
- :space => :shake1, :return => :shake2 }
27
+ :space => :shake1, :return => :shake2, :a => :test_after }
28
+ end
29
+
30
+ def test_after
31
+ after(1000) { @color = Color::CYAN }
28
32
  end
29
33
 
30
34
  def left
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require File.join(File.dirname($0), "..", "lib", "chingu")
4
+ include Gosu
5
+ include Chingu
6
+
7
+ #
8
+ # Simple
9
+ #
10
+ class Game < Chingu::Window
11
+
12
+ def setup
13
+ on_input(:esc, :exit)
14
+
15
+ @client = Client.new
16
+ @server = Server.new
17
+
18
+ @server.start("0.0.0.0", 1234)
19
+ @client.connect("127.0.0.1", 1234)
20
+ end
21
+
22
+ def update
23
+ #
24
+ # Since we have 2 games states going we don't switch to them ( i.e. push_game_state @server )
25
+ # Rather we just call #update manually so they can do their thing.
26
+ #
27
+ # Server#update will poll incoming connections, handle sockets and read/parse incomong data.
28
+ # Client#update will read/parse incoming data, send output.
29
+ #
30
+ @client.update
31
+ @server.update
32
+ end
33
+
34
+ end
35
+
36
+ #
37
+ # Our Client. We inherit from Chingu::GameStates::NetworkClient
38
+ #
39
+ class Client < GameStates::NetworkClient
40
+
41
+ def on_connect
42
+ puts "[#{self.ip}] Connected! Sending a msg..."
43
+ send_msg(:hi => :there)
44
+ end
45
+
46
+ #
47
+ # Only 1 argument, the msg, since client only does 1 connecion (the one to the server)
48
+ #
49
+ def on_msg(msg)
50
+ puts "Client Got: #{msg.inspect}"
51
+ end
52
+
53
+ end
54
+
55
+ #
56
+ # Our Server. We inherit from Chingu::GameStates::NetworkServer
57
+ #
58
+ class Server < GameStates::NetworkServer
59
+
60
+ #
61
+ # Overload on_msg callback in server to make something happen
62
+ # Servers #on_msg takes 2 arguments, since server can handle many clients
63
+ #
64
+ def on_connect(socket)
65
+ send_msg(socket, {:hi => :there})
66
+ end
67
+
68
+ def on_msg(socket, msg)
69
+ puts "Server Got: #{msg.inspect}"
70
+ send_msg(socket, {:woff => :mjau, :numbers => [1,2,3]})
71
+ end
72
+
73
+ end
74
+
75
+ Game.new.show
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems' rescue nil
3
+ $LOAD_PATH.unshift File.join(File.expand_path(__FILE__), "..", "..", "lib")
4
+ require 'chingu'
5
+ include Gosu
6
+ include Chingu
7
+ $stderr.sync = $stdout.sync = true
8
+
9
+ Chingu::Text.trait :asynchronous
10
+
11
+ class BadGuy < Chingu::GameObject
12
+ trait :asynchronous
13
+
14
+ def fire!
15
+ # Create a text object to represent shooting sounds.
16
+ text = Chingu::Text.create("Pew!", :x => x, :y => y - height)
17
+
18
+ # Now, make that text object fade out and disappear asynchronously.
19
+ text.async do |q|
20
+ q.tween(750, :alpha => 0, :scale => 2)
21
+ q.call :destroy
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ class Game < Chingu::Window
28
+
29
+ def initialize
30
+ super 480, 240, false
31
+
32
+ self.caption = "Press [SPACE] to run the demo"
33
+
34
+ # Create our bad guy!
35
+ @boss = BadGuy.create :image => 'Starfighter.bmp'
36
+
37
+ # Instruct the boss to move along a path while rotating clockwise.
38
+ # Nothing is actually done until the run loop calls #update.
39
+ @boss.async do |q|
40
+ # These tasks are performed sequentially and asynchronously
41
+ # using the magic of queues. Each GameObject has its own!
42
+ q.wait { button_down? Gosu::KbSpace }
43
+ q.tween(1000, :x => 100, :y => 100, :angle => 45)
44
+ q.tween(1000, :y => 200, :angle => 90)
45
+ q.call :fire!
46
+ end
47
+
48
+ # Single tasks can also be given with a less verbose syntax.
49
+ # Wait a second...
50
+ @boss.async.wait 1000
51
+
52
+ # Move and fire one more time, just for good measure.
53
+ @boss.async do |q|
54
+ q.tween(1000, :x => 200, :y => 100, :angle => 360)
55
+ 3.times do
56
+ q.wait 500
57
+ q.call :fire!
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+
65
+ Game.new.show
@@ -34,10 +34,12 @@ require File.join(CHINGU_ROOT,"chingu","require_all") # Thanks to http://github.
34
34
  # and GameObject to get the correct class_inheritable_accssor
35
35
  require_all "#{CHINGU_ROOT}/chingu/helpers"
36
36
  require_all "#{CHINGU_ROOT}/chingu/traits"
37
+ require_all "#{CHINGU_ROOT}/chingu/async"
38
+ require_all "#{CHINGU_ROOT}/chingu/async_tasks"
37
39
  require_all "#{CHINGU_ROOT}/chingu"
38
40
 
39
41
  module Chingu
40
- VERSION = "0.8.1"
42
+ VERSION = "0.9rc1"
41
43
 
42
44
  DEBUG_COLOR = Gosu::Color.new(0xFFFF0000)
43
45
  DEBUG_ZORDER = 9999
@@ -0,0 +1,46 @@
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
+ require 'weakref'
23
+
24
+ module Chingu
25
+ module Async
26
+
27
+ class BasicTask
28
+
29
+ def initialize
30
+ end
31
+
32
+ #
33
+ # Returns true if the task has finished executing. The meaning of
34
+ # "finished" is determined by the particular subclass.
35
+ #
36
+ def finished?
37
+ true
38
+ end
39
+
40
+ def update(object)
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,71 @@
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 Async
24
+
25
+ #
26
+ # Implements a DSL for appending new tasks to an task queue.
27
+ #
28
+ class TaskBuilder
29
+ def initialize(tasks)
30
+ @tasks = tasks
31
+ end
32
+
33
+ #
34
+ # Add a new task to the queue. The first argument is a Symbol or
35
+ # String naming the type of task; remaining arguments are passed
36
+ # on to the task's constructor.
37
+ #
38
+ # If a block is supplied, it is scheduled to be executed as soon as the
39
+ # task is finished.
40
+ #
41
+ def task(task, *args, &block)
42
+ case task
43
+ when Symbol, String
44
+ klass_name = Chingu::Inflector.camelize(task)
45
+ klass = Chingu::AsyncTasks.const_get(klass_name)
46
+
47
+ task = klass.new(*args, &block)
48
+
49
+ when Chingu::Async::BasicTask
50
+ # pass
51
+
52
+ when Class
53
+ task = task.new(*args, &block)
54
+
55
+ else raise TypeError, "task must be a Task object or task name"
56
+ end
57
+
58
+ @tasks.enq(task)
59
+ task
60
+ end
61
+
62
+ #
63
+ # Attempting to invoke a nonexistant method automatically calls
64
+ # +task+ with the method name as the task type.
65
+ #
66
+ alias :method_missing :task
67
+
68
+ end
69
+
70
+ end
71
+ end