snake/
title.rs

1//! Game objects and room code for title screen
2
3use 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