From 879d72e10f9ab94195594f3bb1db44e5257e9741 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 29 Nov 2023 11:49:00 +0100 Subject: [PATCH] feat: enemy now initializes 2 animations, and declares 3 --- game/src/Enemy.c | 34 +++++++++++++++++++++++++++++++--- game/src/Enemy.h | 16 ++++++++++++---- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/game/src/Enemy.c b/game/src/Enemy.c index 36bed55..faea59d 100644 --- a/game/src/Enemy.c +++ b/game/src/Enemy.c @@ -1,6 +1,9 @@ #include "Enemy.h" #include "debug.h" #include "Messages.h" +#include "game_world.h" +#include "physics.h" +#include "physics_world.h" Enemy* MakeEnemy() { Enemy* self = malloc(sizeof(Enemy)); @@ -11,15 +14,31 @@ Enemy* MakeEnemy() { .rigidbody = NULL, .collider = NULL, .sprite = sprite_new_empty(), + .hurt = 0, + .idle = NULL, + .walk = NULL, + .hurt_anim = NULL, + .currentAnimation = NULL, .health = 5, }; + self->rigidbody = rigidbody_make(Enemy_as_PhysicsEntity(self)); + self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new_square(MakeVector(0.2f, 0.05f)), 0, PHYSICS_LAYER_DEFAULT); + + sprite_set_origin(self->sprite, MakeVector(0.45f, 0.925f)); + + self->idle = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Idle.png", IVectorFrom(512)), 1.5f, LoopMode_Loop); + self->walk = animation_sprite_new(self->sprite, spritesheet_load("assets/Player_Walk.png", IVectorFrom(512)), 1.5f, LoopMode_Loop); + return self; } Enemy* SpawnEnemy(Vector location, const State* entryState) { Enemy* self = MakeEnemy(); self->behaviour = state_machine_init(self, entryState); + self->transform.position = location; + game_world_add_entity(Enemy_as_BehaviourEntity(self)); + physics_world_add_entity(Enemy_as_PhysicsEntity(self)); return self; } @@ -27,9 +46,14 @@ void EnemyStart(Enemy* self) {} void EnemyUpdate(Enemy* self, float deltaTime) { state_machine_update(self->behaviour, deltaTime); + if(self->health <= 0) + game_world_destroy_entity(Enemy_as_BehaviourEntity(self)); } -void EnemyDraw(Enemy* self) {} +void EnemyDraw(Enemy* self) { + animation_sprite_draw(self->currentAnimation, &self->transform); + shape_draw(collider_get_shape(self->collider), self->transform); +} void EnemyDestroy(Enemy* self) { state_machine_destroy(self->behaviour); @@ -42,13 +66,17 @@ void EnemyDestroy(Enemy* self) { void EnemyOnCollision(Enemy* self, Collision collision) {} void EnemyOnOverlap(Enemy* self, Collider* other) {} -void EnemyHandleMessage(Enemy* self, MessageID id, void* data) { +void* EnemyHandleMessage(Enemy* self, MessageID id, void* data) { switch(id) { - default: return; case MESSAGE_DEAL_DAMAGE: self->health -= (uintptr_t)data; + self->hurt = 1; + break; + default: break; } + + return NULL; } Transform* EnemyGetTransform(Enemy* self) { diff --git a/game/src/Enemy.h b/game/src/Enemy.h index b155115..21b56ed 100644 --- a/game/src/Enemy.h +++ b/game/src/Enemy.h @@ -8,6 +8,8 @@ #include "behaviour_entity.h" #include "collider.h" #include "sprite.h" +#include "animation_sprite.h" +#include "EnemyStates.h" typedef struct Enemy { Transform transform; @@ -18,12 +20,18 @@ typedef struct Enemy { Collider* collider; Sprite* sprite; + + int hurt; + + AnimationSprite* idle; + AnimationSprite* walk; + AnimationSprite* hurt_anim; + + AnimationSprite* currentAnimation; int health; } Enemy; -const MessageID ENEMY_DAMAGE_MESSAGE = 0x1; - extern Enemy* MakeEnemy(); extern Enemy* SpawnEnemy(Vector location, const State* entryState); @@ -35,11 +43,11 @@ 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 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); } +static long EnemyGetDepth(Enemy* self) { return (long)(-self->transform.position.y * 1000); } impl_Transformable_for(Enemy, EnemyGetTransform