sevenx_engine 0.2.11

Engine de jogos 2D/3D completa com suporte Android, física, áudio, partículas, tilemap, UI, eventos e sistema 3D avançado com PBR.
Documentation
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);

        // Cria um nível simples
        // Chão
        for x in 0..25 {
            tilemap.set_tile(x, 18, Some(Tile::new(0).with_solid(true)));
        }

        // Plataformas
        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)));
        }

        // Paredes
        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) {
        // Movimento do jogador usando eixo horizontal (v0.2.7!)
        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;
            }
            
            // Pulo com just_pressed (v0.2.7!)
            if input.is_key_just_pressed(KeyCode::Space) {
                if let Some(physics) = &mut player.physics {
                    physics.velocity.1 = -400.0;
                    println!("🦘 Pulo!");
                }
            }

            // Verifica colisão com tiles
            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]) {
        // Renderiza tilemap
        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>();
}