diff --git a/assets/textures/logo.png b/assets/textures/logo.png new file mode 100644 index 0000000..588d340 Binary files /dev/null and b/assets/textures/logo.png differ diff --git a/lib/cyberarm_engine/animator.rb b/lib/cyberarm_engine/animator.rb index 6440d9e..5be93df 100644 --- a/lib/cyberarm_engine/animator.rb +++ b/lib/cyberarm_engine/animator.rb @@ -1,11 +1,11 @@ module CyberarmEngine class Animator - DEFAULT_TWEEN = :linear - def initialize(start_time:, duration:, from:, to:, &block) + def initialize(start_time:, duration:, from:, to:, tween: :linear, &block) @start_time = start_time @duration = duration @from = from.dup @to = to.dup + @tween = tween @block = block end @@ -14,18 +14,18 @@ module CyberarmEngine end def progress - (@start_time.to_f + (Gosu.milliseconds - @start_time)) / (@start_time + @duration.to_f) + ((Gosu.milliseconds - @start_time) / @duration.to_f).clamp(0.0, 1.0) end def complete? progress >= 1.0 end - def transition(from, to, tween = DEFAULT_TWEEN) + def transition(from = @from, to = @to, tween = @tween) from + (to - from) * send("tween_#{tween}", progress) end - def color_transition(from, to, _tween = DEFAULT_TWEEN) + def color_transition(from = @from, to = @to, _tween = @tween) r = transition(from.red, to.red) g = transition(from.green, to.green) b = transition(from.blue, to.blue) @@ -34,7 +34,7 @@ module CyberarmEngine Gosu::Color.rgba(r, g, b, a) end - def color_hsv_transition(from, to, tween = DEFAULT_TWEEN) + def color_hsv_transition(from = @from, to = @to, tween = @tween) hue = transition(from.hue, to.hue, tween) saturation = transition(from.saturation, to.saturation, tween) value = transition(from.value, to.value, tween) @@ -49,8 +49,8 @@ module CyberarmEngine t end - def tween_sine(t) - Math.sin(t) * t + def tween_ease_in_out(t) + (-0.5 * (Math.cos(Math::PI * t) - 1)) end end end diff --git a/lib/cyberarm_engine/builtin/intro_state.rb b/lib/cyberarm_engine/builtin/intro_state.rb index 83f4702..4258ea9 100644 --- a/lib/cyberarm_engine/builtin/intro_state.rb +++ b/lib/cyberarm_engine/builtin/intro_state.rb @@ -1,53 +1,126 @@ module CyberarmEngine class IntroState < CyberarmEngine::GameState def setup + @display_width = 800 + @display_height = 600 + @title_size = 56 @caption_size = 24 - @title = CyberarmEngine::Text.new("", size: @title_size) - @caption = CyberarmEngine::Text.new("", size: @caption_size) + @title = CyberarmEngine::Text.new("", size: @title_size, shadow_color: 0xaa_222222) + @caption = CyberarmEngine::Text.new("", size: @caption_size, shadow_color: 0xaa_222222) @spacer_width = 256 + @spacer_height = 6 + @padding = 6 - @cyberarm_engine_logo = generate_proxy("CyberarmEngine", "Powered By") + @cyberarm_engine_logo = get_image "#{CYBERARM_ENGINE_ROOT_PATH}/assets/textures/logo.png" - @gosu_logo = generate_proxy("Gosu", "Game Library") - @ruby_logo = generate_proxy("Ruby", "Programming Language") - @sdl2_logo = generate_proxy("SDL2", "Simple DirectMedia Layer") + @gosu_logo = generate_proxy("Gosu", "Game Library", 0xff_111111) + @ruby_logo = generate_proxy("Ruby", "Programming Language", 0xff_880000) + @opengl_logo = generate_proxy("OpenGL", "Graphics API", 0xff_5586a4) if defined?(OpenGL) + + base_time = Gosu.milliseconds + + @animators = [ + Animator.new(start_time: base_time += 1000, duration: 100, from: 0.0, to: 1.0, tween: :ease_in_out), + Animator.new(start_time: base_time += -500, duration: 1_000, from: 0.0, to: 1.0, tween: :ease_in_out), + Animator.new(start_time: base_time += 500, duration: 1_000, from: 0.0, to: 1.0, tween: :ease_in_out), + Animator.new(start_time: base_time += 500, duration: 1_000, from: 0.0, to: 1.0, tween: :ease_in_out), + Animator.new(start_time: base_time + 500, duration: 1_000, from: 0.0, to: 1.0, tween: :ease_in_out), + + Animator.new(start_time: Gosu.milliseconds + 250, duration: 500, from: 0.0, to: 1.0, tween: :ease_in_out) # CyberarmEngine LOGO + ] + + @born_time = Gosu.milliseconds + @continue_after = 5_000 end def draw Gosu.draw_rect(0, 0, window.width, window.height, 0xff_222222) - @cyberarm_engine_logo.draw(window.width / 2 - @cyberarm_engine_logo.width / 2, window.height / 2 - @cyberarm_engine_logo.height, 2) + scale = (@display_width - @padding * 2).to_f / @cyberarm_engine_logo.width * @animators.last.transition - @gosu_logo.draw(6, window.height - @gosu_logo.height - 6, 2) - @ruby_logo.draw(window.width / 2 - @ruby_logo.width / 2, window.height - @ruby_logo.height - 6, 2) - @sdl2_logo.draw(window.width - (@sdl2_logo.width + 6), window.height - @sdl2_logo.height - 6, 2) + @cyberarm_engine_logo.draw_rot( + window.width / 2, + (window.height) / 2 - @cyberarm_engine_logo.height / 2 - @padding * 2, + 2, + 0, + 0.5, + 0.5, + scale, + scale + ) + + Gosu.draw_rect( + window.width / 2 - (@display_width / 2 + @padding), + window.height / 2 - @spacer_height / 2, + @display_width + @padding, + @spacer_height * @animators[0].transition, + Gosu::Color::WHITE + ) + + @title.x = window.width / 2 - @title.width / 2 + @title.y = (window.height / 2 + (@spacer_height / 2) + @padding) * @animators[1].transition + @title.text = "Powered By" + + Gosu.clip_to(0, window.height / 2 + (@spacer_height / 2), window.width, @title.height) do + @title.draw + end + + y = @title.y + @title.height * 2 + + Gosu.clip_to(0, y, window.width, @gosu_logo.height) do + Gosu.translate(@opengl_logo.nil? ? @ruby_logo.width / 2 : 0, 0) do + @gosu_logo.draw( + window.width.to_f / 2 - @ruby_logo.width / 2 - (@ruby_logo.width - @padding), + y * @animators[2].transition, + 2 + ) + @ruby_logo.draw( + window.width.to_f / 2 - @ruby_logo.width / 2, + y * @animators[3].transition, + 2 + ) + @opengl_logo&.draw( + window.width.to_f / 2 - @ruby_logo.width / 2 + (@ruby_logo.width - @padding), + y * @animators[4].transition, + 2 + ) + end + end end def update + @animators.each(&:update) + + return unless Gosu.milliseconds - @born_time >= @continue_after + + pop_state + push_state(@options[:forward], @options[:forward_options] || {}) if @options[:forward] end - def generate_proxy(title, caption) + def button_down(_id) + @continue_after = 0 + end + + def generate_proxy(title, caption, color_hint) @title.text = title @caption.text = caption - padding = 6 - spacer_height = 6 - - width = @spacer_width + 2 * padding - height = @title_size + @caption_size + spacer_height + 2 * padding + spacer_height + width = @spacer_width + 2 * @padding + height = @title_size + @caption_size + @spacer_height + 2 * @padding + @spacer_height Gosu.record(width.ceil, height.ceil) do - @title.x = (width - padding * 2) / 2 - @title.width / 2 - @title.y = padding + @title.x = (width - @padding * 2) / 2 - @title.width / 2 + @title.y = @padding @title.draw - Gosu.draw_rect(0, padding + @title_size + padding, @spacer_width, spacer_height, Gosu::Color::WHITE) + Gosu.draw_rect(0, @padding + @title_size + @padding, @spacer_width, @spacer_height, Gosu::Color::WHITE) + Gosu.draw_rect(1, @padding + @title_size + @padding + 1, @spacer_width - 2, @spacer_height - 2, color_hint) - @caption.x = (width - padding * 2) / 2 - @caption.width / 2 - @caption.y = padding + @title_size + padding + spacer_height + padding + @caption.x = (width - @padding * 2) / 2 - @caption.width / 2 + @caption.y = @padding + @title_size + @padding + @spacer_height + @padding @caption.draw end end diff --git a/lib/cyberarm_engine/common.rb b/lib/cyberarm_engine/common.rb index 6e1ed30..ca3dece 100644 --- a/lib/cyberarm_engine/common.rb +++ b/lib/cyberarm_engine/common.rb @@ -16,6 +16,10 @@ module CyberarmEngine window.pop_state end + def shift_state + window.shift_state + end + def show_cursor window.show_cursor end diff --git a/lib/cyberarm_engine/text.rb b/lib/cyberarm_engine/text.rb index c10ca01..70cada6 100644 --- a/lib/cyberarm_engine/text.rb +++ b/lib/cyberarm_engine/text.rb @@ -149,6 +149,7 @@ module CyberarmEngine @textobject.send(method, @text, _x + @shadow_size, _y, @z, @factor_x, @factor_y, white, :add) @textobject.send(method, @text, _x + @shadow_size, _y + @shadow_size, @z, @factor_x, @factor_y, white, :add) end + @rendered_shadow.draw(@x - @shadow_size, @y - @shadow_size, @z, @factor_x, @factor_y, shadow_color) end diff --git a/lib/cyberarm_engine/window.rb b/lib/cyberarm_engine/window.rb index cf4a929..67d4441 100644 --- a/lib/cyberarm_engine/window.rb +++ b/lib/cyberarm_engine/window.rb @@ -95,7 +95,7 @@ module CyberarmEngine end def previous_state - if @states.size > 1 && state = @states[@states.size - 2] + if @states.size > 1 && (state = @states[@states.size - 2]) state end end @@ -104,6 +104,10 @@ module CyberarmEngine @states.pop end + def shift_state + @states.shift + end + # Sourced from https://gist.github.com/ippa/662583 def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10) 0.step(360, step) do |a1|