1use std::collections::HashMap;
4use sdl2::{
5 event::Event,
6 keyboard::Scancode,
7 rect::Rect
8};
9use ycraft::{
10 collision::CollisionShape,
11 obj::{
12 ControlObjectBehavior, Frame, GameObjectBehavior, GameObjectState, Sprite
13 }, room::Room
14};
15use crate::game::{
16 Img, Snd, Fnt, Spr, Rm, Data
17};
18
19#[derive(Clone)]
20struct TitleScreenImage {
21 state: GameObjectState<Img, Spr, Data>,
22 change_room: bool
23}
24
25impl TitleScreenImage {
26 pub fn new() -> Self {
27 Self {
28 state: GameObjectState {
29 name: "title".to_string(),
30 pos: (0.0, 0.0),
31 collider: CollisionShape::Rect { center: (320, 180), size: (640, 480) },
32 cur_spr: Spr::Title,
33 sprs: HashMap::from([(
34 Spr::Title,
35 Sprite::new(
36 vec![Frame::new(
37 Img::Title, Rect::new(0, 0, 640, 360), (640, 360)
38 )], 0.0, (0, 0)
39 )
40 )]), custom: Data::Title
41 }, change_room: false
42 }
43 }
44}
45
46impl GameObjectBehavior<Img, Snd, Fnt, Spr, Rm, Data> for TitleScreenImage {
47 fn state(&self) -> GameObjectState<Img, Spr, Data> {
48 self.state.clone()
49 }
50
51 fn set_state(&mut self, new_state: &GameObjectState<Img, Spr, Data>) {
52 self.state = new_state.clone();
53 }
54
55 fn on_reset(&mut self) -> bool {
56 self.change_room = false;
57 false
58 }
59
60 fn handle_sdl_event(&mut self, event: &Event) {
61 match event {
62 Event::KeyUp { scancode, .. } if *scancode == Some(Scancode::Return) => {
63 self.change_room = true;
64 }, _ => {}
65 }
66 }
67
68 fn update(
69 &mut self, _delta: f64,
70 _ctl_objs: &Vec<Box<dyn ControlObjectBehavior<Img, Snd, Fnt, Spr, Rm, Data>>>,
71 _others: &Vec<Box<dyn GameObjectBehavior<Img, Snd, Fnt, Spr, Rm, Data>>>) -> (
72 Option<Rm>,
73 Vec<Box<dyn GameObjectBehavior<Img, Snd, Fnt, Spr, Rm, Data>>>
74 ) {
75 if self.change_room {
76 (Some(Rm::Play), vec![])
77 } else {
78 (None, vec![])
79 }
80 }
81}
82
83pub fn title() -> Room<Img, Snd, Fnt, Spr, Rm, Data> {
84 Room::new(
85 vec![ Box::new(TitleScreenImage::new()) ],
86 false
87 )
88}
89