gosu_android 0.0.1
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/LICENSE +19 -0
- data/README.md +35 -0
- data/bin/gosu_android +11 -0
- data/examples/arkanoid.rb +105 -0
- data/examples/pong_activity.rb +99 -0
- data/examples/test-game.rb +114 -0
- data/lib/gosu.java.jar +0 -0
- data/lib/gosu_android.rb +1 -0
- data/lib/gosu_android/audio/audio.rb +159 -0
- data/lib/gosu_android/commands/base.rb +200 -0
- data/lib/gosu_android/description.rb +5 -0
- data/lib/gosu_android/graphics/bitmap.rb +12 -0
- data/lib/gosu_android/graphics/bitmapUtils.rb +51 -0
- data/lib/gosu_android/graphics/blockAllocator.rb +107 -0
- data/lib/gosu_android/graphics/color.rb +27 -0
- data/lib/gosu_android/graphics/common.rb +21 -0
- data/lib/gosu_android/graphics/drawOp.rb +6 -0
- data/lib/gosu_android/graphics/drawOpQueue.rb +39 -0
- data/lib/gosu_android/graphics/font.rb +61 -0
- data/lib/gosu_android/graphics/graphics.rb +227 -0
- data/lib/gosu_android/graphics/graphicsBase.rb +27 -0
- data/lib/gosu_android/graphics/image.rb +151 -0
- data/lib/gosu_android/graphics/imageData.rb +23 -0
- data/lib/gosu_android/graphics/largeImageData.rb +116 -0
- data/lib/gosu_android/graphics/renderState.rb +5 -0
- data/lib/gosu_android/graphics/texChunk.rb +68 -0
- data/lib/gosu_android/graphics/texture.rb +86 -0
- data/lib/gosu_android/input/buttons.rb +128 -0
- data/lib/gosu_android/input/input.rb +120 -0
- data/lib/gosu_android/main-window.rb +314 -0
- data/lib/gosu_android/math.rb +21 -0
- data/lib/gosu_android/physics/physicsManager.rb +57 -0
- data/lib/gosu_android/physics/physicsObject.rb +113 -0
- data/lib/gosu_android/requires.rb +40 -0
- data/lib/gosu_android/timing.rb +8 -0
- data/lib/gosu_android/version.rb +3 -0
- data/res/drawable-nodpi/ball.png +0 -0
- data/res/drawable-nodpi/bar.png +0 -0
- data/res/drawable-nodpi/bar_hor.png +0 -0
- data/res/drawable-nodpi/character_atlas8.png +0 -0
- data/res/drawable-nodpi/ship.png +0 -0
- data/res/drawable-nodpi/space.png +0 -0
- data/res/drawable-nodpi/star.png +0 -0
- data/res/raw/beep.wav +0 -0
- data/res/raw/chriss_onac_tempo_red.mp3 +0 -0
- metadata +127 -0
@@ -0,0 +1,200 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
module Gosu
|
4
|
+
module Commands
|
5
|
+
module Base
|
6
|
+
|
7
|
+
def self.show_help
|
8
|
+
puts "Usage: gosu_android [OPTION]"
|
9
|
+
puts "Adds or deletes dependencies for Gosu in a Ruboto project."
|
10
|
+
puts "If no argument is specified it adds the dependencies."
|
11
|
+
puts ""
|
12
|
+
puts " -a, --add adds the files to the project"
|
13
|
+
puts " -d, --delete deletes the files from the project"
|
14
|
+
puts " -h, --help display this help and exit"
|
15
|
+
puts ""
|
16
|
+
puts "The options -a and -d can not be given together."
|
17
|
+
puts ""
|
18
|
+
puts "Exit status:"
|
19
|
+
puts " 0 if everything went ok,"
|
20
|
+
puts " 1 if there was some error."
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.add_files
|
24
|
+
#root -> user directory
|
25
|
+
root = Dir.pwd
|
26
|
+
#gem root -> where the gem is located
|
27
|
+
gem_root = File.expand_path(File.dirname(__FILE__))
|
28
|
+
gem_root.slice! "/commands"
|
29
|
+
|
30
|
+
#Get all the files needed for gosu android
|
31
|
+
gem_root_s = gem_root + "/*"
|
32
|
+
gem_root_ss = gem_root + "/*/*"
|
33
|
+
|
34
|
+
#List of not usefull files
|
35
|
+
lib_files = FileList[ gem_root_s, gem_root_ss ].to_a
|
36
|
+
not_copy_files = ["commands", "description", "version"]
|
37
|
+
|
38
|
+
#Do not copy the ones that are not needed
|
39
|
+
not_copy_files.each do |not_copy|
|
40
|
+
lib_files.delete_if do |element|
|
41
|
+
element.include? not_copy
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
#Copy the files
|
46
|
+
lib_files.each do |file|
|
47
|
+
src = String.new file
|
48
|
+
file.slice!(gem_root)
|
49
|
+
dst = root + '/src/gosu_android' + file
|
50
|
+
FileUtils.mkdir_p(File.dirname(dst))
|
51
|
+
if file.include? ".rb"
|
52
|
+
FileUtils.cp(src, dst)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
#FIXME This is a dirty way to delete de last
|
57
|
+
#gosu_android from the gem_root variable
|
58
|
+
|
59
|
+
#Main file and jar dependencies go in different folders
|
60
|
+
#than normal files
|
61
|
+
gem_root = gem_root + "/"
|
62
|
+
gem_root.slice! "/gosu_android/"
|
63
|
+
|
64
|
+
src = gem_root + "/gosu_android.rb"
|
65
|
+
dst = root + "/src/gosu_android.rb"
|
66
|
+
FileUtils.cp(src, dst)
|
67
|
+
src = gem_root + "/gosu.java.jar"
|
68
|
+
dst = root + "/libs/gosu.java.jar"
|
69
|
+
FileUtils.cp(src, dst)
|
70
|
+
|
71
|
+
#Resources files
|
72
|
+
gem_root = gem_root + "_"
|
73
|
+
gem_root.slice! "/lib_"
|
74
|
+
gem_root_s = gem_root + "/res/*"
|
75
|
+
gem_root_ss = gem_root + "/res/*/**"
|
76
|
+
|
77
|
+
#Get all resources
|
78
|
+
lib_files = FileList[ gem_root_s, gem_root_ss ].to_a
|
79
|
+
|
80
|
+
#Copy the resources
|
81
|
+
lib_files.each do |file|
|
82
|
+
src = String.new file
|
83
|
+
file.slice!(gem_root)
|
84
|
+
dst = root + file
|
85
|
+
FileUtils.mkdir_p(File.dirname(dst))
|
86
|
+
if file.include? "."
|
87
|
+
FileUtils.cp(src, dst)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.delete_files
|
94
|
+
root = Dir.pwd
|
95
|
+
|
96
|
+
#Deleting whole gosu_android folder
|
97
|
+
to_delete = root + "/src/gosu_android"
|
98
|
+
begin
|
99
|
+
FileUtils.rm_rf to_delete
|
100
|
+
rescue => e
|
101
|
+
$stderr.puts e.message
|
102
|
+
end
|
103
|
+
|
104
|
+
#Deleting gosu_android.rb file
|
105
|
+
to_delete = root + "/src/gosu_android.rb"
|
106
|
+
begin
|
107
|
+
File.delete to_delete
|
108
|
+
rescue => e
|
109
|
+
$stderr.puts e.message
|
110
|
+
end
|
111
|
+
|
112
|
+
#Deleting gosu.java.jar file
|
113
|
+
to_delete = root + "/libs/gosu.java.jar"
|
114
|
+
begin
|
115
|
+
File.delete to_delete
|
116
|
+
rescue => e
|
117
|
+
$stderr.puts e.message
|
118
|
+
end
|
119
|
+
|
120
|
+
#gem root -> where the gem is located
|
121
|
+
gem_root = File.expand_path(File.dirname(__FILE__))
|
122
|
+
gem_root.slice! "/commands"
|
123
|
+
|
124
|
+
gem_root = gem_root + "/"
|
125
|
+
gem_root.slice! "/gosu_android/"
|
126
|
+
|
127
|
+
#Resources files
|
128
|
+
gem_root = gem_root + "_"
|
129
|
+
gem_root.slice! "/lib_"
|
130
|
+
gem_root_s = gem_root + "/res/*"
|
131
|
+
gem_root_ss = gem_root + "/res/*/**"
|
132
|
+
|
133
|
+
#Get all resources
|
134
|
+
lib_files = FileList[ gem_root_s, gem_root_ss ].to_a
|
135
|
+
|
136
|
+
#Delete only the previous copied resources
|
137
|
+
lib_files.each do |file|
|
138
|
+
file.slice!(gem_root)
|
139
|
+
to_delete = root + file
|
140
|
+
if file.include? "."
|
141
|
+
begin
|
142
|
+
File.delete to_delete
|
143
|
+
rescue => e
|
144
|
+
$stderr.puts e.message
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
def self.main
|
152
|
+
add = false
|
153
|
+
delete = false
|
154
|
+
help = false
|
155
|
+
ARGV.each do|a|
|
156
|
+
case a
|
157
|
+
when "-a"
|
158
|
+
add = true
|
159
|
+
when "--add"
|
160
|
+
add = true
|
161
|
+
when "-d"
|
162
|
+
delete = true
|
163
|
+
when "--delete"
|
164
|
+
delete = true
|
165
|
+
when "-h"
|
166
|
+
help = true
|
167
|
+
when "--help"
|
168
|
+
help = true
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
if help
|
173
|
+
show_help
|
174
|
+
exit 0
|
175
|
+
end
|
176
|
+
|
177
|
+
if add and delete
|
178
|
+
$stderr.puts "Add and delete can not be perform at the same time\n"
|
179
|
+
exit 1
|
180
|
+
end
|
181
|
+
|
182
|
+
if not add and not delete
|
183
|
+
add = true
|
184
|
+
end
|
185
|
+
|
186
|
+
if add
|
187
|
+
add_files
|
188
|
+
exit 0
|
189
|
+
end
|
190
|
+
|
191
|
+
if delete
|
192
|
+
delete_files
|
193
|
+
exit 0
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'gosu_android/requires'
|
2
|
+
require 'gosu_android/graphics/color'
|
3
|
+
|
4
|
+
module Gosu
|
5
|
+
#Custom java files
|
6
|
+
java_import 'gosu.java.Bitmap'
|
7
|
+
|
8
|
+
#TODO define load_image with reader argument
|
9
|
+
def self.load_image_file(window, file_name)
|
10
|
+
Gosu::Bitmap.new(window.activity.getApplicationContext, file_name)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'gosu_android/graphics/graphicsBase'
|
2
|
+
|
3
|
+
module Gosu
|
4
|
+
def self.apply_border_flags(dest, source, src_x, src_y, src_width, src_height, border_flags)
|
5
|
+
dest.resize(src_width + 2, src_height + 2)
|
6
|
+
|
7
|
+
#The borders are made "harder" by duplicating the original bitmap's
|
8
|
+
#borders.
|
9
|
+
|
10
|
+
#Top.
|
11
|
+
if (border_flags & BF_TILEABLE_TOP)
|
12
|
+
dest.insert(source, 1, 0, src_x, src_y, src_width, 1)
|
13
|
+
end
|
14
|
+
#Bottom.
|
15
|
+
if (border_flags & BF_TILEABLE_BOTTOM)
|
16
|
+
dest.insert(source, 1, dest.height - 1,
|
17
|
+
src_x, src_y + src_height - 1, src_width, 1)
|
18
|
+
end
|
19
|
+
#Left.
|
20
|
+
if (border_flags & BF_TILEABLE_LEFT)
|
21
|
+
dest.insert(source, 0, 1, src_x, src_y, 1, src_height)
|
22
|
+
end
|
23
|
+
#Right.
|
24
|
+
if (border_flags & BF_TILEABLE_RIGHT)
|
25
|
+
dest.insert(source, dest.width - 1, 1,
|
26
|
+
src_x + src_width - 1, src_y, 1, src_height)
|
27
|
+
end
|
28
|
+
#Top left.
|
29
|
+
if ((border_flags & BF_TILEABLE_TOP) and (border_flags & BF_TILEABLE_LEFT))
|
30
|
+
dest.set_pixel(0, 0,
|
31
|
+
source.get_pixel(src_x, src_y))
|
32
|
+
end
|
33
|
+
#Top right.
|
34
|
+
if ((border_flags & BF_TILEABLE_TOP) and (border_flags & BF_TILEABLE_RIGHT))
|
35
|
+
dest.set_pixel(dest.width - 1, 0,
|
36
|
+
source.get_pixel(src_x + src_width - 1, src_y))
|
37
|
+
end
|
38
|
+
#Bottom left.
|
39
|
+
if ((border_flags & BF_TILEABLE_BOTTOM) and (border_flags & BF_TILEABLE_LEFT))
|
40
|
+
dest.set_pixel(0, dest.height - 1,
|
41
|
+
source.get_pixel(src_x, src_y + src_height - 1))
|
42
|
+
end
|
43
|
+
#Bottom right.
|
44
|
+
if ((border_flags & BF_TILEABLE_BOTTOM) and (border_flags & BF_TILEABLE_RIGHT))
|
45
|
+
dest.set_pixel(dest.width - 1, dest.height - 1,
|
46
|
+
source.get_pixel(src_x + src_width - 1, src_y + src_height - 1))
|
47
|
+
end
|
48
|
+
#Now put the final image into the prepared borders.
|
49
|
+
dest.insert(source, 1, 1, src_x, src_y, src_width, src_height)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Gosu
|
2
|
+
class BlockAllocator
|
3
|
+
private
|
4
|
+
class Impl < Struct.new(:width, :height, :blocks, :first_x, :first_y, :max_w, :max_h)
|
5
|
+
alias :old_initialize :initialize
|
6
|
+
|
7
|
+
def initialize(*args)
|
8
|
+
old_initialize *args
|
9
|
+
if self[:blocks] == nil
|
10
|
+
self[:blocks] = Array.new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def mark_block_used(block, a_width, a_height)
|
15
|
+
self[:first_x] += a_width
|
16
|
+
if (self[:first_x] + a_width) >= self[:width]
|
17
|
+
self[:first_x] = 0
|
18
|
+
self[:first_y] += a_height
|
19
|
+
end
|
20
|
+
self[:blocks].push block
|
21
|
+
end
|
22
|
+
|
23
|
+
def is_block_free(block)
|
24
|
+
#(The right-th column and the bottom-th row are outside of the block.)
|
25
|
+
right = block.left + block.width
|
26
|
+
bottom = block.top + block.height
|
27
|
+
|
28
|
+
#Block isn't valid.
|
29
|
+
if (right > self[:width] || bottom > self[:height])
|
30
|
+
return false
|
31
|
+
end
|
32
|
+
|
33
|
+
#Test if the block collides with any existing rects.
|
34
|
+
self[:blocks].each do |i|
|
35
|
+
if (i.left < right and block.left < i.left + i.width and
|
36
|
+
i.top < bottom and block.top < i.top + i.height)
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
public
|
46
|
+
class Block < Struct.new(:left, :top, :width, :height); end
|
47
|
+
|
48
|
+
def initialize(width, height)
|
49
|
+
@pimpl = Impl.new(width, height, nil, 0, 0, width, height)
|
50
|
+
end
|
51
|
+
|
52
|
+
def width
|
53
|
+
@pimpl.width
|
54
|
+
end
|
55
|
+
|
56
|
+
def height
|
57
|
+
@pimpl.height
|
58
|
+
end
|
59
|
+
|
60
|
+
def alloc(a_width, a_height)
|
61
|
+
#The rect wouldn't even fit onto the texture!
|
62
|
+
if a_width > width || a_height > height
|
63
|
+
return [false]
|
64
|
+
end
|
65
|
+
#We know there's no space left.
|
66
|
+
if a_width > @pimpl.max_w && a_height > @pimpl.max_h
|
67
|
+
return [false]
|
68
|
+
end
|
69
|
+
#Start to look for a place next to the last returned rect. Chances are
|
70
|
+
#good we'll find a place there.
|
71
|
+
b = Block.new(@pimpl.first_x, @pimpl.first_y, a_width, a_height)
|
72
|
+
if @pimpl.is_block_free(b)
|
73
|
+
@pimpl.mark_block_used(b, a_width, a_height)
|
74
|
+
return [true, b]
|
75
|
+
end
|
76
|
+
|
77
|
+
b.top = 0
|
78
|
+
b.left = 0
|
79
|
+
#Brute force: Look for a free place on this texture.
|
80
|
+
while(b.top <= (height - a_height)) do
|
81
|
+
while(b.left <= (width - a_width)) do
|
82
|
+
if @pimpl.is_block_free(b)
|
83
|
+
#Found a nice place!
|
84
|
+
|
85
|
+
#Try to make up for the large for()-stepping.
|
86
|
+
while (b.top > 0 and @pimpl.is_block_free(Block.new(b.left, b.top - 1, a_width, a_height))) do
|
87
|
+
b.top -= 1
|
88
|
+
end
|
89
|
+
while (b.left > 0 and @pimpl.is_block_free(Block.new(b.left - 1, b.top, a_width, a_height))) do
|
90
|
+
b.left -= 1
|
91
|
+
end
|
92
|
+
@pimpl.mark_block_used(b, a_width, a_height)
|
93
|
+
return [true, b]
|
94
|
+
end
|
95
|
+
b.top += 16
|
96
|
+
b.left += 8
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
#So there was no space for the bitmap. Remember this for later.
|
101
|
+
@pimpl.max_w = a_width - 1
|
102
|
+
@pimpl.max_h = a_height - 1
|
103
|
+
return [false]
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#require 'math.rb'
|
2
|
+
|
3
|
+
module Gosu
|
4
|
+
|
5
|
+
class HSV < Struct.new(:h, :s, :v)
|
6
|
+
end
|
7
|
+
|
8
|
+
#Custom java files
|
9
|
+
java_import 'gosu.java.Color'
|
10
|
+
|
11
|
+
Gosu::Color::NONE = Color.new(0x00000000)
|
12
|
+
Gosu::Color::BLACK = Color.new(0xff000000)
|
13
|
+
Gosu::Color::GRAY = Color.new(0xff808080)
|
14
|
+
Gosu::Color::WHITE = Color.new(0xffffffff)
|
15
|
+
Gosu::Color::AQUA = Color.new(0xff00ffff)
|
16
|
+
Gosu::Color::RED = Color.new(0xffff0000)
|
17
|
+
Gosu::Color::GREEN = Color.new(0xff00ff00)
|
18
|
+
Gosu::Color::BLUE = Color.new(0xff0000ff)
|
19
|
+
Gosu::Color::YELLOW = Color.new(0xffffff00)
|
20
|
+
Gosu::Color::FUCHSIA = Color.new(0xffff00ff)
|
21
|
+
Gosu::Color::CYAN = Color.new(0xff00ffff)
|
22
|
+
|
23
|
+
class Color
|
24
|
+
GL_FORMAT = 0x1908
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Gosu
|
2
|
+
NO_TEXTURE = -1
|
3
|
+
NO_CLIPPING = 0xffffffff
|
4
|
+
#In various places in Gosu, width==NO_CLIPPING conventionally means
|
5
|
+
#that no clipping should happen.
|
6
|
+
java_import 'gosu.java.ClipRect'
|
7
|
+
|
8
|
+
def self.is_p_to_the_left_of_ab(xa, ya, xb, yb, xp, yp)
|
9
|
+
((xb - xa) * (yp - ya) - (xp - xa) * (yb - ya)) > 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.reorder_coordinates_if_necessary(x1, y1, x2, y2, x3, y3, c3, x4, y4, c4)
|
13
|
+
if (Gosu::is_p_to_the_left_of_ab(x1, y1, x2, y2, x3, y3) ==
|
14
|
+
Gosu::is_p_to_the_left_of_ab(x2, y2, x3, y3, x4, y4))
|
15
|
+
true
|
16
|
+
else
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'gosu_android/graphics/renderState'
|
2
|
+
|
3
|
+
module Gosu
|
4
|
+
class DrawOpQueue
|
5
|
+
attr_reader :op_pool
|
6
|
+
def initialize(gl)
|
7
|
+
@ops = []
|
8
|
+
@gl = gl
|
9
|
+
@op_pool = DrawOpPool.new(@gl, 50)
|
10
|
+
end
|
11
|
+
|
12
|
+
def gl= gl
|
13
|
+
@gl = gl
|
14
|
+
end
|
15
|
+
|
16
|
+
def schedule_draw_op(op)
|
17
|
+
#TODO Should do more stuff, check original code
|
18
|
+
@ops.push op
|
19
|
+
end
|
20
|
+
|
21
|
+
def perform_draw_ops_and_code
|
22
|
+
#Sort by z
|
23
|
+
@ops.sort!
|
24
|
+
manager = RenderStateManager.new(@gl)
|
25
|
+
@ops.each do |op|
|
26
|
+
manager.render_state = op.render_state
|
27
|
+
op.perform(nil) if op.vertices_or_block_index >= 0
|
28
|
+
end
|
29
|
+
@op_pool.clearPool
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def clear_queue
|
34
|
+
@ops = []
|
35
|
+
@op_pool.clearPool
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|