36 lines
1.3 KiB
C++
36 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include "game/entities/entity.hpp"
|
|
|
|
class Player;
|
|
|
|
// Base d'entitats d'atac: spawnejades pels jugadors, viuen poc temps i
|
|
// poden danyar `Hazard`s i altres `Player`s (mai el seu propi `owner_`).
|
|
//
|
|
// Branca paral·lela a `Hazard` (no hereta d'ella) perquè la semàntica és
|
|
// inversa: un `Hazard` és un perill estàtic/dinàmic que toca el jugador,
|
|
// mentre que un `Attack` és el jugador qui colpeja la resta. Mantenir-les
|
|
// separades permet, p. ex., que un atac no aparega al test de "què colpeja
|
|
// al Player en el seu rect" (`EntityManager::checkPlayerCollisions`) perquè
|
|
// el sentit del filtre és un altre.
|
|
//
|
|
// `Attack` no col·lisiona al test de moviment (els atacs no bloquegen
|
|
// passos). El càlcul de quins objectius reben dany el fa cada subclasse
|
|
// segons la seua geometria (rectangle direccional per al látigo, cercle
|
|
// per a una explosió de bomba en el futur, etc.).
|
|
class Attack : public Entity {
|
|
public:
|
|
Attack() {
|
|
collides_ = false;
|
|
interactable_ = false;
|
|
}
|
|
|
|
void setOwner(Player* owner) { owner_ = owner; }
|
|
[[nodiscard]] auto getOwner() const -> Player* { return owner_; }
|
|
|
|
protected:
|
|
// Jugador que ha llançat l'atac. No rep dany del seu propi atac
|
|
// (anti-self-friendly-fire). `nullptr` només a tests sintètics.
|
|
Player* owner_{nullptr};
|
|
};
|