|
- 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::<FontResource>() {
- 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::<SpriteSheetMap>() {
- 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::<ScreenDimensions>()).clone();
-
- self.init(world, dimensions);
- }
- }
|