veloren/voxygen/src/menu/title.rs

75 lines
2.0 KiB
Rust
Raw Normal View History

2019-01-02 22:08:13 +00:00
// Library
use vek::*;
use image;
2019-01-02 22:08:13 +00:00
// Crate
use crate::{
PlayState,
2019-01-07 21:10:31 +00:00
PlayStateResult,
GlobalState,
window::Event,
session::SessionState,
render::Renderer,
ui::{
Ui,
element::{
Widget,
image::Image,
},
},
};
pub struct TitleState {
ui: Ui,
}
impl TitleState {
/// Create a new `TitleState`
pub fn new(renderer: &mut Renderer) -> Self {
let img = Image::new(renderer, &image::open(concat!(env!("CARGO_MANIFEST_DIR"), "/test_assets/test.png")).unwrap()).unwrap();
let widget = Widget::new(renderer, img).unwrap();
Self {
ui: Ui::new(renderer, widget).unwrap(),
}
}
}
// The background colour
2019-01-12 14:01:01 +00:00
const BG_COLOR: Rgba<f32> = Rgba { r: 0.0, g: 0.3, b: 1.0, a: 1.0 };
2019-01-11 20:14:37 +00:00
impl PlayState for TitleState {
2019-01-07 21:10:31 +00:00
fn play(&mut self, global_state: &mut GlobalState) -> PlayStateResult {
loop {
// Handle window events
2019-01-07 21:10:31 +00:00
for event in global_state.window.fetch_events() {
match event {
Event::Close => return PlayStateResult::Shutdown,
// When space is pressed, start a session
Event::Char(' ') => return PlayStateResult::Push(
Box::new(SessionState::new(global_state.window.renderer_mut()).unwrap()), // TODO: Handle this error
),
// Ignore all other events
_ => {},
2019-01-07 21:10:31 +00:00
}
}
// Clear the screen
2019-01-11 20:14:37 +00:00
global_state.window.renderer_mut().clear(BG_COLOR);
// Maintain the UI
self.ui.maintain(global_state.window.renderer_mut());
// Draw the UI to the screen
self.ui.render(global_state.window.renderer_mut());
// Finish the frame
2019-01-07 21:10:31 +00:00
global_state.window.renderer_mut().flush();
global_state.window
.swap_buffers()
.expect("Failed to swap window buffers");
}
}
fn name(&self) -> &'static str { "Title" }
}