chingu 0.8.1 → 0.9rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +28 -0
- data/Rakefile +1 -1
- data/benchmarks/benchmark_ping_localhost.rb +63 -0
- data/chingu.gemspec +24 -6
- data/examples/example12_trait_timer.rb +5 -1
- data/examples/example28_networking.rb +75 -0
- data/examples/example29_asynchronous.rb +65 -0
- data/lib/chingu.rb +3 -1
- data/lib/chingu/async/basic_task.rb +46 -0
- data/lib/chingu/async/task_builder.rb +71 -0
- data/lib/chingu/async/task_list.rb +67 -0
- data/lib/chingu/async_tasks/call.rb +48 -0
- data/lib/chingu/async_tasks/exec.rb +48 -0
- data/lib/chingu/async_tasks/move.rb +45 -0
- data/lib/chingu/async_tasks/parallel.rb +63 -0
- data/lib/chingu/async_tasks/tween.rb +73 -0
- data/lib/chingu/async_tasks/wait.rb +54 -0
- data/lib/chingu/classic_game_object.rb +1 -1
- data/lib/chingu/core_ext/range.rb +13 -0
- data/lib/chingu/game_states/enter_name.rb +21 -11
- data/lib/chingu/game_states/network_client.rb +205 -0
- data/lib/chingu/game_states/network_server.rb +262 -0
- data/lib/chingu/simple_menu.rb +10 -2
- data/lib/chingu/traits/asynchronous.rb +84 -0
- data/lib/chingu/traits/simple_sprite.rb +1 -1
- data/lib/chingu/traits/sprite.rb +1 -1
- data/lib/chingu/window.rb +1 -1
- metadata +29 -10
@@ -0,0 +1,67 @@
|
|
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
|
+
class TaskList
|
26
|
+
# extend Forwardable
|
27
|
+
# def_delegator :@queue, :push, :enq
|
28
|
+
# def_delegator :@queue, :shift, :deq
|
29
|
+
# def_delegator :@queue, :first, :front
|
30
|
+
# def_delegator :@queue, :clear
|
31
|
+
|
32
|
+
def initialize
|
33
|
+
@queue = []
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# Processes the first task on the queue, each tick removing the
|
38
|
+
# task once it has finished.
|
39
|
+
#
|
40
|
+
def update(object)
|
41
|
+
if task = front
|
42
|
+
task.update object
|
43
|
+
deq if task.finished?
|
44
|
+
task
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def front
|
49
|
+
@queue.first
|
50
|
+
end
|
51
|
+
|
52
|
+
def enq(*tasks)
|
53
|
+
@queue.push(*tasks)
|
54
|
+
end
|
55
|
+
|
56
|
+
def deq
|
57
|
+
@queue.shift
|
58
|
+
end
|
59
|
+
|
60
|
+
def clear
|
61
|
+
@queue.clear
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,48 @@
|
|
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 AsyncTasks
|
24
|
+
|
25
|
+
#
|
26
|
+
# Single method call as an asynchronous task.
|
27
|
+
#
|
28
|
+
class Call < Chingu::Async::BasicTask
|
29
|
+
|
30
|
+
def initialize(method, *args)
|
31
|
+
super()
|
32
|
+
@method, @args = method, args
|
33
|
+
@finished = false
|
34
|
+
end
|
35
|
+
|
36
|
+
def update(object)
|
37
|
+
object.send(@method, *@args)
|
38
|
+
@finished = true
|
39
|
+
end
|
40
|
+
|
41
|
+
def finished?
|
42
|
+
!!@finished
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,48 @@
|
|
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 AsyncTasks
|
24
|
+
|
25
|
+
#
|
26
|
+
# Block execution as an asynchronous task.
|
27
|
+
#
|
28
|
+
class Exec < Chingu::Async::BasicTask
|
29
|
+
|
30
|
+
def initialize(&block)
|
31
|
+
super()
|
32
|
+
@block = block
|
33
|
+
@finished = false
|
34
|
+
end
|
35
|
+
|
36
|
+
def update(object)
|
37
|
+
@block[]
|
38
|
+
@finished = true
|
39
|
+
end
|
40
|
+
|
41
|
+
def finished?
|
42
|
+
!!@finished
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,45 @@
|
|
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 "#{CHINGU_ROOT}/chingu/async_tasks/tween"
|
23
|
+
|
24
|
+
module Chingu
|
25
|
+
module AsyncTasks
|
26
|
+
|
27
|
+
#
|
28
|
+
# Syntactic sugar for tween(duration, :x => x, :y => y, :angle => angle)
|
29
|
+
#
|
30
|
+
class Move < Tween
|
31
|
+
|
32
|
+
def initialize(duration, x, y, angle = nil)
|
33
|
+
properties = { }
|
34
|
+
|
35
|
+
properties[:x] = x unless x.nil?
|
36
|
+
properties[:y] = y unless y.nil?
|
37
|
+
properties[:angle] = angle unless angle.nil?
|
38
|
+
|
39
|
+
super(duration, properties)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,63 @@
|
|
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 AsyncTasks
|
24
|
+
|
25
|
+
#
|
26
|
+
# Executes all subtasks in parallel.
|
27
|
+
#
|
28
|
+
class Parallel < Chingu::Async::BasicTask
|
29
|
+
|
30
|
+
def initialize(&block)
|
31
|
+
@subtasks = []
|
32
|
+
|
33
|
+
# Make @subtasks behave like a TaskList for the TaskBuilder.
|
34
|
+
# This is probably a dirty hack!
|
35
|
+
class <<@subtasks
|
36
|
+
alias :enq :push
|
37
|
+
alias :deq :shift
|
38
|
+
alias :front :first
|
39
|
+
end
|
40
|
+
|
41
|
+
add_tasks(&block)
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_tasks(&block)
|
45
|
+
builder = Chingu::Async::TaskBuilder.new(@subtasks)
|
46
|
+
block[builder]
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Returns true if all subtasks have finished executing.
|
51
|
+
#
|
52
|
+
def finished?
|
53
|
+
@subtasks.empty? or @subtasks.all?(&:finished?)
|
54
|
+
end
|
55
|
+
|
56
|
+
def update(object)
|
57
|
+
@subtasks.each { |task| task.update(object) }
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,73 @@
|
|
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 AsyncTasks
|
24
|
+
|
25
|
+
#
|
26
|
+
# Basic tweening for numerical properties.
|
27
|
+
#
|
28
|
+
# game_object.async.tween 1000, :property => new_value
|
29
|
+
#
|
30
|
+
class Tween < Chingu::Async::BasicTask
|
31
|
+
|
32
|
+
# TODO Tweening is pretty dumb...make it smarter.
|
33
|
+
|
34
|
+
def initialize(duration, properties)
|
35
|
+
super()
|
36
|
+
@have_initial_values = false
|
37
|
+
@age, @life = 0, duration
|
38
|
+
@properties = properties
|
39
|
+
end
|
40
|
+
|
41
|
+
def update(object)
|
42
|
+
set_initial_values(object) unless have_initial_values?
|
43
|
+
|
44
|
+
@age += $window.milliseconds_since_last_tick
|
45
|
+
t = @age.to_f / @life
|
46
|
+
t = 1.0 if t > 1
|
47
|
+
@properties.each do |name, range|
|
48
|
+
object.send "#{name}=", range.interpolate(t)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def finished?
|
53
|
+
@age >= @life
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def set_initial_values(object)
|
59
|
+
# TODO find a better and more general way to set up tweening.
|
60
|
+
@properties.each do |name, value|
|
61
|
+
@properties[name] = object.send(name) .. value
|
62
|
+
end
|
63
|
+
@have_initial_values = true
|
64
|
+
end
|
65
|
+
|
66
|
+
def have_initial_values?
|
67
|
+
!!@have_initial_values
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,54 @@
|
|
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 AsyncTasks
|
24
|
+
|
25
|
+
#
|
26
|
+
# Halts processing of tasks until the passed-in block returns a
|
27
|
+
# true value, or the timeout expires. If no block is given, behaves as if
|
28
|
+
# the block returned nil.
|
29
|
+
#
|
30
|
+
class Wait < Chingu::Async::BasicTask
|
31
|
+
|
32
|
+
attr_accessor :timeout, :condition
|
33
|
+
attr_reader :result
|
34
|
+
|
35
|
+
def initialize(timeout = nil, &condition)
|
36
|
+
super()
|
37
|
+
@result = nil
|
38
|
+
@age, @life = 0, timeout
|
39
|
+
@condition = condition
|
40
|
+
end
|
41
|
+
|
42
|
+
def update(object)
|
43
|
+
@age += $window.milliseconds_since_last_tick
|
44
|
+
@result = (@condition and @condition[])
|
45
|
+
end
|
46
|
+
|
47
|
+
def finished?
|
48
|
+
!!@result or (@life != nil and @age >= @life)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
@@ -30,8 +30,9 @@ module Chingu
|
|
30
30
|
|
31
31
|
def initialize(options = {})
|
32
32
|
super
|
33
|
-
|
34
|
-
|
33
|
+
|
34
|
+
#@title = options[:title] || "<u>Please enter your name</u>"
|
35
|
+
#Text.create(@title, :rotation_center => :top_center, :x => $window.width/2, :y => 10, :size => 40)
|
35
36
|
|
36
37
|
on_input([:holding_up, :holding_w, :holding_gamepad_up], :up)
|
37
38
|
on_input([:holding_down, :holding_s, :holding_gamepad_down], :down)
|
@@ -41,16 +42,16 @@ module Chingu
|
|
41
42
|
on_input(:esc, :pop_game_state)
|
42
43
|
|
43
44
|
@callback = options[:callback]
|
44
|
-
@columns = options[:columns] ||
|
45
|
+
@columns = options[:columns] || 14
|
45
46
|
|
46
47
|
@string = []
|
47
48
|
@texts = []
|
48
|
-
@index =
|
49
|
+
@index = 0
|
49
50
|
@letter_size = 30
|
50
|
-
@letters = %w[ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ! " # % & ( ) [ ] / \\ - = * SPACE DEL ENTER ]
|
51
|
+
@letters = %w[ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ! " # % & $ ( ) [ ] / \\ - + = * . 1 2 3 4 5 6 7 8 9 0 SPACE DEL ENTER ]
|
51
52
|
|
52
53
|
@y = 140
|
53
|
-
@x = ($window.width -
|
54
|
+
@x = ($window.width - 600)/2
|
54
55
|
|
55
56
|
@letters.each_with_index do |letter, index|
|
56
57
|
@texts << Text.create(letter, :x => @x, :y => @y, :size => @letter_size)
|
@@ -62,7 +63,7 @@ module Chingu
|
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
65
|
-
@
|
66
|
+
@texts[@index].color = Color::RED
|
66
67
|
@name = Text.create("", :rotaion_center => :top_center, :x => $window.width/2, :y => 60, :size => 80)
|
67
68
|
end
|
68
69
|
|
@@ -80,14 +81,23 @@ module Chingu
|
|
80
81
|
|
81
82
|
# Move cursor any given value (positive or negative). Used by left() and right()
|
82
83
|
def move_cursor(amount = 1)
|
83
|
-
|
84
|
-
|
85
|
-
|
84
|
+
#
|
85
|
+
# Curser will wrap
|
86
|
+
#
|
87
|
+
#@index += amount
|
88
|
+
#@index = 0 if @index >= @letters.size
|
89
|
+
#@index = @letters.size-1 if @index < 0
|
90
|
+
|
91
|
+
#
|
92
|
+
# Cursor won't wrap
|
93
|
+
#
|
94
|
+
new_value = @index + amount
|
95
|
+
@index = new_value if new_value < @letters.size && new_value >= 0
|
86
96
|
|
87
97
|
@texts.each { |text| text.color = Color::WHITE }
|
88
98
|
@texts[@index].color = Color::RED
|
89
99
|
|
90
|
-
sleep(0.
|
100
|
+
sleep(0.15)
|
91
101
|
end
|
92
102
|
|
93
103
|
def action
|