use sevenx_engine::{
game_object::{Direction, ObjectType, PlayerAction},
input::InputHandler,
tilemap::{Tile, Tilemap},
world::World,
Engine, EngineConfig, GameState, KeyCode,
};
struct TilemapDemo {
tilemap: Tilemap,
}
impl GameState for TilemapDemo {
fn new() -> Self {
let mut tilemap = Tilemap::new(25, 19, 32, 32);
for x in 0..25 {
tilemap.set_tile(x, 18, Some(Tile::new(0).with_solid(true)));
}
for x in 5..10 {
tilemap.set_tile(x, 15, Some(Tile::new(0).with_solid(true)));
}
for x in 15..20 {
tilemap.set_tile(x, 12, Some(Tile::new(0).with_solid(true)));
}
for y in 0..19 {
tilemap.set_tile(0, y, Some(Tile::new(0).with_solid(true)));
tilemap.set_tile(24, y, Some(Tile::new(0).with_solid(true)));
}
TilemapDemo { tilemap }
}
fn update(&mut self, dt: f32, input: &InputHandler, world: &mut World) {
if let Some(player) = world
.game_objects
.iter_mut()
.find(|obj| obj.object_type == ObjectType::Player && obj.active)
{
let axis_x = input.get_axis_horizontal();
let speed = if input.is_shift_pressed() { 400.0 } else { 200.0 };
if axis_x != 0.0 {
player.transform.translate(axis_x * speed * dt, 0.0);
player.facing_direction = if axis_x < 0.0 { Direction::Left } else { Direction::Right };
player.current_action = PlayerAction::Walk;
} else {
player.current_action = PlayerAction::Idle;
}
if input.is_key_just_pressed(KeyCode::Space) {
if let Some(physics) = &mut player.physics {
physics.velocity.1 = -400.0;
println!("🦘 Pulo!");
}
}
let (tile_x, tile_y) = self
.tilemap
.world_to_tile(player.transform.position.0, player.transform.position.1);
if self.tilemap.is_solid(tile_x, tile_y) {
println!("💥 Colidiu com tile sólido em ({}, {})", tile_x, tile_y);
}
}
}
fn draw(&mut self, _world: &World, pixels: &mut [u8]) {
self.tilemap.render(pixels, 0.0, 0.0, 800, 600);
}
}
fn main() {
println!("🎮 SevenX Engine v0.2.7 - Tilemap Demo");
println!("🗺️ Sistema de Tilemaps");
println!();
println!("🎯 Controles:");
println!(" Setas/A-D - Mover");
println!(" Shift - Correr");
println!(" Espaço - Pular");
println!();
let config = EngineConfig::new()
.with_title("SevenX Engine v0.2.7 - Tilemap Demo")
.with_size(800, 600)
.with_gravity(980.0);
Engine::with_config(config).run::<TilemapDemo>();
}