Ragnarokkr/gameover.odin

90 lines
2.3 KiB
Odin

package main
import rl "vendor:raylib"
import "core:math/ease"
import "core:fmt"
GameOver :: struct {
using state: GameState,
position: vec2,
size: vec2,
ready_to_go: bool,
}
gameover_init :: proc(prev: ^GameState = nil) -> ^GameState {
state := new(GameOver)
state.variant = state
state.position = vec2{WSize.x / 2, WSize.y + 300}
state.size = {700, 500}
state.update = gameover_update
state.draw = gameover_draw
state.free = gameover_free
state.previous = prev
tween_to(&state.position.y, WSize.y / 2, 1, ease.Ease.Back_Out, state, gameover_ready)
return state
}
gameover_update :: proc(state: ^GameState, delta: f32) {
gameover := transmute(^GameOver)state
if gameover.ready_to_go {
if rl.IsKeyPressed(rl.KeyboardKey.ESCAPE) {
gameover.ready_to_go = false
rl.StopMusicStream(current_music)
tween_to(&Overlay_Opacity, 1.0, 0.5, ease.Ease.Cubic_Out, nil, proc(data: rawptr) {
stack_pop()
state := transmute(^GameState)stack_top()
fmt.println(state.variant)
game := transmute(^Game)stack_top()
game_setup(game)
menu := menu_init(game)
stack_push(menu)
tween_to(&Overlay_Opacity, 0, 0.5, ease.Ease.Cubic_Out)
})
}
}
}
gameover_draw :: proc(state: ^GameState) {
gameover := transmute(^GameOver)state
if state.previous != nil {
state.previous->draw()
}
TitleFontSize :: 96
TitleSpacing :: 3
TitleText :: "GAME OVER"
TitleSize := rl.MeasureTextEx(Res.Fonts.Title, TitleText, TitleFontSize, TitleSpacing)
SubtitleText := [?]cstring{"Нажмите Escape чтобы выйти"}
SubtitleFontSize :: 48
SubtitleSpacing :: 2
SubtitleSizes := [?]vec2{{}}
for c, i in SubtitleText {
SubtitleSizes = rl.MeasureTextEx(Res.Fonts.UI, c, SubtitleFontSize, SubtitleSpacing)
}
rl.DrawRectangleV(gameover.position - gameover.size / 2, gameover.size, rl.Color{90, 30, 150, 10})
rl.DrawTextPro(Res.Fonts.Title, TitleText, gameover.position - {0, 100}, TitleSize / 2, 0, TitleFontSize, TitleSpacing, rl.WHITE)
for c, i in SubtitleText {
rl.DrawTextPro(Res.Fonts.UI, c, gameover.position - {0, f32(10 - i * 50)}, SubtitleSizes[i] / 2, 0, SubtitleFontSize, SubtitleSpacing, rl.WHITE)
}
}
gameover_free :: proc(state: ^GameState) {
free(state)
}
gameover_ready :: proc(state: rawptr) {
gameover := transmute(^GameOver)state
gameover.ready_to_go = true
}