4. Enemigos
Crear los objetos
Sección titulada «Crear los objetos»-
Crea el objeto
Enemy(Novo objeto…, nuevo objeto, en la carpetaobjects). En el Inspetor (Inspector), elige el spriteinimigo. En el panel Camadas (capas), crea una capa más de Instâncias, llamadaInimigos, y arrástrala debajo deTiros. Después haz clic de nuevo enInstancias. -
Crea el objeto
Spawnery déjalo sin sprite. No aparece en el juego: su trabajo es solo crear enemigos. -
Arrastra el
Spawnera la roomMain. Puede ser en cualquier lugar; en el editor aparece como un cuadradito. ElEnemyno va en la room: quien crea los enemigos es elSpawner.
El enemigo
Sección titulada «El enemigo»Abre el Enemy.hpp, borra los ejemplos y escribe:
#pragma once#include <brasa/brasa.hpp>
// Enemigo que cae desde arriba de la pantalla.class Enemy : public brasa::Entity {public: BRASA_VARS(Enemy)
void onSpawn() override; void onUpdate() override;};Y el Enemy.cpp:
#include "Enemy.hpp"
using namespace brasa;
void Enemy::onSpawn() { animSpeed = 0.1f; // random(a, b) sortea un número entre a y b: cada enemigo cae a una velocidad distinta. vspeed = random(0.8f, 1.6f); // Cuando un Bullet me toca, el disparo y yo somos destruidos. // Los demás objetos (Bullet, Player...) ya son conocidos aquí, sin #include. onCollide<Bullet>([this](Bullet& bullet) { bullet.destroy(); destroy(); });}
void Enemy::onUpdate() { // roomHeight() es la altura de la pantalla; si la pasó (con margen), el enemigo escapó. if (y > static_cast<float>(roomHeight()) + 16.0f) destroy();}
BRASA_ENTITY(Enemy);random(0.8f, 1.6f)sortea un número entre 0,8 y 1,6. Cada enemigo cae a una velocidad distinta, lo que hace el juego menos predecible.onCollide<Bullet>(...)dice: “cuando toque unBullet, haz esto”. Brasa revisa las cajas de colisión en cada paso y llama a la lambda. El disparo que acertó llega comobullet, y los dos son destruidos.- En el
onUpdate, el enemigo que pasó el final de la pantalla es destruido.
El Spawner
Sección titulada «El Spawner»Abre el Spawner.hpp, borra los ejemplos y escribe:
#pragma once#include <brasa/brasa.hpp>
// Crea enemigos en la parte de arriba de la pantalla, cada vez más rápido.class Spawner : public brasa::Entity {public: BRASA_VARS(Spawner)
void onSpawn() override;
private: void scheduleNext(); // programa el próximo enemigo int spawned_ = 0;};El Spawner tiene una función solo suya, scheduleNext, y cuenta cuántos enemigos ya creó en spawned_.
Ahora el Spawner.cpp:
#include "Spawner.hpp"
#include <algorithm>
using namespace brasa;
// El Spawner no necesita onUpdate: programa el próximo enemigo con after(),// que llama a la función después de N steps (a 60 steps por segundo).void Spawner::onSpawn() { scheduleNext(); }
void Spawner::scheduleNext() { // El intervalo se acorta poco a poco (de 1 s hasta un mínimo de 0,25 s): el juego se vuelve más difícil. const int interval = std::max(15, 60 - spawned_ * 2); after(interval, [this] { ++spawned_; const float margin = 16.0f; spawn<Enemy>(random(margin, static_cast<float>(roomWidth()) - margin), -16.0f, "Inimigos"); scheduleNext(); // programa el siguiente });}
BRASA_ENTITY(Spawner);Cómo funciona:
- Cuando nace el
Spawner,onSpawnllama ascheduleNext(). scheduleNextcalcula un intervalo: 60 pasos (1 segundo) al principio, 2 pasos menos con cada enemigo, hasta el mínimo de 15.std::max(15, ...)garantiza ese mínimo.after(interval, ...)espera ese tiempo y crea unEnemyen una posiciónxsorteada, justo encima de la pantalla (y = -16).- Después llama a
scheduleNext()de nuevo, y el ciclo sigue para siempre.
Pruébalo ahora
Sección titulada «Pruébalo ahora»Pulsa Play. Los enemigos empiezan a caer, cada vez más rápido. Dispárales: disparo y enemigo desaparecen juntos. Por ahora, tocar la nave no hace nada; eso viene en la siguiente parte.
Lo que aprendiste
Sección titulada «Lo que aprendiste»- Un objeto sin sprite puede tener un trabajo invisible, como el
Spawner. random(a, b)sortea números. Mira Números al azar.onCollide<Objeto>(...)reacciona cuando dos objetos se tocan. Mira Colisiones.- Una función que se programa de nuevo con
aftercrea una repetición con intervalo variable.
Siguiente parte: 5. Puntos y vidas →
