Merchant Seas Game
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 rivejä
4.7 KiB

  1. use crate::resources::{font::FontResource, spritesheet::SpriteSheetMap};
  2. use amethyst::{
  3. core::transform::Transform,
  4. prelude::*,
  5. renderer::{Camera, SpriteRender},
  6. ui::{Anchor, UiImage, UiText, UiTransform},
  7. window::ScreenDimensions,
  8. };
  9. use nalgebra::Vector3;
  10. const DEFAULT_SPRITE_WIDTH: f32 = 256.0;
  11. const DEFAULT_SPRITE_HEIGHT: f32 = 144.0;
  12. /// struct for title screen state
  13. pub struct TitleScreenState;
  14. impl TitleScreenState {
  15. /// initialize the titlescreen
  16. fn init(&self, world: &mut World, dimensions: ScreenDimensions) {
  17. self.init_camera(world, &dimensions);
  18. self.init_ui(world);
  19. self.init_scenery(world, &dimensions);
  20. }
  21. // initialize the camera
  22. fn init_camera(&self, world: &mut World, dimensions: &ScreenDimensions) {
  23. let mut transform = Transform::default();
  24. transform.set_translation_xyz(dimensions.width() * 0.5, dimensions.height() * 0.5, 1.0);
  25. world
  26. .create_entity()
  27. .with(Camera::standard_2d(dimensions.width(), dimensions.height()))
  28. .with(transform)
  29. .build();
  30. }
  31. fn init_ui(&self, world: &mut World) {
  32. // get the font handle
  33. let font_handle = {
  34. if let Some(font_rsc) = world.try_fetch::<FontResource>() {
  35. font_rsc.get_handle().clone()
  36. } else {
  37. panic!("failed to get a handle on font resource");
  38. }
  39. };
  40. // create the button transforms
  41. let exit_btn_transform = UiTransform::new(
  42. "exit_button".into(),
  43. Anchor::BottomRight,
  44. Anchor::Middle,
  45. -100.0,
  46. 50.0,
  47. 0.0,
  48. 100.0,
  49. 50.0,
  50. );
  51. let settings_btn_transform = UiTransform::new(
  52. "settings_button".into(),
  53. Anchor::BottomRight,
  54. Anchor::Middle,
  55. 0.0,
  56. 0.0,
  57. 0.0,
  58. 200.0,
  59. 50.0,
  60. );
  61. // create the button ui text
  62. let exit_btn_text =
  63. UiText::new(font_handle.clone(), "Exit".into(), [1.0, 1.0, 1.0, 1.0], 30.0);
  64. let settings_btn_text =
  65. UiText::new(font_handle, "Settings".into(), [1.0, 1.0, 1.0, 1.0], 30.0);
  66. // create ui image
  67. let btn_image = UiImage::SolidColor([0.0, 0.0, 0.0, 1.0]);
  68. // create the button
  69. world
  70. .create_entity()
  71. .with(exit_btn_transform)
  72. .with(exit_btn_text)
  73. .with(btn_image.clone())
  74. .build();
  75. world
  76. .create_entity()
  77. .with(settings_btn_transform)
  78. .with(settings_btn_text)
  79. .with(btn_image)
  80. .build();
  81. }
  82. // initialize the scenery
  83. fn init_scenery(&self, world: &mut World, dimensions: &ScreenDimensions) {
  84. // create the scale vector
  85. let scale_vector = Vector3::new(
  86. dimensions.width() / DEFAULT_SPRITE_WIDTH,
  87. dimensions.height() / DEFAULT_SPRITE_HEIGHT,
  88. 0.0,
  89. );
  90. // create scenery transform
  91. let mut transform = Transform::default();
  92. transform.set_translation_xyz(dimensions.width() * 0.5, dimensions.height() * 0.5, 0.0);
  93. transform.set_scale(scale_vector);
  94. // get the sprite sheet from the map
  95. let spritesheet_handle = {
  96. if let Some(map) = world.try_fetch::<SpriteSheetMap>() {
  97. map.get_handle("title_screen".into())
  98. .expect("could not find title_screen sprite sheet")
  99. .clone()
  100. } else {
  101. panic!("failed to get a handle on the spritesheet map")
  102. }
  103. };
  104. // create a sprite render
  105. let mut sprite_render = SpriteRender { sprite_sheet: spritesheet_handle, sprite_number: 2 };
  106. // render background stuff
  107. world.create_entity().with(transform.clone()).with(sprite_render.clone()).build();
  108. sprite_render.sprite_number = 1;
  109. world.create_entity().with(transform.clone()).with(sprite_render.clone()).build();
  110. sprite_render.sprite_number = 0;
  111. world.create_entity().with(transform.clone()).with(sprite_render.clone()).build();
  112. sprite_render.sprite_number = 3;
  113. world.create_entity().with(transform.clone()).with(sprite_render.clone()).build();
  114. sprite_render.sprite_number = 4;
  115. world.create_entity().with(transform.clone()).with(sprite_render.clone()).build();
  116. }
  117. }
  118. impl SimpleState for TitleScreenState {
  119. fn on_start(&mut self, data: StateData<'_, GameData<'_, '_>>) {
  120. let world = data.world;
  121. let dimensions = (*world.read_resource::<ScreenDimensions>()).clone();
  122. self.init(world, dimensions);
  123. }
  124. }