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::{
    input::InputHandler,
    particles::{BlendMode, ParticleConfig, ParticleSystem},
    ui::render_text,
    world::World,
    Engine, EngineConfig, GameState, KeyCode,
};

struct ParticlesAdvanced {
    fire_system: ParticleSystem,
    magic_system: ParticleSystem,
    snow_system: ParticleSystem,
    spawn_timer: f32,
}

impl GameState for ParticlesAdvanced {
    fn new() -> Self {
        ParticlesAdvanced {
            fire_system: ParticleSystem::new(500)
                .with_blend_mode(BlendMode::Additive)
                .with_drag(0.1),
            magic_system: ParticleSystem::new(300)
                .with_blend_mode(BlendMode::Additive)
                .with_drag(0.05),
            snow_system: ParticleSystem::new(200).with_drag(0.02),
            spawn_timer: 0.0,
        }
    }

    fn update(&mut self, dt: f32, input: &InputHandler, world: &mut World) {
        // Fogo contínuo
        if input.is_key_pressed(KeyCode::Digit1) {
            let config = ParticleConfig::fire();
            self.fire_system.emit_stream(400.0, 550.0, 50.0, dt, config);
        }

        // Magia
        if input.is_key_pressed(KeyCode::Digit2) {
            let config = ParticleConfig::magic();
            self.magic_system.emit_burst(400.0, 300.0, 30, config);
        }

        // Neve
        self.spawn_timer += dt;
        if self.spawn_timer > 0.1 {
            self.spawn_timer = 0.0;
            let config = ParticleConfig::snow();
            for _ in 0..3 {
                use rand::Rng;
                let mut rng = rand::thread_rng();
                let x = rng.gen_range(0.0..800.0);
                self.snow_system.emit_burst(x, -10.0, 1, config);
            }
        }

        // Sangue
        if input.is_key_pressed(KeyCode::Digit3) {
            let config = ParticleConfig::blood();
            self.fire_system.emit_burst(400.0, 300.0, 40, config);
        }

        // Chuva
        if input.is_key_pressed(KeyCode::Digit4) {
            let config = ParticleConfig::rain();
            for _ in 0..5 {
                use rand::Rng;
                let mut rng = rand::thread_rng();
                let x = rng.gen_range(0.0..800.0);
                self.snow_system.emit_burst(x, -10.0, 1, config);
            }
        }

        // Atualiza sistemas
        self.fire_system.update(dt, 50.0);
        self.magic_system.update(dt, -100.0); // Gravidade negativa
        self.snow_system.update(dt, 100.0);
    }

    fn draw(&mut self, _world: &World, pixels: &mut [u8]) {
        // Renderiza partículas
        self.snow_system.render(pixels, 0.0, 0.0, 800, 600);
        self.fire_system.render(pixels, 0.0, 0.0, 800, 600);
        self.magic_system.render(pixels, 0.0, 0.0, 800, 600);

        // HUD
        render_text(
            "1: FOGO | 2: MAGIA | 3: SANGUE | 4: CHUVA",
            100,
            20,
            [255, 255, 255, 255],
            pixels,
            800,
        );

        let fire_count = format!("FOGO: {}", self.fire_system.count());
        render_text(&fire_count, 10, 50, [255, 100, 0, 255], pixels, 800);

        let magic_count = format!("MAGIA: {}", self.magic_system.count());
        render_text(&magic_count, 10, 70, [200, 100, 255, 255], pixels, 800);

        let snow_count = format!("NEVE: {}", self.snow_system.count());
        render_text(&snow_count, 10, 90, [200, 200, 255, 255], pixels, 800);
    }
}

fn main() {
    println!("✨ Sistema de Partículas Avançado");
    println!("1 - Fogo (segure)");
    println!("2 - Magia");
    println!("3 - Sangue");
    println!("4 - Chuva");

    let config = EngineConfig::new()
        .with_title("SevenX Engine - Partículas Avançadas")
        .with_size(800, 600)
        .with_clear_color(10, 10, 20, 255);

    Engine::with_config(config).run::<ParticlesAdvanced>();
}