mirror of
https://github.com/cyberarm/cyberarm_engine.git
synced 2025-12-15 12:42:34 +00:00
Updated Animator to be usable, added logo texture/image, 'finished' Intro state, added Window#shift_state
This commit is contained in:
BIN
assets/textures/logo.png
Normal file
BIN
assets/textures/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -1,11 +1,11 @@
|
|||||||
module CyberarmEngine
|
module CyberarmEngine
|
||||||
class Animator
|
class Animator
|
||||||
DEFAULT_TWEEN = :linear
|
def initialize(start_time:, duration:, from:, to:, tween: :linear, &block)
|
||||||
def initialize(start_time:, duration:, from:, to:, &block)
|
|
||||||
@start_time = start_time
|
@start_time = start_time
|
||||||
@duration = duration
|
@duration = duration
|
||||||
@from = from.dup
|
@from = from.dup
|
||||||
@to = to.dup
|
@to = to.dup
|
||||||
|
@tween = tween
|
||||||
@block = block
|
@block = block
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -14,18 +14,18 @@ module CyberarmEngine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def progress
|
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
|
end
|
||||||
|
|
||||||
def complete?
|
def complete?
|
||||||
progress >= 1.0
|
progress >= 1.0
|
||||||
end
|
end
|
||||||
|
|
||||||
def transition(from, to, tween = DEFAULT_TWEEN)
|
def transition(from = @from, to = @to, tween = @tween)
|
||||||
from + (to - from) * send("tween_#{tween}", progress)
|
from + (to - from) * send("tween_#{tween}", progress)
|
||||||
end
|
end
|
||||||
|
|
||||||
def color_transition(from, to, _tween = DEFAULT_TWEEN)
|
def color_transition(from = @from, to = @to, _tween = @tween)
|
||||||
r = transition(from.red, to.red)
|
r = transition(from.red, to.red)
|
||||||
g = transition(from.green, to.green)
|
g = transition(from.green, to.green)
|
||||||
b = transition(from.blue, to.blue)
|
b = transition(from.blue, to.blue)
|
||||||
@@ -34,7 +34,7 @@ module CyberarmEngine
|
|||||||
Gosu::Color.rgba(r, g, b, a)
|
Gosu::Color.rgba(r, g, b, a)
|
||||||
end
|
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)
|
hue = transition(from.hue, to.hue, tween)
|
||||||
saturation = transition(from.saturation, to.saturation, tween)
|
saturation = transition(from.saturation, to.saturation, tween)
|
||||||
value = transition(from.value, to.value, tween)
|
value = transition(from.value, to.value, tween)
|
||||||
@@ -49,8 +49,8 @@ module CyberarmEngine
|
|||||||
t
|
t
|
||||||
end
|
end
|
||||||
|
|
||||||
def tween_sine(t)
|
def tween_ease_in_out(t)
|
||||||
Math.sin(t) * t
|
(-0.5 * (Math.cos(Math::PI * t) - 1))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,53 +1,126 @@
|
|||||||
module CyberarmEngine
|
module CyberarmEngine
|
||||||
class IntroState < CyberarmEngine::GameState
|
class IntroState < CyberarmEngine::GameState
|
||||||
def setup
|
def setup
|
||||||
|
@display_width = 800
|
||||||
|
@display_height = 600
|
||||||
|
|
||||||
@title_size = 56
|
@title_size = 56
|
||||||
@caption_size = 24
|
@caption_size = 24
|
||||||
|
|
||||||
@title = CyberarmEngine::Text.new("", size: @title_size)
|
@title = CyberarmEngine::Text.new("", size: @title_size, shadow_color: 0xaa_222222)
|
||||||
@caption = CyberarmEngine::Text.new("", size: @caption_size)
|
@caption = CyberarmEngine::Text.new("", size: @caption_size, shadow_color: 0xaa_222222)
|
||||||
|
|
||||||
@spacer_width = 256
|
@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")
|
@gosu_logo = generate_proxy("Gosu", "Game Library", 0xff_111111)
|
||||||
@ruby_logo = generate_proxy("Ruby", "Programming Language")
|
@ruby_logo = generate_proxy("Ruby", "Programming Language", 0xff_880000)
|
||||||
@sdl2_logo = generate_proxy("SDL2", "Simple DirectMedia Layer")
|
@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
|
end
|
||||||
|
|
||||||
def draw
|
def draw
|
||||||
Gosu.draw_rect(0, 0, window.width, window.height, 0xff_222222)
|
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)
|
@cyberarm_engine_logo.draw_rot(
|
||||||
@ruby_logo.draw(window.width / 2 - @ruby_logo.width / 2, window.height - @ruby_logo.height - 6, 2)
|
window.width / 2,
|
||||||
@sdl2_logo.draw(window.width - (@sdl2_logo.width + 6), window.height - @sdl2_logo.height - 6, 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
|
end
|
||||||
|
|
||||||
def update
|
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
|
end
|
||||||
|
|
||||||
def generate_proxy(title, caption)
|
def button_down(_id)
|
||||||
|
@continue_after = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_proxy(title, caption, color_hint)
|
||||||
@title.text = title
|
@title.text = title
|
||||||
@caption.text = caption
|
@caption.text = caption
|
||||||
|
|
||||||
padding = 6
|
width = @spacer_width + 2 * @padding
|
||||||
spacer_height = 6
|
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
|
Gosu.record(width.ceil, height.ceil) do
|
||||||
@title.x = (width - padding * 2) / 2 - @title.width / 2
|
@title.x = (width - @padding * 2) / 2 - @title.width / 2
|
||||||
@title.y = padding
|
@title.y = @padding
|
||||||
@title.draw
|
@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.x = (width - @padding * 2) / 2 - @caption.width / 2
|
||||||
@caption.y = padding + @title_size + padding + spacer_height + padding
|
@caption.y = @padding + @title_size + @padding + @spacer_height + @padding
|
||||||
@caption.draw
|
@caption.draw
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ module CyberarmEngine
|
|||||||
window.pop_state
|
window.pop_state
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def shift_state
|
||||||
|
window.shift_state
|
||||||
|
end
|
||||||
|
|
||||||
def show_cursor
|
def show_cursor
|
||||||
window.show_cursor
|
window.show_cursor
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -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, @z, @factor_x, @factor_y, white, :add)
|
||||||
@textobject.send(method, @text, _x + @shadow_size, _y + @shadow_size, @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
|
end
|
||||||
|
|
||||||
@rendered_shadow.draw(@x - @shadow_size, @y - @shadow_size, @z, @factor_x, @factor_y, shadow_color)
|
@rendered_shadow.draw(@x - @shadow_size, @y - @shadow_size, @z, @factor_x, @factor_y, shadow_color)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ module CyberarmEngine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def previous_state
|
def previous_state
|
||||||
if @states.size > 1 && state = @states[@states.size - 2]
|
if @states.size > 1 && (state = @states[@states.size - 2])
|
||||||
state
|
state
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -104,6 +104,10 @@ module CyberarmEngine
|
|||||||
@states.pop
|
@states.pop
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def shift_state
|
||||||
|
@states.shift
|
||||||
|
end
|
||||||
|
|
||||||
# Sourced from https://gist.github.com/ippa/662583
|
# Sourced from https://gist.github.com/ippa/662583
|
||||||
def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10)
|
def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10)
|
||||||
0.step(360, step) do |a1|
|
0.step(360, step) do |a1|
|
||||||
|
|||||||
Reference in New Issue
Block a user