feat: implemented basic skeleton of the enemy type

This commit is contained in:
Sara 2023-11-27 19:01:11 +01:00
parent dd2f0799cb
commit 804d8784a3
2 changed files with 97 additions and 2 deletions

View file

@ -1,8 +1,59 @@
#include "Enemy.h"
#include "debug.h"
#include "Messages.h"
Enemy* MakeEnemy() {
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;
}
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;
}

View file

@ -4,17 +4,26 @@
#include "transform.h"
#include "state_machine.h"
#include "rigidbody.h"
#include "physics_entity.h"
#include "behaviour_entity.h"
#include "collider.h"
#include "sprite.h"
typedef struct Enemy {
Transform transform;
StateMachine behaviour;
StateMachine* behaviour;
RigidBody* rigidbody;
Collider* collider;
Sprite* sprite;
int health;
} Enemy;
const MessageID ENEMY_DAMAGE_MESSAGE = 0x1;
extern Enemy* MakeEnemy();
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 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