From c0c276de8c075cbc2526caba24f9dd86f360611f Mon Sep 17 00:00:00 2001 From: Jeremy Woertink Date: Sun, 17 Sep 2017 15:46:20 -0700 Subject: [PATCH 1/4] adding in SDL_Timer with sample running basic timing --- samples/22_timing.cr | 38 ++++++++++++++++++++++++++++++++++++++ src/lib_sdl.cr | 1 + src/lib_sdl/timer.cr | 13 +++++++++++++ src/sdl.cr | 1 + src/timer.cr | 12 ++++++++++++ 5 files changed, 65 insertions(+) create mode 100644 samples/22_timing.cr create mode 100644 src/lib_sdl/timer.cr create mode 100644 src/timer.cr diff --git a/samples/22_timing.cr b/samples/22_timing.cr new file mode 100644 index 0000000..05a8836 --- /dev/null +++ b/samples/22_timing.cr @@ -0,0 +1,38 @@ +require "../src/sdl" +require "../src/image" +require "../src/ttf" + +SDL.init(SDL::Init::VIDEO); at_exit { SDL.quit } +SDL::TTF.init; at_exit { SDL::TTF.quit } + +window = SDL::Window.new("SDL tutorial", 640, 480) +renderer = SDL::Renderer.new(window, SDL::Renderer::Flags::ACCELERATED | SDL::Renderer::Flags::PRESENTVSYNC) + +font = SDL::TTF::Font.new(File.join(__DIR__, "data", "lazy.ttf"), 28) +font_color = SDL::Color[0, 0, 0, 255] + +renderer.draw_color = SDL::Color[255, 255, 255, 255] +prompt_surface = font.render_shaded("Press Enter to Reset Start Time.", font_color, renderer.draw_color) + +start_time = 0 + +loop do + case event = SDL::Event.poll + when SDL::Event::Quit + break + when SDL::Event::Keyboard + if event.keydown? && event.sym.return? + start_time = SDL::Timer.ticks + end + end + renderer.clear + prompt_x = (window.width - prompt_surface.width) / 2 + renderer.copy(prompt_surface, dstrect: SDL::Rect[prompt_x, 0, prompt_surface.width, prompt_surface.height]) + + time_text_surface = font.render_shaded("Milliseconds since start time #{SDL::Timer.ticks - start_time}", font_color, renderer.draw_color) + time_text_x = (window.width - time_text_surface.width) / 2 + time_text_y = (window.height - time_text_surface.height) / 2 + renderer.copy(time_text_surface, dstrect: SDL::Rect[time_text_x, time_text_y, time_text_surface.width, time_text_surface.height]) + + renderer.present +end diff --git a/src/lib_sdl.cr b/src/lib_sdl.cr index 11a6c35..0ad455e 100644 --- a/src/lib_sdl.cr +++ b/src/lib_sdl.cr @@ -16,6 +16,7 @@ require "./lib_sdl/render" require "./lib_sdl/rwops" require "./lib_sdl/shape" #require "./lib_sdl/system" +require "./lib_sdl/timer" require "./lib_sdl/video" @[Link("SDL2")] diff --git a/src/lib_sdl/timer.cr b/src/lib_sdl/timer.cr new file mode 100644 index 0000000..02f32fd --- /dev/null +++ b/src/lib_sdl/timer.cr @@ -0,0 +1,13 @@ +lib LibSDL + # (interval, params) + alias TimerCallback = (UInt32, Void*) -> Void + alias TimerID = LibC::Int + + fun add_timer = SDL_AddTimer(interval : UInt32, callback : TimerCallback, param : Void*) : TimerID + fun delay = SDL_Delay(ms : UInt32) : Void + fun get_performance_counter = SDL_GetPerformanceCounter() : UInt64 + fun get_performance_frequence = SDL_GetPerformanceFrequency() : UInt64 + fun get_ticks = SDL_GetTicks() : UInt32 + fun remove_timer = SDL_RemoveTimer(id : TimerID) : Bool + fun ticks_passed = SDL_TICKS_PASSED(a : UInt32, b : UInt32) : Bool +end diff --git a/src/sdl.cr b/src/sdl.cr index fa2f00e..dba1725 100644 --- a/src/sdl.cr +++ b/src/sdl.cr @@ -21,6 +21,7 @@ require "./renderer" require "./window" require "./screensaver" require "./color" +require "./timer" module SDL class Error < Exception diff --git a/src/timer.cr b/src/timer.cr new file mode 100644 index 0000000..876da7e --- /dev/null +++ b/src/timer.cr @@ -0,0 +1,12 @@ +module SDL + module Timer + + def self.add(interval, &callback : UInt32 -> Void) + LibSDL.add_timer(interval, callback) + end + + def self.ticks + LibSDL.get_ticks + end + end +end From ef5ed82b96fea644ce3504413e1e6c48d5e96489 Mon Sep 17 00:00:00 2001 From: Jeremy Woertink Date: Sun, 17 Sep 2017 16:31:06 -0700 Subject: [PATCH 2/4] added extra sample for showing a more advanced custom timer. --- samples/23_advanced_timers.cr | 117 ++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 samples/23_advanced_timers.cr diff --git a/samples/23_advanced_timers.cr b/samples/23_advanced_timers.cr new file mode 100644 index 0000000..cf8296f --- /dev/null +++ b/samples/23_advanced_timers.cr @@ -0,0 +1,117 @@ +require "../src/sdl" +require "../src/image" +require "../src/ttf" + +SDL.init(SDL::Init::VIDEO); at_exit { SDL.quit } +SDL::TTF.init; at_exit { SDL::TTF.quit } + +window = SDL::Window.new("SDL tutorial", 640, 480) +renderer = SDL::Renderer.new(window, SDL::Renderer::Flags::ACCELERATED | SDL::Renderer::Flags::PRESENTVSYNC) + +font = SDL::TTF::Font.new(File.join(__DIR__, "data", "lazy.ttf"), 28) +font_color = SDL::Color[0, 0, 0, 255] + +renderer.draw_color = SDL::Color[255, 255, 255, 255] +bg_color = renderer.draw_color +start_prompt_surface = font.render_shaded("Press S to Start or Stop the Timer", font_color, bg_color) +pause_prompt_surface = font.render_shaded("Press P to Pause or Unpause the Timer", font_color, bg_color) + +class SampleTimer + property started : Bool = false + property paused : Bool = false + property start_ticks : UInt32 = 0_u32 + property paused_ticks : UInt32 = 0_u32 + + def ticks + time = 0 + if started? + if paused? + time = @paused_ticks + else + time = SDL::Timer.ticks - @start_ticks + end + end + time + end + + def start + @started = true + @paused = false + @start_ticks = SDL::Timer.ticks + @paused_ticks = 0_u32 + end + + def stop + @started = false + @paused = false + @start_ticks = 0_u32 + @paused_ticks = 0_u32 + end + + def started? + @started + end + + def toggle_on_state + started? ? stop : start + end + + def pause + unless paused? + @paused = true + @paused_ticks = SDL::Timer.ticks - @start_ticks + @start_ticks = 0_u32 + end + end + + def unpause + if paused? + @paused = false + @start_ticks = SDL::Timer.ticks - @paused_ticks + @paused_ticks = 0_u32 + end + end + + def paused? + @paused && @started + end + + def toggle_pause_state + paused? ? unpause : pause + end +end + +timer = SampleTimer.new + +loop do + case event = SDL::Event.poll + when SDL::Event::Quit + break + when SDL::Event::Keyboard + if event.keydown? + case event.sym + when .s? + timer.toggle_on_state + when .p? + timer.toggle_pause_state + end + end + end + renderer.clear + # Render the start prompt text + start_prompt_x = (window.width - start_prompt_surface.width) / 2 + renderer.copy(start_prompt_surface, dstrect: SDL::Rect[start_prompt_x, 0, start_prompt_surface.width, start_prompt_surface.height]) + + # Render the pause prompt text + pause_prompt_x = (window.width - pause_prompt_surface.width) / 2 + renderer.copy(pause_prompt_surface, dstrect: SDL::Rect[pause_prompt_x, start_prompt_surface.height, pause_prompt_surface.width, pause_prompt_surface.height]) + + # Render the action text + time_text_surface = font.render_shaded("Seconds since start time #{timer.ticks / 1000.0}", font_color, bg_color) + time_text_x = (window.width - time_text_surface.width) / 2 + time_text_y = (window.height - time_text_surface.height) / 2 + renderer.copy(time_text_surface, dstrect: SDL::Rect[time_text_x, time_text_y, time_text_surface.width, time_text_surface.height]) + + renderer.present +end + From 13a2c756d128d5d419b628d363d42bd931bc5a45 Mon Sep 17 00:00:00 2001 From: Jeremy Woertink Date: Sun, 17 Sep 2017 16:40:32 -0700 Subject: [PATCH 3/4] fixing typo --- src/lib_sdl/timer.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib_sdl/timer.cr b/src/lib_sdl/timer.cr index 02f32fd..8880fc1 100644 --- a/src/lib_sdl/timer.cr +++ b/src/lib_sdl/timer.cr @@ -6,7 +6,7 @@ lib LibSDL fun add_timer = SDL_AddTimer(interval : UInt32, callback : TimerCallback, param : Void*) : TimerID fun delay = SDL_Delay(ms : UInt32) : Void fun get_performance_counter = SDL_GetPerformanceCounter() : UInt64 - fun get_performance_frequence = SDL_GetPerformanceFrequency() : UInt64 + fun get_performance_frequency = SDL_GetPerformanceFrequency() : UInt64 fun get_ticks = SDL_GetTicks() : UInt32 fun remove_timer = SDL_RemoveTimer(id : TimerID) : Bool fun ticks_passed = SDL_TICKS_PASSED(a : UInt32, b : UInt32) : Bool From 77edd7bd7e90ad812a29bb2839e506c54ee012be Mon Sep 17 00:00:00 2001 From: Jeremy Woertink Date: Sun, 17 Sep 2017 16:41:29 -0700 Subject: [PATCH 4/4] adding in the rest of the timer methods --- src/timer.cr | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/timer.cr b/src/timer.cr index 876da7e..0b4db8e 100644 --- a/src/timer.cr +++ b/src/timer.cr @@ -5,8 +5,24 @@ module SDL LibSDL.add_timer(interval, callback) end + def self.delay(ms : UInt32) + LibSDL.delay(ms) + end + + def self.performance_counter + LibSDL.get_performance_counter + end + + def self.performance_frequency + LibSDL.get_performance_frequency + end + def self.ticks LibSDL.get_ticks end + + def self.remove(timer_id) + LibSDL.remove_timer(timer_id) + end end end