gosu_android 0.0.4 → 0.0.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/README.md +21 -12
- data/examples/arkanoid_activity.rb +189 -62
- data/examples/load_image_activity.rb +29 -0
- data/examples/pong_activity.rb +109 -41
- data/examples/tutorial_activity.rb +144 -0
- data/examples/tutorial_common_activity.rb +166 -0
- data/examples/{test_game_activity.rb → tutorial_touch_activity.rb} +10 -10
- data/examples/use_keyboard_activity.rb +34 -0
- data/lib/gosu.java.jar +0 -0
- data/lib/gosu_android/audio/audio.rb +45 -6
- data/lib/gosu_android/graphics/blockAllocator.rb +12 -0
- data/lib/gosu_android/graphics/drawOpQueue.rb +1 -1
- data/lib/gosu_android/graphics/font.rb +1 -1
- data/lib/gosu_android/graphics/graphicsBase.rb +1 -2
- data/lib/gosu_android/graphics/image.rb +6 -5
- data/lib/gosu_android/graphics/texChunk.rb +3 -4
- data/lib/gosu_android/graphics/texture.rb +7 -5
- data/lib/gosu_android/input/input.rb +43 -5
- data/lib/gosu_android/main-window.rb +105 -42
- data/lib/gosu_android/requires.rb +6 -1
- data/lib/gosu_android/version.rb +1 -1
- data/res/drawable-nodpi/{ship.png → star_fighter.png} +0 -0
- data/res/drawable-nodpi/yellow_square.png +0 -0
- metadata +12 -8
- data/lib/gosu_android/physics/physicsManager.rb +0 -57
- data/lib/gosu_android/physics/physicsObject.rb +0 -113
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'gosu'
|
2
|
+
|
3
|
+
module ZOrder
|
4
|
+
Background, Stars, Player, UI = *0..3
|
5
|
+
end
|
6
|
+
|
7
|
+
class Player
|
8
|
+
attr_reader :score
|
9
|
+
|
10
|
+
def initialize(window)
|
11
|
+
@image = Gosu::Image.new(window, Ruboto::R::drawable::star_fighter, false)
|
12
|
+
@beep = Gosu::Sample.new(window, Ruboto::R::raw::beep)
|
13
|
+
@x = @y = @vel_x = @vel_y = @angle = 0.0
|
14
|
+
@score = 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def warp(x, y)
|
18
|
+
@x, @y = x, y
|
19
|
+
end
|
20
|
+
|
21
|
+
def turn_left
|
22
|
+
@angle -= 4.5
|
23
|
+
end
|
24
|
+
|
25
|
+
def turn_right
|
26
|
+
@angle += 4.5
|
27
|
+
end
|
28
|
+
|
29
|
+
def accelerate
|
30
|
+
@vel_x += Gosu::offset_x(@angle, 0.5)
|
31
|
+
@vel_y += Gosu::offset_y(@angle, 0.5)
|
32
|
+
end
|
33
|
+
|
34
|
+
def move
|
35
|
+
@x += @vel_x
|
36
|
+
@y += @vel_y
|
37
|
+
@x %= 640
|
38
|
+
@y %= 480
|
39
|
+
|
40
|
+
@vel_x *= 0.95
|
41
|
+
@vel_y *= 0.95
|
42
|
+
end
|
43
|
+
|
44
|
+
def draw
|
45
|
+
@image.draw_rot(@x, @y, ZOrder::Player, @angle)
|
46
|
+
end
|
47
|
+
|
48
|
+
def collect_stars(stars)
|
49
|
+
stars.reject! do |star|
|
50
|
+
if Gosu::distance(@x, @y, star.x, star.y) < 35 then
|
51
|
+
@score += 10
|
52
|
+
@beep.play
|
53
|
+
true
|
54
|
+
else
|
55
|
+
false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Star
|
62
|
+
attr_reader :x, :y
|
63
|
+
|
64
|
+
def initialize(animation)
|
65
|
+
@animation = animation
|
66
|
+
@color = Gosu::Color.new(0xff000000)
|
67
|
+
@color.red = rand(256 - 40) + 40
|
68
|
+
@color.green = rand(256 - 40) + 40
|
69
|
+
@color.blue = rand(256 - 40) + 40
|
70
|
+
@x = rand * 640
|
71
|
+
@y = rand * 480
|
72
|
+
end
|
73
|
+
|
74
|
+
def draw
|
75
|
+
img = @animation[Gosu::milliseconds / 100 % @animation.size]
|
76
|
+
img.draw(@x - img.width / 2.0, @y - img.height / 2.0,
|
77
|
+
ZOrder::Stars, 1, 1, @color, :add)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class GameWindow < Gosu::Window
|
82
|
+
def initialize
|
83
|
+
super(640, 480, false)
|
84
|
+
self.caption = "Gosu Tutorial Game"
|
85
|
+
|
86
|
+
@background_image = Gosu::Image.new(self, Ruboto::R::drawable::space, true)
|
87
|
+
|
88
|
+
@player = Player.new(self)
|
89
|
+
@player.warp(320, 240)
|
90
|
+
|
91
|
+
@star_anim = Gosu::Image::load_tiles(self, Ruboto::R::drawable::star, 25, 25, false)
|
92
|
+
@stars = Array.new
|
93
|
+
|
94
|
+
@font = Gosu::Font.new(self, Gosu::default_font_name, 20)
|
95
|
+
end
|
96
|
+
|
97
|
+
def update
|
98
|
+
if button_down? Gosu::KbA then
|
99
|
+
@player.turn_left
|
100
|
+
end
|
101
|
+
if button_down? Gosu::KbD then
|
102
|
+
@player.turn_right
|
103
|
+
end
|
104
|
+
if button_down? Gosu::KbW then
|
105
|
+
@player.accelerate
|
106
|
+
end
|
107
|
+
@player.move
|
108
|
+
@player.collect_stars(@stars)
|
109
|
+
|
110
|
+
if rand(100) < 4 and @stars.size < 25 then
|
111
|
+
@stars.push(Star.new(@star_anim))
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def draw
|
116
|
+
@background_image.draw(0, 0, ZOrder::Background)
|
117
|
+
@player.draw
|
118
|
+
@stars.each { |star| star.draw }
|
119
|
+
@font.draw("Score: #{@player.score}", 10, 10, ZOrder::UI, 1.0, 1.0, 0xffffff00)
|
120
|
+
end
|
121
|
+
|
122
|
+
def button_down(id)
|
123
|
+
if id == Gosu::KbEscape then
|
124
|
+
close
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class TutorialActivity
|
130
|
+
def on_create(bundle)
|
131
|
+
super(bundle)
|
132
|
+
Gosu::AndroidInitializer.instance.start(self)
|
133
|
+
rescue Exception => e
|
134
|
+
puts "#{ e } (#{ e.class } #{e.message} #{e.backtrace.inspect} )!"
|
135
|
+
end
|
136
|
+
|
137
|
+
def on_ready
|
138
|
+
window = GameWindow.new
|
139
|
+
window.show
|
140
|
+
window.show_soft_keyboard
|
141
|
+
rescue Exception => e
|
142
|
+
puts "#{ e } (#{ e.class } #{e.message} #{e.backtrace.inspect} )!"
|
143
|
+
end
|
144
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'gosu'
|
2
|
+
|
3
|
+
module Resources
|
4
|
+
if defined? Ruboto
|
5
|
+
Resources::STAR_FIGHTER = Ruboto::R::drawable::star_fighter
|
6
|
+
Resources::BEEP = Ruboto::R::raw::beep
|
7
|
+
Resources::SPACE = Ruboto::R::drawable::space
|
8
|
+
Resources::STAR = Ruboto::R::drawable::star
|
9
|
+
else
|
10
|
+
Resources::STAR_FIGHTER = "media/Starfighter.bmp"
|
11
|
+
Resources::BEEP = "media/Beep.wav"
|
12
|
+
Resources::SPACE = "media/Space.png"
|
13
|
+
Resources::STAR = "media/Star.png"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module ZOrder
|
18
|
+
Background, Stars, Player, UI = *0..3
|
19
|
+
end
|
20
|
+
|
21
|
+
class Player
|
22
|
+
attr_reader :score
|
23
|
+
|
24
|
+
def initialize(window)
|
25
|
+
@image = Gosu::Image.new(window, Resources::STAR_FIGHTER, false)
|
26
|
+
@beep = Gosu::Sample.new(window, Resources::BEEP)
|
27
|
+
@x = @y = @vel_x = @vel_y = @angle = 0.0
|
28
|
+
@score = 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def warp(x, y)
|
32
|
+
@x, @y = x, y
|
33
|
+
end
|
34
|
+
|
35
|
+
def turn_left
|
36
|
+
@angle -= 4.5
|
37
|
+
end
|
38
|
+
|
39
|
+
def turn_right
|
40
|
+
@angle += 4.5
|
41
|
+
end
|
42
|
+
|
43
|
+
def accelerate
|
44
|
+
@vel_x += Gosu::offset_x(@angle, 0.5)
|
45
|
+
@vel_y += Gosu::offset_y(@angle, 0.5)
|
46
|
+
end
|
47
|
+
|
48
|
+
def move
|
49
|
+
@x += @vel_x
|
50
|
+
@y += @vel_y
|
51
|
+
@x %= 640
|
52
|
+
@y %= 480
|
53
|
+
|
54
|
+
@vel_x *= 0.95
|
55
|
+
@vel_y *= 0.95
|
56
|
+
end
|
57
|
+
|
58
|
+
def draw
|
59
|
+
@image.draw_rot(@x, @y, ZOrder::Player, @angle)
|
60
|
+
end
|
61
|
+
|
62
|
+
def collect_stars(stars)
|
63
|
+
stars.reject! do |star|
|
64
|
+
if Gosu::distance(@x, @y, star.x, star.y) < 35 then
|
65
|
+
@score += 10
|
66
|
+
@beep.play
|
67
|
+
true
|
68
|
+
else
|
69
|
+
false
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class Star
|
76
|
+
attr_reader :x, :y
|
77
|
+
|
78
|
+
def initialize(animation)
|
79
|
+
@animation = animation
|
80
|
+
@color = Gosu::Color.new(0xff000000)
|
81
|
+
@color.red = rand(256 - 40) + 40
|
82
|
+
@color.green = rand(256 - 40) + 40
|
83
|
+
@color.blue = rand(256 - 40) + 40
|
84
|
+
@x = rand * 640
|
85
|
+
@y = rand * 480
|
86
|
+
end
|
87
|
+
|
88
|
+
def draw
|
89
|
+
img = @animation[Gosu::milliseconds / 100 % @animation.size]
|
90
|
+
img.draw(@x - img.width / 2.0, @y - img.height / 2.0,
|
91
|
+
ZOrder::Stars, 1, 1, @color, :add)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class GameWindow < Gosu::Window
|
96
|
+
def initialize
|
97
|
+
super(640, 480, false)
|
98
|
+
self.caption = "Gosu Tutorial Game"
|
99
|
+
|
100
|
+
@background_image = Gosu::Image.new(self, Resources::SPACE, true)
|
101
|
+
|
102
|
+
@player = Player.new(self)
|
103
|
+
@player.warp(320, 240)
|
104
|
+
|
105
|
+
@star_anim = Gosu::Image::load_tiles(self, Resources::STAR, 25, 25, false)
|
106
|
+
@stars = Array.new
|
107
|
+
|
108
|
+
@font = Gosu::Font.new(self, Gosu::default_font_name, 20)
|
109
|
+
end
|
110
|
+
|
111
|
+
def update
|
112
|
+
if button_down? Gosu::KbA then
|
113
|
+
@player.turn_left
|
114
|
+
end
|
115
|
+
if button_down? Gosu::KbD then
|
116
|
+
@player.turn_right
|
117
|
+
end
|
118
|
+
if button_down? Gosu::KbW then
|
119
|
+
@player.accelerate
|
120
|
+
end
|
121
|
+
@player.move
|
122
|
+
@player.collect_stars(@stars)
|
123
|
+
|
124
|
+
if rand(100) < 4 and @stars.size < 25 then
|
125
|
+
@stars.push(Star.new(@star_anim))
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def touch_moved(touch)
|
130
|
+
@player.warp(touch.x, touch.y)
|
131
|
+
end
|
132
|
+
|
133
|
+
def draw
|
134
|
+
@background_image.draw(0, 0, ZOrder::Background)
|
135
|
+
@player.draw
|
136
|
+
@stars.each { |star| star.draw }
|
137
|
+
@font.draw("Score: #{@player.score}", 10, 10, ZOrder::UI, 1.0, 1.0, 0xffffff00)
|
138
|
+
end
|
139
|
+
|
140
|
+
def button_down(id)
|
141
|
+
if id == Gosu::KbEscape then
|
142
|
+
close
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
if not defined? Ruboto
|
148
|
+
window = GameWindow.new
|
149
|
+
window.show
|
150
|
+
else
|
151
|
+
class TutorialCommonActivity
|
152
|
+
def on_create(bundle)
|
153
|
+
super(bundle)
|
154
|
+
Gosu::AndroidInitializer.instance.start(self)
|
155
|
+
rescue Exception => e
|
156
|
+
puts "#{ e } (#{ e.class } #{e.message} #{e.backtrace.inspect} )!"
|
157
|
+
end
|
158
|
+
|
159
|
+
def on_ready
|
160
|
+
window = GameWindow.new
|
161
|
+
window.show
|
162
|
+
rescue Exception => e
|
163
|
+
puts "#{ e } (#{ e.class } #{e.message} #{e.backtrace.inspect} )!"
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -8,8 +8,8 @@ class Player
|
|
8
8
|
attr_reader :score
|
9
9
|
|
10
10
|
def initialize(window)
|
11
|
-
@image = Gosu::Image.new(window,
|
12
|
-
@beep = Gosu::Sample.new(window,
|
11
|
+
@image = Gosu::Image.new(window, Ruboto::R::drawable::star_fighter, false)
|
12
|
+
@beep = Gosu::Sample.new(window, Ruboto::R::raw::beep)
|
13
13
|
@x = @y = @vel_x = @vel_y = @angle = 0.0
|
14
14
|
@score = 0
|
15
15
|
end
|
@@ -51,7 +51,7 @@ class Star
|
|
51
51
|
def draw
|
52
52
|
img = @animation[Gosu::milliseconds / 100 % @animation.size]
|
53
53
|
img.draw(@x - img.width / 2.0, @y - img.height / 2.0,
|
54
|
-
ZOrder::Stars, 1, 1, @color,
|
54
|
+
ZOrder::Stars, 1, 1, @color, :add)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -60,15 +60,15 @@ class GameWindow < Gosu::Window
|
|
60
60
|
super(640, 480, false)
|
61
61
|
self.caption = "Gosu Tutorial Game"
|
62
62
|
|
63
|
-
|
63
|
+
@background_image = Gosu::Image.new(self, Ruboto::R::drawable::space, true)
|
64
64
|
|
65
65
|
@player = Player.new(self)
|
66
66
|
@player.warp(320, 240)
|
67
67
|
|
68
|
-
@star_anim = Gosu::Image::load_tiles(self,
|
68
|
+
@star_anim = Gosu::Image::load_tiles(self, Ruboto::R::drawable::star, 25, 25, false)
|
69
69
|
@stars = Array.new
|
70
70
|
|
71
|
-
|
71
|
+
@font = Gosu::Font.new(self, Gosu::default_font_name, 20)
|
72
72
|
end
|
73
73
|
|
74
74
|
def update
|
@@ -84,10 +84,10 @@ class GameWindow < Gosu::Window
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def draw
|
87
|
-
|
87
|
+
@background_image.draw(0, 0, ZOrder::Background)
|
88
88
|
@player.draw
|
89
89
|
@stars.each { |star| star.draw }
|
90
|
-
|
90
|
+
@font.draw("Score: #{@player.score}", 10, 10, ZOrder::UI, 1.0, 1.0, 0xffffff00)
|
91
91
|
end
|
92
92
|
|
93
93
|
def button_down(id)
|
@@ -97,7 +97,7 @@ class GameWindow < Gosu::Window
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
class
|
100
|
+
class TutorialTouchActivity
|
101
101
|
def on_create(bundle)
|
102
102
|
super(bundle)
|
103
103
|
Gosu::AndroidInitializer.instance.start(self)
|
@@ -111,4 +111,4 @@ class TestGameActivity
|
|
111
111
|
rescue Exception => e
|
112
112
|
puts "#{ e } (#{ e.class } #{e.message} #{e.backtrace.inspect} )!"
|
113
113
|
end
|
114
|
-
end
|
114
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'gosu'
|
2
|
+
|
3
|
+
class GameWindow < Gosu::Window
|
4
|
+
def initialize
|
5
|
+
super 600, 480, false, 30
|
6
|
+
self.caption = "Gosu Use Keyboard"
|
7
|
+
@font = Gosu::Font.new(self, Gosu::default_font_name, 20)
|
8
|
+
self.show_soft_keyboard
|
9
|
+
end
|
10
|
+
|
11
|
+
def button_down(id)
|
12
|
+
@key = id
|
13
|
+
end
|
14
|
+
|
15
|
+
def draw
|
16
|
+
@font.draw("Press a key to see its code: #{@key}", 10, 10, 3, 1.0, 1.0, 0xffffff00)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class UseKeyboardActivity
|
21
|
+
def on_create(bundle)
|
22
|
+
super(bundle)
|
23
|
+
Gosu::AndroidInitializer.instance.start(self)
|
24
|
+
rescue Exception => e
|
25
|
+
puts "#{ e } (#{ e.class } #{e.message} #{e.backtrace.inspect} )!"
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_ready
|
29
|
+
window = GameWindow.new
|
30
|
+
window.show
|
31
|
+
rescue Exception => e
|
32
|
+
puts "#{ e } (#{ e.class } #{e.message} #{e.backtrace.inspect} )!"
|
33
|
+
end
|
34
|
+
end
|
data/lib/gosu.java.jar
CHANGED
Binary file
|
@@ -8,15 +8,45 @@ module Gosu
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
#TODO No listener gets ever called, also when a song ends
|
12
|
+
#logcat returns error:
|
13
|
+
# E/MP3Extractor( 95): Unable to resync. Signalling end of stream.
|
14
|
+
class AudioFocusListener < JavaImports::Service
|
15
|
+
include JavaImports::AudioManager::OnAudioFocusChangeListener
|
12
16
|
def onAudioFocusChange focusChange
|
13
17
|
puts "In focus change #{focusChange}"
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
|
21
|
+
def onBind intent
|
22
|
+
return nil
|
14
23
|
end
|
15
24
|
|
16
25
|
def toString
|
17
26
|
self.class.to_s
|
18
27
|
end
|
19
28
|
end
|
29
|
+
|
30
|
+
class AudioCompletionListener
|
31
|
+
include JavaImports::MediaPlayer::OnCompletionListener
|
32
|
+
def onCompletion mp
|
33
|
+
return true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class AudioErrorListener
|
38
|
+
include JavaImports::MediaPlayer::OnErrorListener
|
39
|
+
def onError(mp, what, extra)
|
40
|
+
return true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class AudioInfoListener
|
45
|
+
include JavaImports::MediaPlayer::OnInfoListener
|
46
|
+
def onInfo(mp, what, extra)
|
47
|
+
return true
|
48
|
+
end
|
49
|
+
end
|
20
50
|
|
21
51
|
#TODO ManageAudioFocus, when app loses, stop song
|
22
52
|
#TODO Raise a warning is the file could not be loaded
|
@@ -26,8 +56,6 @@ module Gosu
|
|
26
56
|
#system and loads the sample from a file.
|
27
57
|
def initialize(window, filename)
|
28
58
|
@window = window
|
29
|
-
#Set finalize
|
30
|
-
ObjectSpace.define_finalizer(self, self.class.method(:finalize).to_proc)
|
31
59
|
if not defined? @@pool
|
32
60
|
@@pool = JavaImports::SoundPool.new(MAX_SAMPLES, JavaImports::AudioManager::STREAM_MUSIC, 0)
|
33
61
|
end
|
@@ -37,6 +65,8 @@ module Gosu
|
|
37
65
|
else
|
38
66
|
@id = @@pool.load(filename, 1)
|
39
67
|
end
|
68
|
+
#Set finalize
|
69
|
+
ObjectSpace.define_finalizer(self, self.class.finalize(@id))
|
40
70
|
end
|
41
71
|
|
42
72
|
#Plays the sample without panning.
|
@@ -62,14 +92,14 @@ module Gosu
|
|
62
92
|
end
|
63
93
|
end
|
64
94
|
|
65
|
-
def
|
66
|
-
@@pool.unload(
|
95
|
+
def self.finalize(id)
|
96
|
+
proc { @@pool.unload(id) }
|
67
97
|
end
|
68
98
|
|
69
99
|
end
|
70
100
|
|
71
101
|
#TODO Error on playing several songs, bear in mind mediaplayer states
|
72
|
-
#
|
102
|
+
#TODO Set listener for when the data finished loading asynchronously
|
73
103
|
# add some checks play is reached before that
|
74
104
|
class Song
|
75
105
|
attr_reader :current_song
|
@@ -81,6 +111,9 @@ module Gosu
|
|
81
111
|
context = @window.activity.getApplicationContext
|
82
112
|
@@audio_manager = context.getSystemService(Context::AUDIO_SERVICE)
|
83
113
|
focus = @@audio_manager.requestAudioFocus(@@audio_focus_listener, JavaImports::AudioManager::STREAM_MUSIC, JavaImports::AudioManager::AUDIOFOCUS_GAIN)
|
114
|
+
@@media_player.setOnCompletionListener AudioCompletionListener.new
|
115
|
+
@@media_player.setOnErrorListener AudioErrorListener.new
|
116
|
+
@@media_player.setOnInfoListener AudioInfoListener.new
|
84
117
|
else
|
85
118
|
@@media_player.reset
|
86
119
|
focus = @@audio_manager.requestAudioFocus(@@audio_focus_listener, JavaImports::AudioManager::STREAM_MUSIC, JavaImports::AudioManager::AUDIOFOCUS_GAIN)
|
@@ -153,6 +186,12 @@ module Gosu
|
|
153
186
|
end
|
154
187
|
@@current_song = 0
|
155
188
|
end
|
189
|
+
|
190
|
+
def Song.release_resources
|
191
|
+
if defined? @@media_player
|
192
|
+
@@audio_manager.abandonAudioFocus @@audio_focus_listener
|
193
|
+
end
|
194
|
+
end
|
156
195
|
|
157
196
|
end
|
158
197
|
|