1
0
Fork 0
mirror of https://github.com/doukutsu-rs/doukutsu-rs synced 2025-07-05 03:16:15 +00:00

Better control over tilemap ticks

This commit is contained in:
dawnDus 2022-01-25 00:10:13 -05:00
parent 6302258817
commit 95fd91b8a0
No known key found for this signature in database
GPG key ID: 972AABDE81848F21
2 changed files with 26 additions and 32 deletions

View file

@ -5,7 +5,10 @@ use crate::framework::error::GameResult;
use crate::shared_game_state::{SharedGameState, TileSize};
use crate::stage::{BackgroundType, Stage, StageTexturePaths};
pub struct Tilemap;
pub struct Tilemap {
tick: u32,
prev_tick: u32,
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum TileLayer {
@ -17,7 +20,17 @@ pub enum TileLayer {
impl Tilemap {
pub fn new() -> Self {
Tilemap
Tilemap { tick: 0, prev_tick: 0 }
}
pub fn tick(&mut self) -> GameResult {
self.tick = self.tick.wrapping_add(1);
Ok(())
}
pub fn set_prev(&mut self) -> GameResult {
self.prev_tick = self.tick;
Ok(())
}
pub fn draw(
@ -28,7 +41,6 @@ impl Tilemap {
layer: TileLayer,
textures: &StageTexturePaths,
stage: &Stage,
tick: u32,
) -> GameResult {
if stage.map.tile_size == TileSize::Tile8x8 && layer == TileLayer::Snack {
return Ok(());
@ -181,7 +193,8 @@ impl Tilemap {
continue;
}
let shift = ((tick as f64 + state.frame_time) * 2.0) as u16 % 16;
let shift =
((self.tick as f64 + (self.tick - self.prev_tick) as f64 * state.frame_time) * 2.0) as u16 % 16;
let mut push_rect = state.constants.world.water_push_rect;
match attr {

View file

@ -1381,6 +1381,9 @@ impl GameScene {
}
}
}
self.tilemap.tick()?;
self.frame.update(state, &self.stage);
if state.control_flags.control_enabled() {
@ -1742,6 +1745,8 @@ impl Scene for GameScene {
self.whimsical_star.set_prev();
self.tilemap.set_prev()?;
self.inventory_dim += 0.1
* if state.textscript_vm.mode == ScriptMode::Inventory {
state.frame_time as f32
@ -1765,25 +1770,9 @@ impl Scene for GameScene {
let stage_textures_ref = &*self.stage_textures.deref().borrow();
self.background.draw(state, ctx, &self.frame, stage_textures_ref, &self.stage)?;
self.tilemap.draw(
state,
ctx,
&self.frame,
TileLayer::Background,
stage_textures_ref,
&self.stage,
self.tick,
)?;
self.tilemap.draw(state, ctx, &self.frame, TileLayer::Background, stage_textures_ref, &self.stage)?;
self.draw_npc_layer(state, ctx, NPCLayer::Background)?;
self.tilemap.draw(
state,
ctx,
&self.frame,
TileLayer::Middleground,
stage_textures_ref,
&self.stage,
self.tick,
)?;
self.tilemap.draw(state, ctx, &self.frame, TileLayer::Middleground, stage_textures_ref, &self.stage)?;
if state.settings.shader_effects && self.lighting_mode == LightingMode::BackgroundOnly {
self.draw_light_map(state, ctx)?;
@ -1800,16 +1789,8 @@ impl Scene for GameScene {
}
self.water_renderer.draw(state, ctx, &self.frame)?;
self.tilemap.draw(
state,
ctx,
&self.frame,
TileLayer::Foreground,
stage_textures_ref,
&self.stage,
self.tick,
)?;
self.tilemap.draw(state, ctx, &self.frame, TileLayer::Snack, stage_textures_ref, &self.stage, self.tick)?;
self.tilemap.draw(state, ctx, &self.frame, TileLayer::Foreground, stage_textures_ref, &self.stage)?;
self.tilemap.draw(state, ctx, &self.frame, TileLayer::Snack, stage_textures_ref, &self.stage)?;
self.draw_carets(state, ctx)?;
self.player1.popup.draw(state, ctx, &self.frame)?;