add gameover #20
4 changed files with 97 additions and 40 deletions
|
@ -1,9 +1,8 @@
|
|||
use super::{furniture::Furniture, grid::Grid};
|
||||
use crate::game::{self, ZLayer};
|
||||
use comfy::{
|
||||
draw_circle, draw_rect, draw_rect_outline, draw_sprite, error, random_i32,
|
||||
texture_id, vec2, EngineContext, HashSet, RandomRange as _, Vec2, GOLD, GREEN,
|
||||
PURPLE, RED, WHITE
|
||||
draw_rect, draw_rect_outline, draw_sprite, error, random_i32, texture_id, vec2,
|
||||
EngineContext, HashSet, RandomRange as _, Vec2, GREEN, PURPLE, RED, WHITE
|
||||
};
|
||||
use indexmap::IndexSet;
|
||||
|
||||
|
|
10
src/game.rs
10
src/game.rs
|
@ -75,7 +75,8 @@ pub enum ZLayer {
|
|||
MapMax = -1,
|
||||
Human = 0,
|
||||
Ghost = 1,
|
||||
UI = 100
|
||||
UI = 100,
|
||||
GameOver = 1000
|
||||
}
|
||||
|
||||
impl From<ZLayer> for i32 {
|
||||
|
@ -134,6 +135,7 @@ pub const HOUSE_DISCHARGE_RATE: f32 = 30.0;
|
|||
pub const GHOST_CHARGE_RATE: f32 = 200.0;
|
||||
|
||||
pub fn update(state: &mut State, ctx: &mut EngineContext<'_>) {
|
||||
if state.ghost.charge > 0.0 {
|
||||
// Update the score. It's based on time.
|
||||
state.score += ctx.delta * 10.0;
|
||||
|
||||
|
@ -169,6 +171,9 @@ pub fn update(state: &mut State, ctx: &mut EngineContext<'_>) {
|
|||
_ => {}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
crate::game_over::update(state, ctx);
|
||||
}
|
||||
|
||||
// Make sure the ghost's charge never drops below 0.
|
||||
state.ghost.charge = state.ghost.charge.max(0.0);
|
||||
|
@ -180,4 +185,7 @@ pub fn draw(state: &State, engine: &EngineContext<'_>) {
|
|||
Activity::Overworld => overworld::draw(state, engine)
|
||||
}
|
||||
crate::ui::draw(state, engine);
|
||||
if state.ghost.charge <= 0.0 {
|
||||
crate::game_over::draw(state, engine);
|
||||
}
|
||||
}
|
||||
|
|
52
src/game_over.rs
Normal file
52
src/game_over.rs
Normal file
|
@ -0,0 +1,52 @@
|
|||
use std::mem::take;
|
||||
|
||||
use crate::{game::ZLayer, State};
|
||||
use comfy::{
|
||||
draw_rect, egui,
|
||||
egui::{Align, Layout},
|
||||
is_key_pressed, main_camera, Color, EngineContext, WHITE
|
||||
};
|
||||
use egui::{Align2, RichText};
|
||||
use log::info;
|
||||
|
||||
pub fn update(state: &mut State, _engine: &mut EngineContext<'_>) {
|
||||
if is_key_pressed(comfy::KeyCode::Return) {
|
||||
info!("Restart game");
|
||||
take(state); //reset to default
|
||||
}
|
||||
}
|
||||
|
||||
pub fn draw(state: &State, _engine: &EngineContext<'_>) {
|
||||
let cam = main_camera();
|
||||
draw_rect(
|
||||
cam.center,
|
||||
cam.world_viewport() * 1.2,
|
||||
Color::new(0.0, 0.0, 0.0, 0.5),
|
||||
ZLayer::GameOver.into()
|
||||
);
|
||||
|
||||
egui::Area::new("game_over")
|
||||
.anchor(Align2::CENTER_CENTER, egui::vec2(0.0, 0.0))
|
||||
.show(egui(), |ui| {
|
||||
ui.with_layout(Layout::top_down_justified(Align::Center), |ui| {
|
||||
ui.heading(
|
||||
RichText::new(
|
||||
"The poor spirit lost all their energy and starve to death"
|
||||
)
|
||||
.color(WHITE)
|
||||
.strong()
|
||||
.size(50.0)
|
||||
);
|
||||
ui.label(
|
||||
RichText::new(format!("\nYour Score:\n{:.0}", state.score))
|
||||
.color(WHITE)
|
||||
.size(30.0)
|
||||
);
|
||||
ui.label(
|
||||
RichText::new("\n\n\npress enter for restart")
|
||||
.color(WHITE)
|
||||
.size(30.0)
|
||||
);
|
||||
})
|
||||
});
|
||||
}
|
|
@ -5,9 +5,9 @@
|
|||
mod assets {
|
||||
include!(env!("ASSETS_RS"));
|
||||
}
|
||||
|
||||
mod activities;
|
||||
mod game;
|
||||
mod game_over;
|
||||
mod ui;
|
||||
|
||||
use std::env::var;
|
||||
|
@ -70,14 +70,12 @@ impl State {
|
|||
|
||||
impl GameLoop for State {
|
||||
fn new(_c: &mut EngineState) -> Self {
|
||||
Self {
|
||||
dev: dev_from_env(),
|
||||
..Default::default()
|
||||
}
|
||||
Default::default()
|
||||
}
|
||||
|
||||
fn update(&mut self, ctx: &mut EngineContext<'_>) {
|
||||
if !self.setup_called {
|
||||
self.dev = dev_from_env();
|
||||
game::setup(self, ctx);
|
||||
game::setup(self, ctx);
|
||||
self.setup_called = true;
|
||||
|
|
Loading…
Reference in a new issue