sdl2_ffi 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile +0 -6
- data/Guardfile +0 -45
- data/README.md +11 -21
- data/lib/bad_sdl.rb +4 -0
- data/lib/{sdl2 → bad_sdl}/application.rb +47 -35
- data/lib/{sdl2 → bad_sdl}/engine.rb +20 -3
- data/lib/{sdl2 → bad_sdl}/engine/block_engine.rb +2 -2
- data/lib/bad_sdl/engine/engines.rb +51 -0
- data/lib/enumerable_constants.rb +4 -2
- data/lib/sdl2.rb +26 -247
- data/lib/sdl2/blendmode.rb +18 -0
- data/lib/sdl2/color.rb +1 -3
- data/lib/sdl2/debug.rb +58 -0
- data/lib/sdl2/display.rb +30 -23
- data/lib/sdl2/error.rb +6 -4
- data/lib/sdl2/event.rb +229 -0
- data/lib/sdl2/event/abstract.rb +11 -0
- data/lib/sdl2/event/action.rb +19 -0
- data/lib/sdl2/event/common.rb +10 -0
- data/lib/sdl2/event/controller_axis.rb +20 -0
- data/lib/sdl2/event/controller_button.rb +17 -0
- data/lib/sdl2/event/controller_device.rb +14 -0
- data/lib/sdl2/event/dollar_gesture.rb +19 -0
- data/lib/sdl2/event/drop.rb +18 -0
- data/lib/sdl2/event/joy_axis.rb +20 -0
- data/lib/sdl2/event/joy_ball.rb +20 -0
- data/lib/sdl2/event/joy_button.rb +18 -0
- data/lib/sdl2/event/joy_device.rb +14 -0
- data/lib/sdl2/event/joy_hat.rb +18 -0
- data/lib/sdl2/event/keyboard.rb +18 -0
- data/lib/sdl2/event/mouse_button.rb +21 -0
- data/lib/sdl2/event/mouse_motion.rb +19 -0
- data/lib/sdl2/event/mouse_wheel.rb +17 -0
- data/lib/sdl2/event/multi_gesture.rb +20 -0
- data/lib/sdl2/event/os.rb +12 -0
- data/lib/sdl2/event/quit.rb +12 -0
- data/lib/sdl2/event/state.rb +13 -0
- data/lib/sdl2/event/sys_wm.rb +15 -0
- data/lib/sdl2/event/text_editing.rb +17 -0
- data/lib/sdl2/event/text_input.rb +15 -0
- data/lib/sdl2/event/touch_finger.rb +20 -0
- data/lib/sdl2/event/type.rb +62 -0
- data/lib/sdl2/event/user.rb +15 -0
- data/lib/sdl2/event/window.rb +19 -0
- data/lib/sdl2/events.rb +23 -538
- data/lib/sdl2/gem_version.rb +1 -1
- data/lib/sdl2/haptic.rb +3 -3
- data/lib/sdl2/hints.rb +3 -1
- data/lib/sdl2/image.rb +20 -20
- data/lib/sdl2/init.rb +5 -8
- data/lib/sdl2/joystick.rb +104 -78
- data/lib/sdl2/joystick/axes.rb +22 -0
- data/lib/sdl2/joystick/balls.rb +24 -0
- data/lib/sdl2/joystick/buttons.rb +22 -0
- data/lib/sdl2/joystick/components.rb +23 -0
- data/lib/sdl2/joystick/hats.rb +22 -0
- data/lib/sdl2/keyboard.rb +11 -10
- data/lib/sdl2/keycode.rb +70 -70
- data/lib/sdl2/library.rb +8 -7
- data/lib/sdl2/log.rb +6 -0
- data/lib/sdl2/managed_struct.rb +17 -0
- data/lib/sdl2/mixer.rb +16 -12
- data/lib/sdl2/mixer/chunk.rb +14 -3
- data/lib/sdl2/mouse.rb +21 -41
- data/lib/sdl2/pixel_format.rb +4 -4
- data/lib/sdl2/pixels.rb +59 -47
- data/lib/sdl2/power.rb +1 -1
- data/lib/sdl2/rect.rb +4 -5
- data/lib/sdl2/render.rb +85 -170
- data/lib/sdl2/renderer.rb +337 -20
- data/lib/sdl2/rwops.rb +89 -30
- data/lib/sdl2/stdinc.rb +18 -21
- data/lib/sdl2/struct.rb +184 -0
- data/lib/sdl2/struct_helper.rb +32 -0
- data/lib/sdl2/surface.rb +15 -14
- data/lib/sdl2/syswm.rb +26 -10
- data/lib/sdl2/syswm/msg.rb +22 -4
- data/lib/sdl2/texture.rb +106 -0
- data/lib/sdl2/touch.rb +16 -20
- data/lib/sdl2/ttf.rb +29 -29
- data/lib/sdl2/ttf/sdl_ttf_module.rb +1 -1
- data/lib/sdl2/typed_pointer.rb +45 -0
- data/lib/sdl2/union.rb +7 -0
- data/lib/sdl2/video.rb +97 -183
- data/lib/sdl2/window.rb +140 -90
- data/lib/struct_array.rb +42 -0
- data/sdl2_ffi.gemspec +3 -3
- data/spec/fixtures/approvals/lazyfoonet_lesson_03_advanced_timers/has_a_message.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_07_true_type_fonts/draws_the_message_to_the_screen.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_14_advanced_timers/has_a_message.approved.png +0 -0
- data/spec/fixtures/approvals/lazyfoonet_lesson_14_advanced_timers/has_drawn_something.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_clear.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_draw_a_line_connecting_many_points.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_draw_a_point.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_draw_a_single_filled_rectangle.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_draw_a_single_pixel_line.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_draw_a_single_rectangle.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_draw_many_filled_rectangles.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_draw_many_rectangles_at_once.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_draw_points.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_render_textures.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_be_able_to_rotate_and_flip_while_rendering_textures.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2/sdl2_renderer/should_have_a_clip_rect.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_clear.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_draw_a_line_connecting_many_points.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_draw_a_point.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_draw_a_single_filled_rectangle.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_draw_a_single_pixel_line.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_draw_a_single_rectangle.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_draw_many_filled_rectangles.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_draw_many_rectangles_at_once.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_draw_points.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_render_textures.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_be_able_to_rotate_and_flip_while_rendering_textures.approved.png +0 -0
- data/spec/fixtures/approvals/sdl2_renderer/should_have_a_clip_rect.approved.png +0 -0
- data/spec/fixtures/images/finger.png +0 -0
- data/spec/fixtures/music/beat.wav +0 -0
- data/spec/fixtures/sounds/high.wav +0 -0
- data/spec/fixtures/sounds/low.wav +0 -0
- data/spec/fixtures/sounds/medium.wav +0 -0
- data/spec/fixtures/sounds/scratch.wav +0 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_01_hello_world_spec.rb +4 -6
- data/spec/functional/lazy_foo_tutorial/lazy_foo_02_optimized_images_spec.rb +3 -4
- data/spec/functional/lazy_foo_tutorial/lazy_foo_03_extension_libraries_spec.rb +2 -2
- data/spec/functional/lazy_foo_tutorial/lazy_foo_04_event_driven_programming_spec.rb +3 -3
- data/spec/functional/lazy_foo_tutorial/lazy_foo_05_color_keying_spec.rb +1 -1
- data/spec/functional/lazy_foo_tutorial/lazy_foo_06_clip_blitting_and_sprite_sheets_spec.rb +1 -1
- data/spec/functional/lazy_foo_tutorial/lazy_foo_07_true_type_fonts_spec.rb +3 -2
- data/spec/functional/lazy_foo_tutorial/lazy_foo_08_key_presses_spec.rb +9 -7
- data/spec/functional/lazy_foo_tutorial/lazy_foo_09_mouse_events_spec.rb +11 -8
- data/spec/functional/lazy_foo_tutorial/lazy_foo_10_key_states_spec.rb +5 -4
- data/spec/functional/lazy_foo_tutorial/lazy_foo_11_playing_sounds_spec.rb +17 -9
- data/spec/functional/lazy_foo_tutorial/lazy_foo_12_timing_spec.rb +8 -7
- data/spec/functional/lazy_foo_tutorial/lazy_foo_13_advanced_timers_spec.rb +85 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_14_regulating_frame_rate_spec.rb +67 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_15_calculating_frame_rate_spec.rb +48 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_16_motion_spec.rb +95 -0
- data/spec/functional/lazy_foo_tutorial/lazy_foo_helper.rb +3 -1
- data/spec/functional/lazy_foo_tutorial/timer.rb +55 -0
- data/spec/lib/bad_sdl/application_spec.rb +22 -0
- data/spec/{unit → lib}/sdl2/color_spec.rb +5 -1
- data/spec/lib/sdl2/display_spec.rb +6 -0
- data/spec/lib/sdl2/event_spec.rb +102 -0
- data/spec/lib/sdl2/events_spec.rb +12 -0
- data/spec/lib/sdl2/joystick_spec.rb +130 -0
- data/spec/lib/sdl2/keyboard_spec.rb +22 -0
- data/spec/lib/sdl2/mouse_spec.rb +21 -0
- data/spec/lib/sdl2/render_spec.rb +62 -0
- data/spec/lib/sdl2/renderer_spec.rb +224 -0
- data/spec/lib/sdl2/sdl2_helper.rb +5 -0
- data/spec/lib/sdl2/texture_spec.rb +65 -0
- data/{test/unit/sdl2/test_video.rb → spec/lib/sdl2/video_spec.rb} +82 -57
- data/spec/lib/sdl2/window_spec.rb +42 -0
- data/spec/{unit → lib}/unit_helper.rb +0 -0
- data/spec/png_writer.rb +9 -1
- data/spec/spec_helper.rb +5 -3
- metadata +201 -132
- data/lib/sdl2/engine/engines.rb +0 -46
- data/test/approvals/clip_blitting_and_sprite_sheets.received.bmp +0 -0
- data/test/approvals/color_keying_example.approved.png +0 -0
- data/test/approvals/hello_world_example_hello.approved.png +0 -0
- data/test/approvals/hello_world_example_screen.approved.png +0 -0
- data/test/approvals/optimized_surface_loading.approved.png +0 -0
- data/test/fixtures/an_example.png +0 -0
- data/test/fixtures/background.bmp +0 -0
- data/test/fixtures/background.jpg +0 -0
- data/test/fixtures/color_bars.jpg +0 -0
- data/test/fixtures/foo.jpg +0 -0
- data/test/fixtures/hello.bmp +0 -0
- data/test/fixtures/sprites.jpg +0 -0
- data/test/fixtures/x.png +0 -0
- data/test/functional/examples/lazyfoo.net_s/test_clip_blitting_and_sprite_sheets.rb +0 -50
- data/test/functional/examples/lazyfoo.net_s/test_color_keying.rb +0 -42
- data/test/functional/examples/test_lazy_foo_examples.rb +0 -195
- data/test/functional/examples/test_readme_examples.rb +0 -15
- data/test/test_helper.rb +0 -13
- data/test/unit/sdl2/test_assert.rb +0 -10
- data/test/unit/sdl2/test_audio.rb +0 -9
- data/test/unit/sdl2/test_clipboard.rb +0 -13
- data/test/unit/sdl2/test_cpuinfo.rb +0 -11
- data/test/unit/sdl2/test_error.rb +0 -20
- data/test/unit/sdl2/test_events.rb +0 -31
- data/test/unit/sdl2/test_haptic.rb +0 -27
- data/test/unit/sdl2/test_hints.rb +0 -50
- data/test/unit/sdl2/test_image.rb +0 -9
- data/test/unit/sdl2/test_init.rb +0 -29
- data/test/unit/sdl2/test_keyboard.rb +0 -9
- data/test/unit/sdl2/test_log.rb +0 -80
- data/test/unit/sdl2/test_palette.rb +0 -26
- data/test/unit/sdl2/test_pixel_format.rb +0 -38
- data/test/unit/sdl2/test_pixels.rb +0 -24
- data/test/unit/sdl2/test_power.rb +0 -11
- data/test/unit/sdl2/test_rect.rb +0 -19
- data/test/unit/sdl2/test_render.rb +0 -58
- data/test/unit/sdl2/test_surface.rb +0 -88
- data/test/unit/sdl2/test_syswm.rb +0 -11
- data/test/unit/sdl2/test_timer.rb +0 -9
- data/test/unit/sdl2/test_ttf.rb +0 -11
- data/test/unit/sdl2/test_version.rb +0 -16
- data/test/unit/sdl2/test_window.rb +0 -155
- data/test/unit/test_scratch.rb +0 -19
- data/test/unit/test_sdl2.rb +0 -16
@@ -0,0 +1,67 @@
|
|
1
|
+
require_relative 'lazy_foo_helper'
|
2
|
+
require_relative 'timer'
|
3
|
+
#ORIGINAL: http://lazyfoo.net/SDL_tutorials/lesson14/index.php
|
4
|
+
# Adapted for Ruby & SDL 2.0 as functional test by BadQuanta
|
5
|
+
|
6
|
+
require 'bad_sdl/application'
|
7
|
+
require 'bad_sdl/engine/block_engine'
|
8
|
+
require 'sdl2/ttf'
|
9
|
+
|
10
|
+
FRAMES_PER_SECOND = 20
|
11
|
+
|
12
|
+
describe "LazyFoo.net: Lesson 14: Advanced Timers" do
|
13
|
+
before do
|
14
|
+
SDL2.init!(:EVERYTHING)
|
15
|
+
@app = BadSdl::Application.new
|
16
|
+
@frame = 0
|
17
|
+
@cap = true
|
18
|
+
@fps = Timer.new
|
19
|
+
|
20
|
+
TTF::init!
|
21
|
+
@font = TTF::Font.open(FONT_PATH, 32)
|
22
|
+
@message = @font.render_text_blended("Testing Frame Rate")
|
23
|
+
|
24
|
+
@app.before_loop do
|
25
|
+
puts "before loop"
|
26
|
+
@fps.start()
|
27
|
+
end
|
28
|
+
|
29
|
+
@app.on({type: :KEYDOWN, key: {keysym: {sym: :RETURN}}}) do |event|
|
30
|
+
print "CAP IS: "
|
31
|
+
@cap = !@cap
|
32
|
+
puts @cap ? "ON" : "OFF"
|
33
|
+
end
|
34
|
+
|
35
|
+
@app.after_loop do
|
36
|
+
puts "after loop"
|
37
|
+
@frame += 1
|
38
|
+
if @cap and (@fps.get_ticks() < 1000 / FRAMES_PER_SECOND)
|
39
|
+
SDL2::delay((1000 / FRAMES_PER_SECOND) - @fps.get_ticks() )
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
@app.painter do |surface|
|
44
|
+
puts "painter"
|
45
|
+
surface.fill_rect(surface.rect, [0,0,0])
|
46
|
+
|
47
|
+
@message.blit_out(surface, {
|
48
|
+
x: (surface.w - @message.w) / 2,
|
49
|
+
y: ((surface.h + @message.h * 2) / FRAMES_PER_SECOND) * ( @frame % FRAMES_PER_SECOND) - @message.h
|
50
|
+
})
|
51
|
+
|
52
|
+
@app.window().update_surface
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
after do
|
59
|
+
@app.quit
|
60
|
+
SDL2.quit
|
61
|
+
end
|
62
|
+
|
63
|
+
it "works" do
|
64
|
+
skip "Don't know how to test this"
|
65
|
+
@app.loop nil #, #delay: 100
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative 'lazy_foo_helper'
|
2
|
+
require_relative 'timer'
|
3
|
+
#ORIGINAL: http://lazyfoo.net/SDL_tutorials/lesson14/index.php
|
4
|
+
# Adapted for Ruby & SDL 2.0 as functional test by BadQuanta
|
5
|
+
|
6
|
+
require 'bad_sdl/application'
|
7
|
+
require 'bad_sdl/engine/block_engine'
|
8
|
+
require 'sdl2/ttf'
|
9
|
+
|
10
|
+
describe "LazyFoo.net: Lesson 15: Advanced Timers" do
|
11
|
+
|
12
|
+
before do
|
13
|
+
SDL2.init(:EVERYTHING)
|
14
|
+
@app = BadSdl::Application.new(title: subject)
|
15
|
+
@frame = 0
|
16
|
+
@fps = Timer.new
|
17
|
+
@update = Timer.new
|
18
|
+
@update.start
|
19
|
+
@fps.start
|
20
|
+
|
21
|
+
@image = Image.load!(img_path('background.png'))
|
22
|
+
|
23
|
+
@app.painter do |surface|
|
24
|
+
surface.fill_rect(surface.rect, [0, 0, 0])
|
25
|
+
@image.blit_out(surface)
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
@app.after_loop do
|
30
|
+
@frame += 1
|
31
|
+
if @update.get_ticks() > 1000
|
32
|
+
|
33
|
+
fps = @frame./(@fps.get_ticks()./(1000.0))
|
34
|
+
@app.window.title = "Average Frames Per Second: #{fps}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
after do
|
40
|
+
@app.quit
|
41
|
+
SDL2.quit
|
42
|
+
end
|
43
|
+
|
44
|
+
it "works" do
|
45
|
+
@app.loop(1)
|
46
|
+
skip "don't know how to test this"
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require_relative 'lazy_foo_helper'
|
2
|
+
require_relative 'timer'
|
3
|
+
#ORIGINAL: http://lazyfoo.net/SDL_tutorials/lesson16/index.php
|
4
|
+
# Adapted for Ruby & SDL 2.0 as functional test by BadQuanta
|
5
|
+
|
6
|
+
require 'bad_sdl/application'
|
7
|
+
require 'bad_sdl/engine/block_engine'
|
8
|
+
require 'sdl2/ttf'
|
9
|
+
|
10
|
+
describe "LazyFoo.net: Lesson 16: Motion" do
|
11
|
+
|
12
|
+
class Dot
|
13
|
+
|
14
|
+
def initialize(opts)
|
15
|
+
@x = opts[:x] || 0
|
16
|
+
@y = opts[:y] || 0
|
17
|
+
@xVel = opts[:xVel] || 0
|
18
|
+
@yVel = opts[:yVel] || 0
|
19
|
+
@sprite = opts[:sprite] || SDL2::Image.load!(img_path('foo.jpg'))
|
20
|
+
end
|
21
|
+
|
22
|
+
def handle_input(event)
|
23
|
+
case event.key.keysym.sym
|
24
|
+
when :UP then @yVel -= @dot.h / 2
|
25
|
+
when :DOWN then @yVel += @dot.h / 2
|
26
|
+
when :LEFT then @xVel -= @dot.w / 2
|
27
|
+
when :RIGHT then @xVel += @dot.w / 2
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def accelerate(x,y)
|
32
|
+
@xVel += x
|
33
|
+
@yVel += y
|
34
|
+
puts "New Vector: #{@xVel},#{@yVel}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def move
|
38
|
+
@x += @xVel
|
39
|
+
@y += @yVel
|
40
|
+
end
|
41
|
+
|
42
|
+
def show(surface)
|
43
|
+
@sprite.blit_out(surface, [@x,@y])
|
44
|
+
|
45
|
+
end
|
46
|
+
end#class Dot
|
47
|
+
|
48
|
+
before do
|
49
|
+
SDL2.init!(:EVERYTHING)
|
50
|
+
@app = BadSdl::Application.new title: subject
|
51
|
+
@dot = Dot.new(
|
52
|
+
x: @app.window.surface.w / 2,
|
53
|
+
y: @app.window.surface.h / 2,
|
54
|
+
sprite: @app.window.surface.convert(SDL2::Image.load!(img_path('foo.jpg')))
|
55
|
+
)
|
56
|
+
|
57
|
+
@app.on(key: :KEYUP, key: {keysym: {sym: :UP}}) do
|
58
|
+
@dot.accelerate(0,-1)
|
59
|
+
end
|
60
|
+
|
61
|
+
@app.on(key: :KEYUP, key: {keysym: {sym: :DOWN}}) do
|
62
|
+
@dot.accelerate(0,1)
|
63
|
+
end
|
64
|
+
|
65
|
+
@app.on(key: :KEYUP, key: {keysym: {sym: :LEFT}}) do
|
66
|
+
@dot.accelerate(-1,0)
|
67
|
+
end
|
68
|
+
|
69
|
+
@app.on(key: :KEYUP, key: {keysym: {sym: :RIGHT}}) do
|
70
|
+
@dot.accelerate(1,0)
|
71
|
+
end
|
72
|
+
|
73
|
+
@app.after_loop do
|
74
|
+
@dot.move
|
75
|
+
delay(10)
|
76
|
+
end
|
77
|
+
|
78
|
+
@app.painter do |surface|
|
79
|
+
surface.fill_rect(surface.rect, [0,0,0])
|
80
|
+
@dot.show(surface)
|
81
|
+
true
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
after do
|
87
|
+
@app.quit
|
88
|
+
SDL2.quit
|
89
|
+
end
|
90
|
+
|
91
|
+
it "works" do
|
92
|
+
skip 'refine later'
|
93
|
+
@app.loop()
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'sdl2'
|
2
|
+
class Timer
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@start_ticks = 0
|
6
|
+
@paused_ticks = 0
|
7
|
+
@paused = false
|
8
|
+
@started = false
|
9
|
+
end
|
10
|
+
|
11
|
+
def start
|
12
|
+
@started = true
|
13
|
+
@paused = false
|
14
|
+
@start_ticks = SDL2::get_ticks()
|
15
|
+
end
|
16
|
+
|
17
|
+
def stop
|
18
|
+
@started = false
|
19
|
+
@paused = false
|
20
|
+
end
|
21
|
+
|
22
|
+
def pause
|
23
|
+
if started? and not paused?
|
24
|
+
@paused = true
|
25
|
+
@paused_ticks = SDL2::get_ticks() - @start_ticks
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def unpause
|
30
|
+
if paused?
|
31
|
+
@paused = false
|
32
|
+
@start_ticks = SDL2::get_ticks() - @paused_ticks
|
33
|
+
@paused_ticks = 0
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_ticks
|
38
|
+
if started?
|
39
|
+
if paused?
|
40
|
+
return @paused_ticks
|
41
|
+
else
|
42
|
+
return SDL2::get_ticks() - @start_ticks
|
43
|
+
end
|
44
|
+
end
|
45
|
+
return 0
|
46
|
+
end
|
47
|
+
|
48
|
+
def paused?
|
49
|
+
@paused
|
50
|
+
end
|
51
|
+
|
52
|
+
def started?
|
53
|
+
@started
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
require 'bad_sdl/application'
|
4
|
+
|
5
|
+
|
6
|
+
describe BadSdl::Application do
|
7
|
+
before :each do
|
8
|
+
SDL2.init(:EVERYTHING)
|
9
|
+
@app = BadSdl::Application.new title: example.metadata[:example_group][:full_description]
|
10
|
+
end
|
11
|
+
|
12
|
+
after :each do
|
13
|
+
@app.quit()
|
14
|
+
SDL2.quit
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
end
|
@@ -3,11 +3,15 @@ require_relative '../unit_helper'
|
|
3
3
|
describe SDL2::Color do
|
4
4
|
before :each do
|
5
5
|
SDL2.init!(:EVERYTHING)
|
6
|
-
@window = SDL2::Window.create(subject.to_s, :
|
6
|
+
@window = SDL2::Window.create(title: subject.to_s, width: 100, height: 100)
|
7
7
|
@screen = @window.surface
|
8
8
|
@color = SDL2::Color.new
|
9
9
|
end
|
10
10
|
|
11
|
+
after :each do
|
12
|
+
SDL2.quit
|
13
|
+
end
|
14
|
+
|
11
15
|
it 'looks RED when it should' do
|
12
16
|
@color.set(255,0,0,255)
|
13
17
|
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
describe SDL2::Event do
|
4
|
+
before :each do
|
5
|
+
SDL2.init!(:VIDEO)
|
6
|
+
SDL2::Debug.enable(SDL2::Event)
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
it 'should provide event states' do
|
11
|
+
SDL2::Event.should respond_to(:state)
|
12
|
+
SDL2::Event.state(:KEYDOWN).should == true
|
13
|
+
SDL2::Event.state(:KEYDOWN, :IGNORE).should == true # Because it was true
|
14
|
+
SDL2::Event.state(:KEYDOWN).should == false # Because now it's disabled.
|
15
|
+
SDL2::Event.state(:KEYDOWN, :ENABLE).should == false #getting it?
|
16
|
+
SDL2::Event.state(:KEYDOWN).should == true
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should be able to filter events' do
|
20
|
+
SDL2::Event.should respond_to(:filter)
|
21
|
+
SDL2::Event.push(SDL2::Event.cast(SDL2::Event::Keyboard.cast({type: :KEYDOWN, keysym: {sym: :A}} )))
|
22
|
+
count = 0
|
23
|
+
SDL2::Event.filter do |data, event|
|
24
|
+
count += 1
|
25
|
+
end
|
26
|
+
count.should == 1
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should be able to flush an event type' do
|
30
|
+
SDL2::Event.push SDL2::Event.cast(SDL2::Event::Keyboard.cast({type: :KEYDOWN, keysym: {sym: :A}} ))
|
31
|
+
SDL2::Event.push SDL2::Event.cast(SDL2::Event::Keyboard.cast({type: :KEYUP, keysym: {sym: :B}} ))
|
32
|
+
SDL2::Event.has?(:KEYDOWN).should == true
|
33
|
+
SDL2::Event.has?(:KEYUP).should == true
|
34
|
+
SDL2::Event.flush(:KEYDOWN)
|
35
|
+
SDL2::Event.has?(:KEYDOWN).should == false
|
36
|
+
SDL2::Event.has?(:KEYUP).should == true
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should be able to return the event filter' do
|
40
|
+
skip 'unsure how to test right now'
|
41
|
+
my_filter = lambda do |data, event|
|
42
|
+
0 if event.type == :KEYDOWN
|
43
|
+
1
|
44
|
+
end
|
45
|
+
|
46
|
+
SDL2::Event.filter.should == false
|
47
|
+
SDL2::Event.filter= my_filter
|
48
|
+
SDL2::Event.filter.should == my_filter
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should be able to peep events' do
|
52
|
+
events = [
|
53
|
+
SDL2::Event.cast(SDL2::Event::Keyboard.cast({type: :KEYDOWN, keysym: {sym: :A}} )),
|
54
|
+
SDL2::Event.cast(SDL2::Event::Keyboard.cast({type: :KEYUP, keysym: {sym: :B}} )),
|
55
|
+
SDL2::Event.cast(SDL2::Event::Keyboard.cast({type: :KEYDOWN, keysym: {sym: :C}} )),
|
56
|
+
SDL2::Event.cast(SDL2::Event::Keyboard.cast({type: :KEYUP, keysym: {sym: :D}} )),
|
57
|
+
]
|
58
|
+
events.each do |event|
|
59
|
+
SDL2::Event.push(event)
|
60
|
+
end
|
61
|
+
SDL2::Event.should respond_to(:peep)
|
62
|
+
retrieved = SDL2::Event.peep(nil, 3, :PEEK, :FIRSTEVENT, :LASTEVENT)
|
63
|
+
# The SDL2::Events won't match since they are different pointers,
|
64
|
+
# but hey, if we pull the values out we can see that they match just fine
|
65
|
+
per = lambda do |e|
|
66
|
+
[e.type, e.key.keysym.sym]
|
67
|
+
end
|
68
|
+
retrieved.map(&per).should == events.map(&per).first(3)
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should be able to pump events' do
|
72
|
+
SDL2::Event.should respond_to(:pump)
|
73
|
+
# Count the number of events pumped.
|
74
|
+
count = 0
|
75
|
+
# Setup a filter to count the events pumped.
|
76
|
+
SDL2::Event.filter= lambda do |data, event|
|
77
|
+
count += 1
|
78
|
+
end
|
79
|
+
# Create some events and push
|
80
|
+
[
|
81
|
+
SDL2::Event::Keyboard.cast({type: :KEYDOWN, keysym: {sym: :A}} ).to_event,
|
82
|
+
SDL2::Event::Keyboard.cast({type: :KEYUP, keysym: {sym: :B}} ).to_event,
|
83
|
+
SDL2::Event::Keyboard.cast({type: :KEYDOWN, keysym: {sym: :C}} ).to_event,
|
84
|
+
SDL2::Event::Keyboard.cast({type: :KEYUP, keysym: {sym: :D}} ).to_event,
|
85
|
+
].each {|e|SDL2::Event.push(e)}
|
86
|
+
# Test the routine:
|
87
|
+
SDL2::Event.pump
|
88
|
+
count.should == 4
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should indicate if an SDL::Event::Quit is in the Que' do
|
92
|
+
SDL2::Event.should respond_to(:quit_requested?)
|
93
|
+
#
|
94
|
+
SDL2::Event.quit_requested?.should == false
|
95
|
+
SDL2::Event.push SDL2::Event::Quit.cast({type: :QUIT}).to_event
|
96
|
+
SDL2::Event.quit_requested?.should == true
|
97
|
+
end
|
98
|
+
|
99
|
+
after :each do
|
100
|
+
SDL2.quit
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
|
3
|
+
describe SDL2 do
|
4
|
+
it 'should have the joystick API' do
|
5
|
+
# Joystick API
|
6
|
+
[
|
7
|
+
:joystick_close,
|
8
|
+
:joystick_event_state,
|
9
|
+
:joystick_event_state?,
|
10
|
+
:joystick_get_attached,
|
11
|
+
:joystick_get_attached?,
|
12
|
+
:num_joysticks,
|
13
|
+
:num_joysticks!,
|
14
|
+
:joystick_update,
|
15
|
+
:joystick_open,
|
16
|
+
:joystick_open!,
|
17
|
+
:joystick_num_hats,
|
18
|
+
:joystick_num_hats!,
|
19
|
+
:joystick_num_buttons,
|
20
|
+
:joystick_num_buttons!,
|
21
|
+
:joystick_num_balls,
|
22
|
+
:joystick_num_balls!,
|
23
|
+
:joystick_num_axes,
|
24
|
+
:joystick_num_axes!,
|
25
|
+
:joystick_name_for_index,
|
26
|
+
:joystick_name_for_index!,
|
27
|
+
:joystick_name,
|
28
|
+
:joystick_instance_id,
|
29
|
+
:joystick_instance_id!,
|
30
|
+
:joystick_get_hat,
|
31
|
+
# TODO: Implement Joystick GUID helpers?
|
32
|
+
:joystick_get_guid_string,
|
33
|
+
:joystick_get_guid_from_string,
|
34
|
+
:joystick_get_guid,
|
35
|
+
:joystick_get_device_guid,
|
36
|
+
:joystick_get_button,
|
37
|
+
:joystick_get_ball,
|
38
|
+
:joystick_get_axis,
|
39
|
+
:joystick_get_axis!,
|
40
|
+
].each do |method|
|
41
|
+
SDL2.should respond_to(method)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe SDL2::Joystick do
|
46
|
+
before :each do
|
47
|
+
SDL2.init(:JOYSTICK)
|
48
|
+
joy_count = SDL2.num_joysticks
|
49
|
+
skip "There are no Joysticks" if joy_count < 1
|
50
|
+
|
51
|
+
@joysticks = joy_count.times.map {|idx| SDL2::Joystick.open(idx)}
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
it 'should have a name' do
|
56
|
+
@joysticks.each{|j|j.name.should be_a(String)}
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should have an event state' do
|
60
|
+
@joysticks.each do |joystick|
|
61
|
+
joystick.event_state(:IGNORE)
|
62
|
+
joystick.event_state.should == false
|
63
|
+
joystick.event_state(:ENABLE)
|
64
|
+
joystick.event_state.should == true
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe SDL2::Joystick::Buttons do
|
69
|
+
it 'should return a state for each button on each joystick' do
|
70
|
+
@joysticks.delete_if{|js|js.buttons.count < 1}
|
71
|
+
skip "no buttons" if @joysticks.empty?
|
72
|
+
@joysticks.each do |joystick|
|
73
|
+
joystick.buttons.each do |button|
|
74
|
+
button.should be_a(Integer)
|
75
|
+
button.should >= 0
|
76
|
+
button.should <= 1
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe SDL2::Joystick::Axes do
|
83
|
+
it 'should return an integer for each axis' do
|
84
|
+
@joysticks.delete_if{|js|js.axes.count < 1}
|
85
|
+
skip "no axes" if @joysticks.empty?
|
86
|
+
@joysticks.each do |joystick|
|
87
|
+
joystick.axes.each do |axis|
|
88
|
+
axis.should be_a(Integer)
|
89
|
+
axis.should >= -32768
|
90
|
+
axis.should <= 32767
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe SDL2::Joystick::Balls do
|
97
|
+
it 'should return a delta x, delta y pair' do
|
98
|
+
@joysticks.delete_if {|js|js.balls.count < 1}
|
99
|
+
skip "no balls" if @joysticks.empty?
|
100
|
+
@joysticks.each do |joystick|
|
101
|
+
joystick.balls.each do |ball|
|
102
|
+
ball.should be_a(Array)
|
103
|
+
ball.count.should == 2
|
104
|
+
ball.each do |value|
|
105
|
+
value.should be_a(Integer)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe SDL2::Joystick::Hats do
|
113
|
+
it 'should return a valid SDL2::HAT value' do
|
114
|
+
@joysticks.delete_if{|js|js.hats.count < 1}
|
115
|
+
skip 'no hats' if @joysticks.empty?
|
116
|
+
@joysticks.each do |joystick|
|
117
|
+
joystick.hats.each do |hat|
|
118
|
+
hat.should be_a(Integer)
|
119
|
+
hat.should >= 0
|
120
|
+
hat.should <= 12
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
after :each do
|
127
|
+
SDL2.quit
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|