feat: implemented basic skeleton of the enemy type
This commit is contained in:
parent
dd2f0799cb
commit
804d8784a3
|
@ -1,8 +1,59 @@
|
||||||
#include "Enemy.h"
|
#include "Enemy.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "Messages.h"
|
||||||
|
|
||||||
Enemy* MakeEnemy() {
|
Enemy* MakeEnemy() {
|
||||||
Enemy* self = malloc(sizeof(Enemy));
|
Enemy* self = malloc(sizeof(Enemy));
|
||||||
ASSERT_RETURN
|
ASSERT_RETURN(self != NULL, NULL, "Failed to allocate Enemy");
|
||||||
|
*self = (Enemy){
|
||||||
|
.transform = IdentityTransform,
|
||||||
|
.behaviour = NULL,
|
||||||
|
.rigidbody = NULL,
|
||||||
|
.collider = NULL,
|
||||||
|
.sprite = sprite_new_empty(),
|
||||||
|
.health = 5,
|
||||||
|
};
|
||||||
|
self->rigidbody = rigidbody_make(Enemy_as_PhysicsEntity(self));
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Enemy* SpawnEnemy(Vector location, const State* entryState) {
|
||||||
|
Enemy* self = MakeEnemy();
|
||||||
|
self->behaviour = state_machine_init(self, entryState);
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnemyStart(Enemy* self) {}
|
||||||
|
|
||||||
|
void EnemyUpdate(Enemy* self, float deltaTime) {
|
||||||
|
state_machine_update(self->behaviour, deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnemyDraw(Enemy* self) {}
|
||||||
|
|
||||||
|
void EnemyDestroy(Enemy* self) {
|
||||||
|
state_machine_destroy(self->behaviour);
|
||||||
|
collider_destroy(self->collider);
|
||||||
|
rigidbody_destroy(self->rigidbody);
|
||||||
|
sprite_destroy(self->sprite);
|
||||||
|
free(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnemyOnCollision(Enemy* self, Collision collision) {}
|
||||||
|
void EnemyOnOverlap(Enemy* self, Collider* other) {}
|
||||||
|
|
||||||
|
void EnemyHandleMessage(Enemy* self, MessageID id, void* data) {
|
||||||
|
switch(id) {
|
||||||
|
default: return;
|
||||||
|
case MESSAGE_DEAL_DAMAGE:
|
||||||
|
self->health -= (uintptr_t)data;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Transform* EnemyGetTransform(Enemy* self) {
|
||||||
|
return &self->transform;
|
||||||
|
}
|
||||||
|
RigidBody* EnemyGetRigidBody(Enemy* self) {
|
||||||
|
return self->rigidbody;
|
||||||
|
}
|
|
@ -4,17 +4,26 @@
|
||||||
#include "transform.h"
|
#include "transform.h"
|
||||||
#include "state_machine.h"
|
#include "state_machine.h"
|
||||||
#include "rigidbody.h"
|
#include "rigidbody.h"
|
||||||
|
#include "physics_entity.h"
|
||||||
|
#include "behaviour_entity.h"
|
||||||
#include "collider.h"
|
#include "collider.h"
|
||||||
|
#include "sprite.h"
|
||||||
|
|
||||||
typedef struct Enemy {
|
typedef struct Enemy {
|
||||||
Transform transform;
|
Transform transform;
|
||||||
|
|
||||||
StateMachine behaviour;
|
StateMachine* behaviour;
|
||||||
|
|
||||||
RigidBody* rigidbody;
|
RigidBody* rigidbody;
|
||||||
Collider* collider;
|
Collider* collider;
|
||||||
|
|
||||||
|
Sprite* sprite;
|
||||||
|
|
||||||
|
int health;
|
||||||
} Enemy;
|
} Enemy;
|
||||||
|
|
||||||
|
const MessageID ENEMY_DAMAGE_MESSAGE = 0x1;
|
||||||
|
|
||||||
extern Enemy* MakeEnemy();
|
extern Enemy* MakeEnemy();
|
||||||
extern Enemy* SpawnEnemy(Vector location, const State* entryState);
|
extern Enemy* SpawnEnemy(Vector location, const State* entryState);
|
||||||
|
|
||||||
|
@ -22,4 +31,39 @@ extern void EnemyStart(Enemy* self);
|
||||||
extern void EnemyUpdate(Enemy* self, float deltaTime);
|
extern void EnemyUpdate(Enemy* self, float deltaTime);
|
||||||
extern void EnemyDestroy(Enemy* self);
|
extern void EnemyDestroy(Enemy* self);
|
||||||
|
|
||||||
|
extern void EnemyDraw(Enemy* self);
|
||||||
|
|
||||||
|
extern void EnemyOnCollision(Enemy* self, Collision collision);
|
||||||
|
extern void EnemyOnOverlap(Enemy* self, Collider* other);
|
||||||
|
extern void EnemyHandleMessage(Enemy* self, MessageID id, void* data);
|
||||||
|
|
||||||
|
extern Transform* EnemyGetTransform(Enemy* self);
|
||||||
|
extern RigidBody* EnemyGetRigidBody(Enemy* self);
|
||||||
|
static int EnemyGetDepth(Enemy* self) { return (int)(-self->transform.position.y * 1000); }
|
||||||
|
|
||||||
|
impl_Transformable_for(Enemy,
|
||||||
|
EnemyGetTransform
|
||||||
|
)
|
||||||
|
|
||||||
|
impl_MessageReceiver_for(Enemy,
|
||||||
|
EnemyHandleMessage
|
||||||
|
)
|
||||||
|
|
||||||
|
impl_Drop_for(Enemy,
|
||||||
|
EnemyDestroy
|
||||||
|
)
|
||||||
|
|
||||||
|
impl_BehaviourEntity_for(Enemy,
|
||||||
|
EnemyStart,
|
||||||
|
EnemyUpdate,
|
||||||
|
EnemyDraw,
|
||||||
|
EnemyGetDepth
|
||||||
|
)
|
||||||
|
|
||||||
|
impl_PhysicsEntity_for(Enemy,
|
||||||
|
EnemyGetRigidBody,
|
||||||
|
EnemyOnCollision,
|
||||||
|
EnemyOnOverlap
|
||||||
|
)
|
||||||
|
|
||||||
#endif // !FIGHT_ENEMY_H
|
#endif // !FIGHT_ENEMY_H
|
||||||
|
|
Loading…
Reference in a new issue