ggez
This commit is contained in:
commit
e4559ac6f2
7 changed files with 2817 additions and 0 deletions
13
.editorconfig
Normal file
13
.editorconfig
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_file = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
indent_size = 2
|
||||||
|
trim_trailing_whitespace = false
|
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
/target
|
||||||
|
**/*.rs.bk
|
||||||
|
|
||||||
|
|
||||||
|
# Added by cargo
|
||||||
|
#
|
||||||
|
# already existing elements were commented out
|
||||||
|
|
||||||
|
#/target
|
2648
Cargo.lock
generated
Normal file
2648
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "wedge"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
ggez = "0.6.1"
|
55
src/main.rs
Normal file
55
src/main.rs
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
mod screens;
|
||||||
|
|
||||||
|
use std::time::Instant;
|
||||||
|
|
||||||
|
use ggez::event::{self, EventHandler};
|
||||||
|
use ggez::graphics::{self, Color};
|
||||||
|
use ggez::{Context, ContextBuilder, GameResult};
|
||||||
|
|
||||||
|
use crate::screens::{Screens, Screen};
|
||||||
|
use crate::screens::menu::MenuScreen;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Make a Context.
|
||||||
|
let (mut ctx, event_loop) = ContextBuilder::new("my_game", "Cool Game Author")
|
||||||
|
.build()
|
||||||
|
.expect("aieee, could not create ggez context!");
|
||||||
|
|
||||||
|
// Create an instance of your event handler.
|
||||||
|
// Usually, you should provide it with the Context object to
|
||||||
|
// use when setting your game up.
|
||||||
|
let my_game = MyGame::new(&mut ctx);
|
||||||
|
|
||||||
|
// Run!
|
||||||
|
event::run(ctx, event_loop, my_game);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyGame {
|
||||||
|
screens: Screens,
|
||||||
|
last_update: Instant,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MyGame {
|
||||||
|
pub fn new(_ctx: &mut Context) -> MyGame {
|
||||||
|
// Load/create resources such as images here.
|
||||||
|
MyGame {
|
||||||
|
last_update: Instant::now(),
|
||||||
|
screens: Screens::init(Screen::Menu(MenuScreen::default())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EventHandler<ggez::GameError> for MyGame {
|
||||||
|
fn update(&mut self, _ctx: &mut Context) -> GameResult<()> {
|
||||||
|
let now = Instant::now();
|
||||||
|
let elapsed = now - self.last_update;
|
||||||
|
self.screens.update(elapsed);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw(&mut self, ctx: &mut Context) -> GameResult<()> {
|
||||||
|
graphics::clear(ctx, Color::WHITE);
|
||||||
|
self.screens.render(ctx);
|
||||||
|
graphics::present(ctx)
|
||||||
|
}
|
||||||
|
}
|
18
src/screens/menu.rs
Normal file
18
src/screens/menu.rs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use ggez::Context;
|
||||||
|
|
||||||
|
use super::ScreenAction;
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct MenuScreen {
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MenuScreen {
|
||||||
|
pub fn update(&mut self, delta: Duration) -> ScreenAction {
|
||||||
|
ScreenAction::None
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn render(&self, ctx: &mut Context) {
|
||||||
|
}
|
||||||
|
}
|
65
src/screens/mod.rs
Normal file
65
src/screens/mod.rs
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
pub mod menu;
|
||||||
|
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use ggez::Context;
|
||||||
|
|
||||||
|
use self::menu::MenuScreen;
|
||||||
|
|
||||||
|
pub struct Screens {
|
||||||
|
stack: Vec<Screen>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum ScreenAction {
|
||||||
|
None,
|
||||||
|
Push(Screen),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Screens {
|
||||||
|
pub fn init(base: Screen) -> Self {
|
||||||
|
Screens {
|
||||||
|
stack: vec![ base ],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn top(&self) -> &Screen {
|
||||||
|
self.stack.last().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn top_mut(&mut self) -> &mut Screen {
|
||||||
|
self.stack.last_mut().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update(&mut self, delta: Duration) {
|
||||||
|
let top = self.top_mut();
|
||||||
|
match top.update(delta) {
|
||||||
|
ScreenAction::None => (),
|
||||||
|
ScreenAction::Push(new) => {
|
||||||
|
self.stack.push(new);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn render(&self, ctx: &mut Context) {
|
||||||
|
let top = self.top();
|
||||||
|
top.render(ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum Screen {
|
||||||
|
Menu(MenuScreen),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Screen {
|
||||||
|
fn update(&mut self, delta: Duration) -> ScreenAction {
|
||||||
|
match self {
|
||||||
|
Screen::Menu(screen) => screen.update(delta),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render(&self, ctx: &mut Context) {
|
||||||
|
match self {
|
||||||
|
Screen::Menu(screen) => screen.render(ctx),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue