Construyendo un juego básico
Para empezar, esta guía te lleva paso a paso para crear un juego de recolección de manzanas.
Última actualización
// Esto crea el componente que hace que la manzana sea interactiva,
// lo añadiremos a la Manzana en el siguiente paso del tutorial.
Pickup_Apple :: class : Interactable {
is_picked_up: bool;
ao_start :: method() {
this.set_listener(this);
this.set_text("Recoger");
}
can_use :: method(player: Player) -> bool {
if is_picked_up return false;
return true;
}
on_interact :: method(player: Player) {
if is_picked_up return;
is_picked_up = true;
// Inicia el efecto pop
effect := new(Apple_Pop_Effect);
entity.set_active_effect(effect);
}
}
// Una animación genial para cuando te la comes :D
Apple_Pop_Effect :: class : Effect_Base {
sprite: Sprite_Renderer;
start_scale: v2;
start_pos: v2;
effect_start :: method() {
sprite = entity.get_component(Sprite_Renderer);
start_scale = entity.local_scale;
start_pos = entity.local_position;
set_duration(0.4);
}
effect_update :: method(dt: float) {
t := get_elapsed_time() / 0.4;
// Escala hacia arriba y luego encoge rápidamente hasta desaparecer
scale_curve: float;
if t < 0.3 {
// Aparición rápida (escala a 1.3x)
scale_curve = lerp(1.0, 1.3, Ease.out_back(t / 0.3));
} else {
// Encoger hasta desaparecer
scale_curve = lerp(1.3, 0.0, Ease.in_back((t - 0.3) / 0.7));
}
entity.set_local_scale(start_scale * scale_curve);
// Flota ligeramente hacia arriba
rise := Ease.out_quad(t) * 0.5;
entity.set_local_position({start_pos.x, start_pos.y + rise});
// Desvanece al final
if sprite != null {
alpha := 1.0 - Ease.in_quad(max(0.0, (t - 0.5) / 0.5));
sprite.color.w = alpha;
}
}
effect_end :: method(interrupt: bool) {
entity.destroy();
}
}