use crate::resources::{font::FontResource, spritesheet::SpriteSheetMap}; use amethyst::{ core::transform::Transform, prelude::*, renderer::{Camera, SpriteRender}, ui::{Anchor, UiImage, UiText, UiTransform}, window::ScreenDimensions, }; use nalgebra::Vector3; const DEFAULT_SPRITE_WIDTH: f32 = 256.0; const DEFAULT_SPRITE_HEIGHT: f32 = 144.0; /// struct for title screen state pub struct TitleScreenState; impl TitleScreenState { /// initialize the titlescreen fn init(&self, world: &mut World, dimensions: ScreenDimensions) { self.init_camera(world, &dimensions); self.init_ui(world); self.init_scenery(world, &dimensions); } // initialize the camera fn init_camera(&self, world: &mut World, dimensions: &ScreenDimensions) { let mut transform = Transform::default(); transform.set_translation_xyz(dimensions.width() * 0.5, dimensions.height() * 0.5, 1.0); world .create_entity() .with(Camera::standard_2d(dimensions.width(), dimensions.height())) .with(transform) .build(); } fn init_ui(&self, world: &mut World) { // get the font handle let font_handle = { if let Some(font_rsc) = world.try_fetch::() { font_rsc.get_handle().clone() } else { panic!("failed to get a handle on font resource"); } }; // create the button transforms let exit_btn_transform = UiTransform::new( "exit_button".into(), Anchor::BottomRight, Anchor::Middle, -100.0, 50.0, 0.0, 100.0, 50.0, ); let settings_btn_transform = UiTransform::new( "settings_button".into(), Anchor::BottomRight, Anchor::Middle, 0.0, 0.0, 0.0, 200.0, 50.0, ); // create the button ui text let exit_btn_text = UiText::new(font_handle.clone(), "Exit".into(), [1.0, 1.0, 1.0, 1.0], 30.0); let settings_btn_text = UiText::new(font_handle, "Settings".into(), [1.0, 1.0, 1.0, 1.0], 30.0); // create ui image let btn_image = UiImage::SolidColor([0.0, 0.0, 0.0, 1.0]); // create the button world .create_entity() .with(exit_btn_transform) .with(exit_btn_text) .with(btn_image.clone()) .build(); world .create_entity() .with(settings_btn_transform) .with(settings_btn_text) .with(btn_image) .build(); } // initialize the scenery fn init_scenery(&self, world: &mut World, dimensions: &ScreenDimensions) { // create the scale vector let scale_vector = Vector3::new( dimensions.width() / DEFAULT_SPRITE_WIDTH, dimensions.height() / DEFAULT_SPRITE_HEIGHT, 0.0, ); // create scenery transform let mut transform = Transform::default(); transform.set_translation_xyz(dimensions.width() * 0.5, dimensions.height() * 0.5, 0.0); transform.set_scale(scale_vector); // get the sprite sheet from the map let spritesheet_handle = { if let Some(map) = world.try_fetch::() { map.get_handle("title_screen".into()) .expect("could not find title_screen sprite sheet") .clone() } else { panic!("failed to get a handle on the spritesheet map") } }; // create a sprite render let mut sprite_render = SpriteRender { sprite_sheet: spritesheet_handle, sprite_number: 2 }; // render background stuff world.create_entity().with(transform.clone()).with(sprite_render.clone()).build(); sprite_render.sprite_number = 1; world.create_entity().with(transform.clone()).with(sprite_render.clone()).build(); sprite_render.sprite_number = 0; world.create_entity().with(transform.clone()).with(sprite_render.clone()).build(); sprite_render.sprite_number = 3; world.create_entity().with(transform.clone()).with(sprite_render.clone()).build(); sprite_render.sprite_number = 4; world.create_entity().with(transform.clone()).with(sprite_render.clone()).build(); } } impl SimpleState for TitleScreenState { fn on_start(&mut self, data: StateData<'_, GameData<'_, '_>>) { let world = data.world; let dimensions = (*world.read_resource::()).clone(); self.init(world, dimensions); } }