xibe 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 +3 -0
- data/README +3 -0
- data/Rakefile +48 -0
- data/lib/xibe.rb +699 -0
- metadata +57 -0
data/LICENSE
ADDED
data/README
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#
|
2
|
+
# To change this template, choose Tools | Templates
|
3
|
+
# and open the template in the editor.
|
4
|
+
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
require 'rake'
|
8
|
+
require 'rake/clean'
|
9
|
+
require 'rake/gempackagetask'
|
10
|
+
require 'rake/rdoctask'
|
11
|
+
require 'rake/testtask'
|
12
|
+
|
13
|
+
spec = Gem::Specification.new do |s|
|
14
|
+
s.name = 'xibe'
|
15
|
+
s.version = '0.0.1'
|
16
|
+
s.has_rdoc = true
|
17
|
+
s.extra_rdoc_files = ['README', 'LICENSE']
|
18
|
+
s.summary = 'Developer Game'
|
19
|
+
s.description = s.summary
|
20
|
+
s.author = 'Michel Brito'
|
21
|
+
s.email = 'micheljunio@gmail.com'
|
22
|
+
s.homepage = "http://codesheep.com/xibe/"
|
23
|
+
s.rubyforge_project = 'xibe'
|
24
|
+
# s.executables = ['your_executable_here']
|
25
|
+
s.files = %w(LICENSE README Rakefile) + Dir.glob("{bin,lib,spec}/**/*")
|
26
|
+
s.require_path = "lib"
|
27
|
+
s.bindir = "bin"
|
28
|
+
#s.add_dependency("rubysdl", ">= 1.3.0")
|
29
|
+
end
|
30
|
+
|
31
|
+
Rake::GemPackageTask.new(spec) do |p|
|
32
|
+
p.gem_spec = spec
|
33
|
+
p.need_tar = true
|
34
|
+
p.need_zip = true
|
35
|
+
end
|
36
|
+
|
37
|
+
Rake::RDocTask.new do |rdoc|
|
38
|
+
files =['README', 'LICENSE', 'lib/**/*.rb']
|
39
|
+
rdoc.rdoc_files.add(files)
|
40
|
+
rdoc.main = "README" # page to start on
|
41
|
+
rdoc.title = "Xibe Docs"
|
42
|
+
rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
|
43
|
+
rdoc.options << '--line-numbers'
|
44
|
+
end
|
45
|
+
|
46
|
+
Rake::TestTask.new do |t|
|
47
|
+
t.test_files = FileList['test/**/*.rb']
|
48
|
+
end
|
data/lib/xibe.rb
ADDED
@@ -0,0 +1,699 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'sdl'
|
3
|
+
|
4
|
+
class Fixnum
|
5
|
+
def seconds
|
6
|
+
self * 1000
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Float
|
11
|
+
def seconds
|
12
|
+
self * 1000
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Xibe
|
17
|
+
module Event
|
18
|
+
class Keyboard
|
19
|
+
def self.down?
|
20
|
+
if $keydown.nil? == false && $keydown == sym(self.name)
|
21
|
+
$keydown = nil
|
22
|
+
return true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.up?
|
27
|
+
if $keyup.nil? == false && $keyup == sym(self.name)
|
28
|
+
$keyup = nil
|
29
|
+
return true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.press?
|
34
|
+
k = sym(self.name)
|
35
|
+
SDL::Key.press?(k)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.sym(key)
|
39
|
+
k = key.gsub("Xibe::Event::K_", "")
|
40
|
+
eval "SDL::Key::" + k
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def keydown?
|
45
|
+
if $any_keydown
|
46
|
+
$any_keydown = false
|
47
|
+
return true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def keyup?
|
52
|
+
unless $any_keyup.nil?
|
53
|
+
$any_keyup = nil
|
54
|
+
return true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class K_BACKSPACE < Keyboard; end
|
59
|
+
class K_TAB < Keyboard; end
|
60
|
+
class K_CLEAR < Keyboard; end
|
61
|
+
class K_RETURN < Keyboard; end
|
62
|
+
class K_PAUSE < Keyboard; end
|
63
|
+
class K_ESCAPE < Keyboard; end
|
64
|
+
class K_SPACE < Keyboard; end
|
65
|
+
class K_EXCLAIM < Keyboard; end
|
66
|
+
class K_QUOTEDBL < Keyboard; end
|
67
|
+
class K_HASH < Keyboard; end
|
68
|
+
class K_DOLLAR < Keyboard; end
|
69
|
+
class K_AMPERSAND < Keyboard; end
|
70
|
+
class K_QUOTE < Keyboard; end
|
71
|
+
class K_LEFTPAREN < Keyboard; end
|
72
|
+
class K_RIGHTPAREN < Keyboard; end
|
73
|
+
class K_ASTERISK < Keyboard; end
|
74
|
+
class K_PLUS < Keyboard; end
|
75
|
+
class K_COMMA < Keyboard; end
|
76
|
+
class K_MINUS < Keyboard; end
|
77
|
+
class K_PERIOD < Keyboard; end
|
78
|
+
class K_SLASH < Keyboard; end
|
79
|
+
class K_K0 < Keyboard; end
|
80
|
+
class K_K1 < Keyboard; end
|
81
|
+
class K_K2 < Keyboard; end
|
82
|
+
class K_K3 < Keyboard; end
|
83
|
+
class K_K4 < Keyboard; end
|
84
|
+
class K_K5 < Keyboard; end
|
85
|
+
class K_K6 < Keyboard; end
|
86
|
+
class K_K7 < Keyboard; end
|
87
|
+
class K_K8 < Keyboard; end
|
88
|
+
class K_K9 < Keyboard; end
|
89
|
+
class K_COLON < Keyboard; end
|
90
|
+
class K_SEMICOLON < Keyboard; end
|
91
|
+
class K_LESS < Keyboard; end
|
92
|
+
class K_EQUALS < Keyboard; end
|
93
|
+
class K_GREATER < Keyboard; end
|
94
|
+
class K_QUESTION < Keyboard; end
|
95
|
+
class K_AT < Keyboard; end
|
96
|
+
class K_LEFTBRACKET < Keyboard; end
|
97
|
+
class K_BACKSLASH < Keyboard; end
|
98
|
+
class K_RIGHTBRACKET < Keyboard; end
|
99
|
+
class K_CARET < Keyboard; end
|
100
|
+
class K_UNDERSCORE < Keyboard; end
|
101
|
+
class K_BACKQUOTE < Keyboard; end
|
102
|
+
class K_A < Keyboard; end
|
103
|
+
class K_B < Keyboard; end
|
104
|
+
class K_C < Keyboard; end
|
105
|
+
class K_D < Keyboard; end
|
106
|
+
class K_E < Keyboard; end
|
107
|
+
class K_F < Keyboard; end
|
108
|
+
class K_G < Keyboard; end
|
109
|
+
class K_H < Keyboard; end
|
110
|
+
class K_I < Keyboard; end
|
111
|
+
class K_J < Keyboard; end
|
112
|
+
class K_K < Keyboard; end
|
113
|
+
class K_L < Keyboard; end
|
114
|
+
class K_M < Keyboard; end
|
115
|
+
class K_N < Keyboard; end
|
116
|
+
class K_O < Keyboard; end
|
117
|
+
class K_P < Keyboard; end
|
118
|
+
class K_Q < Keyboard; end
|
119
|
+
class K_R < Keyboard; end
|
120
|
+
class K_S < Keyboard; end
|
121
|
+
class K_T < Keyboard; end
|
122
|
+
class K_U < Keyboard; end
|
123
|
+
class K_V < Keyboard; end
|
124
|
+
class K_W < Keyboard; end
|
125
|
+
class K_X < Keyboard; end
|
126
|
+
class K_Y < Keyboard; end
|
127
|
+
class K_Z < Keyboard; end
|
128
|
+
class K_DELETE < Keyboard; end
|
129
|
+
class K_KP0 < Keyboard; end
|
130
|
+
class K_KP1 < Keyboard; end
|
131
|
+
class K_KP2 < Keyboard; end
|
132
|
+
class K_KP3 < Keyboard; end
|
133
|
+
class K_KP4 < Keyboard; end
|
134
|
+
class K_KP5 < Keyboard; end
|
135
|
+
class K_KP6 < Keyboard; end
|
136
|
+
class K_KP7 < Keyboard; end
|
137
|
+
class K_KP8 < Keyboard; end
|
138
|
+
class K_KP9 < Keyboard; end
|
139
|
+
class K_KP_PERIOD < Keyboard; end
|
140
|
+
class K_KP_DIVIDE < Keyboard; end
|
141
|
+
class K_KP_MULTIPLY < Keyboard; end
|
142
|
+
class K_KP_MINUS < Keyboard; end
|
143
|
+
class K_KP_PLUS < Keyboard; end
|
144
|
+
class K_KP_ENTER < Keyboard; end
|
145
|
+
class K_KP_EQUALS < Keyboard; end
|
146
|
+
class K_UP < Keyboard; end
|
147
|
+
class K_DOWN < Keyboard; end
|
148
|
+
class K_RIGHT < Keyboard; end
|
149
|
+
class K_LEFT < Keyboard; end
|
150
|
+
class K_INSERT < Keyboard; end
|
151
|
+
class K_HOME < Keyboard; end
|
152
|
+
class K_END < Keyboard; end
|
153
|
+
class K_PAGEUP < Keyboard; end
|
154
|
+
class K_PAGEDOWN < Keyboard; end
|
155
|
+
class K_F1 < Keyboard; end
|
156
|
+
class K_F2 < Keyboard; end
|
157
|
+
class K_F3 < Keyboard; end
|
158
|
+
class K_F4 < Keyboard; end
|
159
|
+
class K_F5 < Keyboard; end
|
160
|
+
class K_F6 < Keyboard; end
|
161
|
+
class K_F7 < Keyboard; end
|
162
|
+
class K_F8 < Keyboard; end
|
163
|
+
class K_F9 < Keyboard; end
|
164
|
+
class K_F10 < Keyboard; end
|
165
|
+
class K_F11 < Keyboard; end
|
166
|
+
class K_F12 < Keyboard; end
|
167
|
+
class K_F13 < Keyboard; end
|
168
|
+
class K_F14 < Keyboard; end
|
169
|
+
class K_F15 < Keyboard; end
|
170
|
+
class K_NUMLOCK < Keyboard; end
|
171
|
+
class K_CAPSLOCK < Keyboard; end
|
172
|
+
class K_SCROLLOCK < Keyboard; end
|
173
|
+
class K_RSHIFT < Keyboard; end
|
174
|
+
class K_LSHIFT < Keyboard; end
|
175
|
+
class K_RCTRL < Keyboard; end
|
176
|
+
class K_LCTRL < Keyboard; end
|
177
|
+
class K_RALT < Keyboard; end
|
178
|
+
class K_LALT < Keyboard; end
|
179
|
+
class K_RMETA < Keyboard; end
|
180
|
+
class K_LMETA < Keyboard; end
|
181
|
+
class K_LSUPER < Keyboard; end
|
182
|
+
class K_RSUPER < Keyboard; end
|
183
|
+
class K_MODE < Keyboard; end
|
184
|
+
class K_HELP < Keyboard; end
|
185
|
+
class K_PRINT < Keyboard; end
|
186
|
+
class K_SYSREQ < Keyboard; end
|
187
|
+
class K_BREAK < Keyboard; end
|
188
|
+
class K_MENU < Keyboard; end
|
189
|
+
class K_POWER < Keyboard; end
|
190
|
+
class K_EURO < Keyboard; end
|
191
|
+
|
192
|
+
class Joystick
|
193
|
+
def self.press?
|
194
|
+
return false if $joystick.nil?
|
195
|
+
result = false
|
196
|
+
b = self.name.gsub "Xibe::Event::J_", ""
|
197
|
+
if b == "UP"
|
198
|
+
result = true if $joystick.axis(1) == 0
|
199
|
+
elsif b == "DOWN"
|
200
|
+
result = true if $joystick.axis(1) == 255
|
201
|
+
elsif b == "LEFT"
|
202
|
+
result = true if $joystick.axis(0) == 0
|
203
|
+
elsif b == "RIGHT"
|
204
|
+
result = true if $joystick.axis(0) == 255
|
205
|
+
else
|
206
|
+
b = b.delete "B"
|
207
|
+
result = $joystick.button(b.to_i)
|
208
|
+
end
|
209
|
+
result
|
210
|
+
end
|
211
|
+
|
212
|
+
def self.direction_press?
|
213
|
+
return false if $joystick.nil?
|
214
|
+
$joystick.axis(0) != 127 || $joystick.axis(1) != 127
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
class J_B0 < Joystick; end
|
219
|
+
class J_B1 < Joystick; end
|
220
|
+
class J_B2 < Joystick; end
|
221
|
+
class J_B3 < Joystick; end
|
222
|
+
class J_B4 < Joystick; end
|
223
|
+
class J_B5 < Joystick; end
|
224
|
+
class J_B6 < Joystick; end
|
225
|
+
class J_B7 < Joystick; end
|
226
|
+
class J_B8 < Joystick; end
|
227
|
+
class J_B9 < Joystick; end
|
228
|
+
class J_B10 < Joystick; end
|
229
|
+
class J_UP < Joystick; end
|
230
|
+
class J_RIGHT < Joystick; end
|
231
|
+
class J_DOWN < Joystick; end
|
232
|
+
class J_LEFT < Joystick; end
|
233
|
+
|
234
|
+
|
235
|
+
QUIT = SDL::Event2::Quit
|
236
|
+
end
|
237
|
+
|
238
|
+
$bg_cmap = []
|
239
|
+
$collide_box = []
|
240
|
+
|
241
|
+
@@window = nil
|
242
|
+
class Application
|
243
|
+
attr_accessor :x, :y, :width, :height, :fps, :scene
|
244
|
+
#width, height: window size; fullscreen: fullscreen mode; fps: frames per seconds
|
245
|
+
def initialize(width, height, fullscreen = false, fps=30)
|
246
|
+
@width = width
|
247
|
+
@height = height
|
248
|
+
@fullscreen = fullscreen
|
249
|
+
@fps = fps
|
250
|
+
@@window = self
|
251
|
+
|
252
|
+
SDL.init(SDL::INIT_EVERYTHING)
|
253
|
+
|
254
|
+
if SDL::Joystick.num > 0
|
255
|
+
$joystick = SDL::Joystick.open(0)
|
256
|
+
end
|
257
|
+
|
258
|
+
#SDL::Mixer.open(22050)
|
259
|
+
SDL::Mouse.hide
|
260
|
+
mode = @fullscreen == true ? SDL::FULLSCREEN|SDL::HWSURFACE : SDL::HWSURFACE
|
261
|
+
@screen = SDL::setVideoMode @width, @height, 16, mode
|
262
|
+
end
|
263
|
+
|
264
|
+
#Sets the window title
|
265
|
+
def title=(title)
|
266
|
+
SDL::WM.set_caption title, ''
|
267
|
+
end
|
268
|
+
|
269
|
+
#Sets the window icon
|
270
|
+
def icon=(filename)
|
271
|
+
SDL::WM.icon = SDL::Surface.load filename
|
272
|
+
end
|
273
|
+
|
274
|
+
#Run application
|
275
|
+
def run
|
276
|
+
timer = Timer.new
|
277
|
+
loop do
|
278
|
+
timer.start
|
279
|
+
SDL::Key.scan
|
280
|
+
while event = SDL::Event2.poll
|
281
|
+
case event
|
282
|
+
when SDL::Event2::Quit
|
283
|
+
exit
|
284
|
+
when SDL::Event2::KeyDown
|
285
|
+
$keydown = event.sym
|
286
|
+
$any_keydown = true
|
287
|
+
when SDL::Event2::KeyUp
|
288
|
+
$keyup = event.sym
|
289
|
+
$any_keyup = true
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
input
|
294
|
+
update
|
295
|
+
draw
|
296
|
+
@screen.flip
|
297
|
+
SDL.delay( (1000 / @fps) - timer.ticks ) if timer.ticks < 1000 / @fps
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
def input
|
302
|
+
scene_input unless @scene.nil?
|
303
|
+
end
|
304
|
+
|
305
|
+
def update
|
306
|
+
scene_update unless @scene.nil?
|
307
|
+
end
|
308
|
+
|
309
|
+
def draw
|
310
|
+
scene_draw unless @scene.nil?
|
311
|
+
end
|
312
|
+
|
313
|
+
#Sets the scene to display
|
314
|
+
def display(scene)
|
315
|
+
@scene = scene
|
316
|
+
@screen.set_clip_rect(0,0,@scene.width,@scene.height)
|
317
|
+
end
|
318
|
+
|
319
|
+
private
|
320
|
+
def scene_input
|
321
|
+
@scene.input
|
322
|
+
end
|
323
|
+
|
324
|
+
def scene_update
|
325
|
+
@scene.update
|
326
|
+
end
|
327
|
+
|
328
|
+
def scene_draw
|
329
|
+
@screen.fill_rect(0,0,@width,@height,@scene.fill)
|
330
|
+
@scene.draw
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
class Layer
|
335
|
+
attr_accessor :x, :y, :width, :height, :z, :visible
|
336
|
+
def initialize
|
337
|
+
@x = 0
|
338
|
+
@y = 0
|
339
|
+
@width = 0
|
340
|
+
@height = 0
|
341
|
+
@z = 0
|
342
|
+
@visible = true
|
343
|
+
end
|
344
|
+
|
345
|
+
def show
|
346
|
+
@visible = true
|
347
|
+
end
|
348
|
+
|
349
|
+
def hide
|
350
|
+
@visible = false
|
351
|
+
end
|
352
|
+
|
353
|
+
#Returns the top position
|
354
|
+
def top
|
355
|
+
@y
|
356
|
+
end
|
357
|
+
|
358
|
+
#Returns the right position
|
359
|
+
def right
|
360
|
+
@x + @width
|
361
|
+
end
|
362
|
+
|
363
|
+
#Returns the bottom position
|
364
|
+
def bottom
|
365
|
+
@y + @height
|
366
|
+
end
|
367
|
+
|
368
|
+
#Returns the left position
|
369
|
+
def left
|
370
|
+
@x
|
371
|
+
end
|
372
|
+
|
373
|
+
#Sets X and Y position
|
374
|
+
def pos(x, y)
|
375
|
+
@x = x
|
376
|
+
@y = y
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
class Scene
|
381
|
+
include Event
|
382
|
+
attr_accessor :fill, :camera
|
383
|
+
attr_reader :width, :height
|
384
|
+
def initialize(width, height,fill = 0x00)
|
385
|
+
@width = width
|
386
|
+
@height = height
|
387
|
+
@fill = fill
|
388
|
+
@camera = Layer.new
|
389
|
+
@camera.width = @@window.width
|
390
|
+
@camera.height = @@window.height
|
391
|
+
@objects = []
|
392
|
+
end
|
393
|
+
|
394
|
+
def finalize
|
395
|
+
|
396
|
+
end
|
397
|
+
|
398
|
+
#Load map from file
|
399
|
+
def load_map(filename)
|
400
|
+
lines = File.open(filename).readlines.join
|
401
|
+
map = eval(lines)
|
402
|
+
map[:tilesets].each do |tileset|
|
403
|
+
self.instance_variable_set("@#{tileset[:name]}", Image.to_tiles(tileset[:filename], tileset[:width], tileset[:height], tileset[:transparent], tileset[:margin]))
|
404
|
+
end
|
405
|
+
|
406
|
+
map[:tilemaps].each do |tilemap|
|
407
|
+
tiles = self.instance_variable_get("@#{tilemap[:tileset]}")
|
408
|
+
tlmap = self.instance_variable_set("@#{tilemap[:name]}", Tilemap.new(tiles, tilemap[:obstacle]))
|
409
|
+
tlmap.x = tilemap[:x]
|
410
|
+
tlmap.y = tilemap[:y]
|
411
|
+
tlmap.z = tilemap[:z]
|
412
|
+
tlmap.load_map tilemap[:map], tilemap[:width], tilemap[:height]
|
413
|
+
add(tlmap)
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
417
|
+
#Sets the scene to display
|
418
|
+
def display(scene)
|
419
|
+
finalize
|
420
|
+
@@window.scene = scene
|
421
|
+
SDL.get_video_surface.set_clip_rect(0,0,@width,@height)
|
422
|
+
end
|
423
|
+
|
424
|
+
def update
|
425
|
+
|
426
|
+
end
|
427
|
+
|
428
|
+
#Add the object to scene
|
429
|
+
def add(object)
|
430
|
+
@objects << object
|
431
|
+
@objects = @objects.uniq
|
432
|
+
end
|
433
|
+
|
434
|
+
#Delete the object from scene
|
435
|
+
def delete(object)
|
436
|
+
@objects.delete(object)
|
437
|
+
end
|
438
|
+
|
439
|
+
#Keyboard, Joystick or Mouse
|
440
|
+
def input
|
441
|
+
|
442
|
+
end
|
443
|
+
|
444
|
+
#Center camera relative to object
|
445
|
+
def center_camera_relative_to(object)
|
446
|
+
@camera.x = ( object.x + object.width / 2 ) - @camera.width / 2;
|
447
|
+
@camera.y = ( object.y + object.height / 2 ) - @camera.height / 2;
|
448
|
+
|
449
|
+
if @camera.left < 0
|
450
|
+
@camera.x = 0
|
451
|
+
end
|
452
|
+
|
453
|
+
if @camera.top < 0
|
454
|
+
@camera.y = 0
|
455
|
+
end
|
456
|
+
|
457
|
+
if @camera.right > @width
|
458
|
+
@camera.x = @width - @camera.width
|
459
|
+
end
|
460
|
+
|
461
|
+
if @camera.bottom > @height
|
462
|
+
@camera.y = @height - @camera.height
|
463
|
+
end
|
464
|
+
end
|
465
|
+
|
466
|
+
#Draw scene
|
467
|
+
def draw
|
468
|
+
objs = @objects.sort_by { |obj| [obj.z] }
|
469
|
+
objs.each do |obj|
|
470
|
+
obj.draw
|
471
|
+
end
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
class Image < Layer
|
476
|
+
attr_reader :filename
|
477
|
+
attr_accessor :src_x, :src_y
|
478
|
+
def initialize(filename, transparent=false)
|
479
|
+
super()
|
480
|
+
@filename = filename
|
481
|
+
@image = Image.create(@filename, transparent)
|
482
|
+
@width = @image.w
|
483
|
+
@height = @image.h
|
484
|
+
@src_x = 0
|
485
|
+
@src_y = 0
|
486
|
+
end
|
487
|
+
|
488
|
+
#Create a image
|
489
|
+
def self.create(filename, transparent=false)
|
490
|
+
img = SDL::Surface.load(filename)
|
491
|
+
color_key = img.get_pixel(0,0)
|
492
|
+
img.set_color_key(SDL::SRCCOLORKEY ,color_key) if transparent == true
|
493
|
+
img.display_format
|
494
|
+
end
|
495
|
+
|
496
|
+
#Create a tiles from a image file
|
497
|
+
def self.to_tiles(filename, width, height, transparent = false, margin = 0)
|
498
|
+
img = create(filename, false)
|
499
|
+
color_key = img.get_pixel(0,0)
|
500
|
+
t_width = (img.w-margin) / (width + margin)
|
501
|
+
t_height = (img.h-margin) / (height + margin)
|
502
|
+
tiles = []
|
503
|
+
i = 0
|
504
|
+
while i < t_height do
|
505
|
+
j = 0;
|
506
|
+
while j < t_width do
|
507
|
+
tiles << img.copy_rect(j*(width+margin)+margin, i*(height+margin)+margin, width, height)
|
508
|
+
tiles[tiles.length - 1].set_color_key(SDL::SRCCOLORKEY, color_key) if transparent == true
|
509
|
+
j += 1
|
510
|
+
end
|
511
|
+
i += 1
|
512
|
+
end
|
513
|
+
tiles
|
514
|
+
end
|
515
|
+
|
516
|
+
#Draw image
|
517
|
+
def draw
|
518
|
+
SDL::Surface.blit(@image, @src_x, @src_y, @width, @height, SDL.get_video_surface, @x, @y)
|
519
|
+
end
|
520
|
+
end
|
521
|
+
|
522
|
+
class Tilemap < Layer
|
523
|
+
attr_accessor :obstacle
|
524
|
+
def initialize(tiles, obstacle = false)
|
525
|
+
super()
|
526
|
+
@tiles = tiles
|
527
|
+
@obstacle = obstacle
|
528
|
+
@width = 0
|
529
|
+
@height = 0
|
530
|
+
@map = [[]]
|
531
|
+
if @obstacle == true
|
532
|
+
@collide_id = $bg_cmap.length
|
533
|
+
end
|
534
|
+
end
|
535
|
+
|
536
|
+
#Load map from array
|
537
|
+
def load_map(map, width, height)
|
538
|
+
@map = map
|
539
|
+
@width = width
|
540
|
+
@height = height
|
541
|
+
if @obstacle == true
|
542
|
+
$bg_cmap[@collide_id] = []
|
543
|
+
for i in 0..@height - 1
|
544
|
+
for j in 0..@width - 1
|
545
|
+
$bg_cmap[@collide_id] << {:map => @tiles[@map[i][j]].make_collision_map, :x => j*@tiles[@map[i][j]].w+@x, :y => i*@tiles[@map[i][j]].h+@y}
|
546
|
+
end
|
547
|
+
end
|
548
|
+
end
|
549
|
+
end
|
550
|
+
|
551
|
+
#Draw tilemap
|
552
|
+
def draw
|
553
|
+
if @visible == true
|
554
|
+
for i in 0..@height -1
|
555
|
+
for j in 0..@width - 1
|
556
|
+
draw_tile(@tiles[@map[i][j]], j*@tiles[@map[i][j]].w+@x, i*@tiles[@map[i][j]].h+@y)
|
557
|
+
end
|
558
|
+
end
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
562
|
+
private
|
563
|
+
#Draw tile
|
564
|
+
def draw_tile(image, x, y)
|
565
|
+
SDL::Surface.blit(image, 0, 0, image.w, image.h, SDL.get_video_surface, x - @@window.scene.camera.x, y - @@window.scene.camera.y)
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
569
|
+
class Sprite < Layer
|
570
|
+
attr_accessor :frames, :delay, :direction
|
571
|
+
attr_writer :animate
|
572
|
+
def initialize(filename,width,height,transparent=false)
|
573
|
+
super()
|
574
|
+
@tiles = Image.to_tiles(filename, width, height, transparent)
|
575
|
+
@width = width
|
576
|
+
@height = height
|
577
|
+
@frames = []
|
578
|
+
@frame = 0
|
579
|
+
@delay = 200
|
580
|
+
@last_update = 0
|
581
|
+
@direction = :right
|
582
|
+
@visible = true
|
583
|
+
@animate = true
|
584
|
+
@tile
|
585
|
+
@cmap
|
586
|
+
end
|
587
|
+
|
588
|
+
#Go to first frame
|
589
|
+
def first_frame
|
590
|
+
@frame = 0
|
591
|
+
end
|
592
|
+
|
593
|
+
#Go to last frame
|
594
|
+
def last_frame
|
595
|
+
@frame = @frames.length - 1
|
596
|
+
end
|
597
|
+
|
598
|
+
#Go to next frame
|
599
|
+
def next_frame
|
600
|
+
@frame += 1
|
601
|
+
first_frame if @frame > @frames.length - 1
|
602
|
+
end
|
603
|
+
|
604
|
+
#Go to previous frame
|
605
|
+
def prev_frame
|
606
|
+
@frame -= 1
|
607
|
+
last_frame if @frame < 0
|
608
|
+
end
|
609
|
+
|
610
|
+
#Go to parameter frame
|
611
|
+
def go_frame(frame)
|
612
|
+
@frame = frame
|
613
|
+
end
|
614
|
+
|
615
|
+
#Draw sprite
|
616
|
+
def draw
|
617
|
+
animate if @animate == true
|
618
|
+
first_frame if @frames[@frame].nil?
|
619
|
+
draw_tile(@tiles[@frames[@frame]], @x, @y) if @visible == true
|
620
|
+
end
|
621
|
+
|
622
|
+
private
|
623
|
+
#Draw current frame
|
624
|
+
def draw_tile(image, x, y)
|
625
|
+
SDL::Surface.blit(image, 0, 0, image.w, image.h, SDL.get_video_surface, x - @@window.scene.camera.x, y - @@window.scene.camera.y)
|
626
|
+
end
|
627
|
+
|
628
|
+
#Animate sprite
|
629
|
+
def animate
|
630
|
+
curtime = SDL.get_ticks
|
631
|
+
while curtime >= (@last_update + @delay)
|
632
|
+
@last_update += @delay
|
633
|
+
next_frame
|
634
|
+
end
|
635
|
+
end
|
636
|
+
end
|
637
|
+
|
638
|
+
class Timer
|
639
|
+
def initialize
|
640
|
+
@start_ticks = 0
|
641
|
+
@paused_ticks = 0
|
642
|
+
@paused = false
|
643
|
+
@started = false
|
644
|
+
end
|
645
|
+
|
646
|
+
#Start counter timer
|
647
|
+
def start
|
648
|
+
@started = true
|
649
|
+
@paused = false
|
650
|
+
@start_ticks = SDL.get_ticks
|
651
|
+
end
|
652
|
+
|
653
|
+
#Stop counter timer
|
654
|
+
def stop
|
655
|
+
@started = false
|
656
|
+
@paused = false
|
657
|
+
end
|
658
|
+
|
659
|
+
#Pause counter timer
|
660
|
+
def pause
|
661
|
+
if @started == true && @paused == false
|
662
|
+
@paused = true
|
663
|
+
@paused_ticks = SDL.get_ticks - @start_ticks
|
664
|
+
end
|
665
|
+
end
|
666
|
+
|
667
|
+
#Resume counter timer
|
668
|
+
def resume
|
669
|
+
if @paused == true
|
670
|
+
@paused = false
|
671
|
+
@start_ticks = SDL.get_ticks - @paused_ticks
|
672
|
+
@paused_ticks = 0
|
673
|
+
end
|
674
|
+
end
|
675
|
+
|
676
|
+
#Return current tick
|
677
|
+
def ticks
|
678
|
+
t = 0
|
679
|
+
if @started == true
|
680
|
+
if @paused == true
|
681
|
+
t = @paused_ticks
|
682
|
+
else
|
683
|
+
t = SDL.get_ticks - @start_ticks
|
684
|
+
end
|
685
|
+
end
|
686
|
+
t
|
687
|
+
end
|
688
|
+
|
689
|
+
#Return true if started == true
|
690
|
+
def started?
|
691
|
+
@started
|
692
|
+
end
|
693
|
+
|
694
|
+
#Return true if paused == true
|
695
|
+
def paused?
|
696
|
+
@paused
|
697
|
+
end
|
698
|
+
end
|
699
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: xibe
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michel Brito
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-04-10 00:00:00 -03:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Developer Game
|
17
|
+
email: micheljunio@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
24
|
+
- LICENSE
|
25
|
+
files:
|
26
|
+
- LICENSE
|
27
|
+
- README
|
28
|
+
- Rakefile
|
29
|
+
- lib/xibe.rb
|
30
|
+
has_rdoc: true
|
31
|
+
homepage: http://codesheep.com/xibe/
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: "0"
|
42
|
+
version:
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
requirements: []
|
50
|
+
|
51
|
+
rubyforge_project: xibe
|
52
|
+
rubygems_version: 1.3.1
|
53
|
+
signing_key:
|
54
|
+
specification_version: 2
|
55
|
+
summary: Developer Game
|
56
|
+
test_files: []
|
57
|
+
|