@@ -1,13 +0,0 @@ | |||||
pub mod title_screen; | |||||
use amethyst::prelude::*; | |||||
use title_screen::TitleScreen; | |||||
/// a simple state for initializing the game | |||||
pub struct InitialState; | |||||
impl SimpleState for InitialState { | |||||
fn on_start(&mut self, _data: StateData<'_, GameData<'_, '_>>) { | |||||
Trans::Push(Box::new(TitleScreen)); | |||||
} | |||||
} |
@@ -1,47 +0,0 @@ | |||||
use amethyst::ecs::prelude::*; | |||||
// deep water component | |||||
pub struct DeepWater { | |||||
pub y: f32, | |||||
} | |||||
impl Component for DeepWater { | |||||
type Storage = DenseVecStorage<Self>; | |||||
} | |||||
// shallow water component | |||||
pub struct ShallowWater { | |||||
pub y: f32, | |||||
} | |||||
impl Component for ShallowWater { | |||||
type Storage = DenseVecStorage<Self>; | |||||
} | |||||
// islands component | |||||
pub struct Islands; | |||||
impl Component for Islands { | |||||
type Storage = DenseVecStorage<Self>; | |||||
} | |||||
// sea component | |||||
pub struct Sea; | |||||
impl Component for Sea { | |||||
type Storage = DenseVecStorage<Self>; | |||||
} | |||||
// sky component | |||||
pub struct Sky; | |||||
impl Component for Sky { | |||||
type Storage = DenseVecStorage<Self>; | |||||
} | |||||
// title component | |||||
pub struct Title; | |||||
impl Component for Title { | |||||
type Storage = DenseVecStorage<Self>; | |||||
} |
@@ -1,171 +0,0 @@ | |||||
mod components; | |||||
// namespacing | |||||
use crate::utils::{load_font, load_sprite_sheet, load_texture}; | |||||
use amethyst::{ | |||||
assets::Handle, | |||||
core::transform::Transform, | |||||
ecs::prelude::*, | |||||
prelude::*, | |||||
renderer::{Camera, SpriteRender, SpriteSheet}, | |||||
ui::{Anchor, FontAsset, UiText, UiTransform}, | |||||
window::ScreenDimensions, | |||||
}; | |||||
use components::*; | |||||
use nalgebra::Vector3; | |||||
// constants | |||||
const DEFAULT_SPRITE_WIDTH: f32 = 256.0; | |||||
const DEFAULT_SPRITE_HEIGHT: f32 = 144.0; | |||||
/// a simple state for the title screen | |||||
pub struct TitleScreen; | |||||
impl SimpleState for TitleScreen { | |||||
fn on_start(&mut self, data: StateData<'_, GameData<'_, '_>>) { | |||||
let world = data.world; | |||||
let dimensions = (*world.read_resource::<ScreenDimensions>()).clone(); | |||||
let sprite_sheet = init_sprite_sheet(world); | |||||
let font_asset = load_font("fnt/8x8_wide_mono_bold.ttf", world); | |||||
world.register::<DeepWater>(); | |||||
world.register::<ShallowWater>(); | |||||
world.register::<Islands>(); | |||||
world.register::<Sky>(); | |||||
world.register::<Sea>(); | |||||
init_scene_entities(world, sprite_sheet, font_asset, &dimensions); | |||||
init_camera(world, &dimensions); | |||||
} | |||||
fn handle_event( | |||||
&mut self, | |||||
mut _data: StateData<'_, GameData<'_, '_>>, | |||||
_event: StateEvent, | |||||
) -> SimpleTrans { | |||||
// keep going | |||||
Trans::None | |||||
} | |||||
} | |||||
fn init_sprite_sheet(world: &World) -> Handle<SpriteSheet> { | |||||
let texture_handle = load_texture("img/title_screen_texture.png", world); | |||||
load_sprite_sheet("img/title_screen_sprite_sheet.ron", world, texture_handle) | |||||
} | |||||
// initialize the camera | |||||
fn init_camera(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(); | |||||
} | |||||
// initailize the entities for the scene | |||||
fn init_scene_entities( | |||||
world: &mut World, | |||||
sprite_sheet_handle: Handle<SpriteSheet>, | |||||
font_asset_handle: Handle<FontAsset>, | |||||
dimensions: &ScreenDimensions, | |||||
) { | |||||
// create the scale vector | |||||
let scale_vector3 = Vector3::new( | |||||
dimensions.width() / DEFAULT_SPRITE_WIDTH, | |||||
dimensions.height() / DEFAULT_SPRITE_HEIGHT, | |||||
0.0, | |||||
); | |||||
// create the scenery transform | |||||
let mut scenery_transform = Transform::default(); | |||||
scenery_transform.set_translation_xyz(dimensions.width() * 0.5, dimensions.height() * 0.5, 0.0); | |||||
scenery_transform.set_scale(scale_vector3); | |||||
// create the shallow water entity | |||||
let sprite_render = SpriteRender { | |||||
sprite_sheet: sprite_sheet_handle.clone(), | |||||
sprite_number: 1, | |||||
}; | |||||
world | |||||
.create_entity() | |||||
.with(ShallowWater { y: 0.0 }) | |||||
.with(scenery_transform.clone()) | |||||
.with(sprite_render) | |||||
.build(); | |||||
// create the deep water entity | |||||
let sprite_render = SpriteRender { | |||||
sprite_sheet: sprite_sheet_handle.clone(), | |||||
sprite_number: 0, | |||||
}; | |||||
world | |||||
.create_entity() | |||||
.with(DeepWater { y: 0.0 }) | |||||
.with(scenery_transform.clone()) | |||||
.with(sprite_render) | |||||
.build(); | |||||
// create the islands entity | |||||
let sprite_render = SpriteRender { | |||||
sprite_sheet: sprite_sheet_handle.clone(), | |||||
sprite_number: 2, | |||||
}; | |||||
world | |||||
.create_entity() | |||||
.with(Islands) | |||||
.with(scenery_transform.clone()) | |||||
.with(sprite_render) | |||||
.build(); | |||||
// create the sky entity | |||||
let sprite_render = SpriteRender { | |||||
sprite_sheet: sprite_sheet_handle.clone(), | |||||
sprite_number: 3, | |||||
}; | |||||
world | |||||
.create_entity() | |||||
.with(Sky) | |||||
.with(scenery_transform.clone()) | |||||
.with(sprite_render) | |||||
.build(); | |||||
// create the sea entity | |||||
let sprite_render = SpriteRender { | |||||
sprite_sheet: sprite_sheet_handle, | |||||
sprite_number: 4, | |||||
}; | |||||
world | |||||
.create_entity() | |||||
.with(Sea) | |||||
.with(scenery_transform) | |||||
.with(sprite_render) | |||||
.build(); | |||||
// create the title entity | |||||
let title_transform = UiTransform::new( | |||||
"title".to_owned(), | |||||
Anchor::TopLeft, | |||||
Anchor::TopLeft, | |||||
150.0, | |||||
-150.0, | |||||
1.0, | |||||
450.0, | |||||
45.0, | |||||
); | |||||
world | |||||
.create_entity() | |||||
.with(UiText::new( | |||||
font_asset_handle, | |||||
"Merchant Seas".to_string(), | |||||
[1.0, 1.0, 1.0, 1.0], | |||||
45.0, | |||||
)) | |||||
.with(title_transform) | |||||
.build(); | |||||
} |
@@ -1,3 +1,6 @@ | |||||
// modules | |||||
mod states; | |||||
// namespacing | // namespacing | ||||
use amethyst::{ | use amethyst::{ | ||||
core::transform::TransformBundle, | core::transform::TransformBundle, | ||||
@@ -12,10 +15,6 @@ use amethyst::{ | |||||
utils::application_root_dir, | utils::application_root_dir, | ||||
}; | }; | ||||
mod game; | |||||
// a collection of utility functions | |||||
mod utils; | |||||
fn main() -> amethyst::Result<()> { | fn main() -> amethyst::Result<()> { | ||||
// enable engine logging | // enable engine logging | ||||
amethyst::start_logger(Default::default()); | amethyst::start_logger(Default::default()); | ||||
@@ -32,7 +31,7 @@ fn main() -> amethyst::Result<()> { | |||||
RenderToWindow::from_config_path(display_config)?.with_clear([1.0, 1.0, 1.0, 1.0]); | RenderToWindow::from_config_path(display_config)?.with_clear([1.0, 1.0, 1.0, 1.0]); | ||||
// set up keybindings configuration | // set up keybindings configuration | ||||
let bindings = app_root.join("config").join("bindings.ron"); | |||||
let bindings = app_root.join("config").join("bindings_config.ron"); | |||||
let input_bundle = InputBundle::<StringBindings>::new().with_bindings_from_file(bindings)?; | let input_bundle = InputBundle::<StringBindings>::new().with_bindings_from_file(bindings)?; | ||||
// initialize the game data struct | // initialize the game data struct | ||||
@@ -46,16 +45,10 @@ fn main() -> amethyst::Result<()> { | |||||
.with_plugin(render_to_window) | .with_plugin(render_to_window) | ||||
.with_plugin(RenderUi::default()) | .with_plugin(RenderUi::default()) | ||||
.with_plugin(RenderFlat2D::default()), | .with_plugin(RenderFlat2D::default()), | ||||
)? | |||||
// systems inclusion | |||||
.with( | |||||
utils::systems::ExitGameSystem, | |||||
"exit_system", | |||||
&["input_system"], | |||||
); | |||||
)?; | |||||
// create and run the game | // create and run the game | ||||
let mut game = Application::new(assets, game::title_screen::TitleScreen, game_data)?; | |||||
let mut game = Application::new(assets, states::preload_state::PreloadState, game_data)?; | |||||
game.run(); | game.run(); | ||||
Ok(()) | Ok(()) | ||||
@@ -1,53 +0,0 @@ | |||||
/// set of generic systems to be used through out the game | |||||
pub mod systems; | |||||
// namespacing | |||||
use amethyst::{ | |||||
assets::{AssetStorage, Handle, Loader}, | |||||
prelude::*, | |||||
renderer::{ImageFormat, SpriteSheet, SpriteSheetFormat, Texture}, | |||||
ui::{FontAsset, TtfFormat}, | |||||
}; | |||||
/// wrap the image loading functions | |||||
pub fn load_texture<T>(name: T, world: &World) -> Handle<Texture> | |||||
where | |||||
T: Into<String>, | |||||
{ | |||||
let loader = world.read_resource::<Loader>(); | |||||
loader.load( | |||||
name, | |||||
ImageFormat::default(), | |||||
(), | |||||
&world.read_resource::<AssetStorage<Texture>>(), | |||||
) | |||||
} | |||||
/// wrap spritesheet loading | |||||
pub fn load_sprite_sheet<T>( | |||||
name: T, | |||||
world: &World, | |||||
texture_handle: Handle<Texture>, | |||||
) -> Handle<SpriteSheet> | |||||
where | |||||
T: Into<String>, | |||||
{ | |||||
let loader = world.read_resource::<Loader>(); | |||||
let spritesheet_store = world.read_resource::<AssetStorage<SpriteSheet>>(); | |||||
loader.load( | |||||
name, | |||||
SpriteSheetFormat(texture_handle), | |||||
(), | |||||
&spritesheet_store, | |||||
) | |||||
} | |||||
/// wrap font loading | |||||
pub fn load_font<T>(name: T, world: &World) -> Handle<FontAsset> | |||||
where | |||||
T: Into<String>, | |||||
{ | |||||
world | |||||
.read_resource::<Loader>() | |||||
.load(name, TtfFormat, (), &world.read_resource()) | |||||
} |