Task und Buildings passen besser

main
Jonathan Hager 3 years ago
parent 1c1d919672
commit 8dbcf46304
Signed by: JonathanHager
GPG Key ID: 34881E488569708C

@ -6,6 +6,7 @@
#include "../MapObject/building.h" #include "../MapObject/building.h"
#include "../definitions.h" #include "../definitions.h"
#include "../Textures/textureatlas.h" #include "../Textures/textureatlas.h"
#include "entityacts.h"
Entity * EntityInit(Sprite *sprite, int profession, TextureAtlas *atlas){ Entity * EntityInit(Sprite *sprite, int profession, TextureAtlas *atlas){
Entity *new = malloc(sizeof(Entity)); Entity *new = malloc(sizeof(Entity));
@ -21,6 +22,14 @@ Entity * EntityInit(Sprite *sprite, int profession, TextureAtlas *atlas){
new->task = TaskInit(profession); new->task = TaskInit(profession);
new->profession = profession; new->profession = profession;
switch(profession){
case PR_BUILDER:
new->act = BuilderAct;
break;
default:
printf("WARNING: ENTITYINIT MIT FALSCHER ID AUFGERUFEN!\n");
}
Animation ***animations = 0; Animation ***animations = 0;
if(profession == PR_BUILDER){ if(profession == PR_BUILDER){
@ -42,71 +51,24 @@ EntityList * EntityListInit(){
return new; return new;
} }
void EntityListPrintForward(EntityList *entities){ void EntityMoveToDestination(Entity *entity){
}
void EntityListInsert(EntityList *entities, Entity *data){
if(entities->head == 0){
entities->head = data;
entities->tail = data;
}
else{
entities->tail->next = data;
data->prev = entities->tail;
entities->tail = data;
}
}
void EntityListRemove(EntityList *entities, Entity *remove){
if(remove == 0){
printf("WARNING: TRIED TO REMOVE NULLPOINTER\n");
}
else if(entities->head == remove && entities->tail == remove){
entities->head = 0;
entities->tail = 0;
}
else if(entities->head == remove){
remove->next->prev = 0;
entities->head = remove->next;
}
else if(entities->tail == remove){
remove->prev->next = 0;
entities->tail = remove->prev;
}
else{
remove->prev->next = remove->next;
remove->next->prev = remove->prev;
}
remove->next = 0;
remove->prev = 0;
}
void EntityListActAllEntities(Game *game){
EntityList *entities = game->entities;
//SpriteListPrintForward(game->sprites);
// Sprites move towards their destination
float movementSpeed = 150.0f * GetFrameTime(); float movementSpeed = 150.0f * GetFrameTime();
Entity *current = entities->head;
int counter = 0; if(entity->hasDestination == 1){
while (current != 0){
counter ++;
if(current->hasDestination == 1){
Vector2 movement = { Vector2 movement = {
current->destX - current->sprite->x, entity->destX - entity->sprite->x,
current->destY - current->sprite->y entity->destY - entity->sprite->y
}; };
if(Vector2Length(movement) < movementSpeed){ if(Vector2Length(movement) < movementSpeed){
current->hasDestination = 0; entity->hasDestination = 0;
current->sprite->x = current->destX; entity->sprite->x = entity->destX;
current->sprite->y = current->destY; entity->sprite->y = entity->destY;
} }
else{ else{
movement = Vector2Normalize(movement); movement = Vector2Normalize(movement);
movement = Vector2Scale(movement, movementSpeed); movement = Vector2Scale(movement, movementSpeed);
current->sprite->x += movement.x; entity->sprite->x += movement.x;
current->sprite->y += movement.y; entity->sprite->y += movement.y;
// Change sprite according to direction // Change sprite according to direction
Vector2 nullvektor = {0,0}; Vector2 nullvektor = {0,0};
@ -116,79 +78,85 @@ void EntityListActAllEntities(Game *game){
if(angle <= 22.5 && angle >= -22.5){ if(angle <= 22.5 && angle >= -22.5){
// E // E
AnimationChangeDirection(current->animationHandler, E); AnimationChangeDirection(entity->animationHandler, E);
} }
else if(angle > 0 && angle <= 67.5){ else if(angle > 0 && angle <= 67.5){
// NE // NE
AnimationChangeDirection(current->animationHandler, NE); AnimationChangeDirection(entity->animationHandler, NE);
} }
else if(angle > 0 && angle <= 112.5){ else if(angle > 0 && angle <= 112.5){
// N // N
AnimationChangeDirection(current->animationHandler, N); AnimationChangeDirection(entity->animationHandler, N);
} }
else if(angle > 0 && angle <= 157.5){ else if(angle > 0 && angle <= 157.5){
// NW // NW
AnimationChangeDirection(current->animationHandler, NW); AnimationChangeDirection(entity->animationHandler, NW);
} }
else if(angle < 0 && angle >= -67.5){ else if(angle < 0 && angle >= -67.5){
// SE // SE
AnimationChangeDirection(current->animationHandler, SE); AnimationChangeDirection(entity->animationHandler, SE);
} }
else if(angle < 0 && angle >= -112.5){ else if(angle < 0 && angle >= -112.5){
// S // S
AnimationChangeDirection(current->animationHandler, S); AnimationChangeDirection(entity->animationHandler, S);
} }
else if(angle < 0 && angle >= -157.5){ else if(angle < 0 && angle >= -157.5){
// SW // SW
AnimationChangeDirection(current->animationHandler, SW); AnimationChangeDirection(entity->animationHandler, SW);
} }
else{ else{
// W // W
AnimationChangeDirection(current->animationHandler, W); AnimationChangeDirection(entity->animationHandler, W);
}
}
} }
} }
void EntityListPrintForward(EntityList *entities){
}
void EntityListInsert(EntityList *entities, Entity *data){
if(entities->head == 0){
entities->head = data;
entities->tail = data;
} }
else{ else{
if(current->profession == PR_BUILDER){ entities->tail->next = data;
if(current->task->target == 0){ data->prev = entities->tail;
// Prüft, ob eine Baustelle existiert entities->tail = data;
Building *currentBU = game->buildings->head;
while(currentBU != 0){
if(currentBU->isBaustelle){
current->hasDestination = 1;
current->destX = currentBU->sprite->x;
current->destY = currentBU->sprite->y;
current->task->target = currentBU;
current->task->progress = 0;
break;
} }
currentBU = currentBU->next;
} }
void EntityListRemove(EntityList *entities, Entity *remove){
if(remove == 0){
printf("WARNING: TRIED TO REMOVE NULLPOINTER\n");
} }
else{ else if(entities->head == remove && entities->tail == remove){
// Is beim target angekommen entities->head = 0;
if(current->task->progress == 0){ entities->tail = 0;
// Angekommen, noch nicht mit arbeiten begonnen
AnimationChangeType(current->animationHandler, AN_ENTITY_ARBEITEN);
current->task->progress += 0.01;
}
else if(current->task->progress >= 1.0){
// Fertig mit arbeiten, Animation zu Idle zurück
AnimationChangeType(current->animationHandler, AN_ENTITY_IDLE);
BuildingFinishConstruction(game, (Building *) current->task->target);
current->task->target = 0;
} }
else{ else if(entities->head == remove){
current->task->progress += 0.2 * GetFrameTime(); remove->next->prev = 0;
printf("%f\n", current->task->progress); entities->head = remove->next;
}
else if(entities->tail == remove){
remove->prev->next = 0;
entities->tail = remove->prev;
} }
else{
remove->prev->next = remove->next;
remove->next->prev = remove->prev;
} }
remove->next = 0;
remove->prev = 0;
} }
void EntityListActAllEntities(Game *game){
} Entity *current = game->entities->head;
while (current != 0){
current->act(game, current);
AnimationUpdate(current->animationHandler); AnimationUpdate(current->animationHandler);

@ -10,14 +10,17 @@ typedef struct Entity Entity;
typedef struct Entity{ typedef struct Entity{
Sprite *sprite; Sprite *sprite;
AnimationHandler *animationHandler; AnimationHandler *animationHandler;
float angle; float angle;
float destX; float destX;
float destY; float destY;
int hasDestination; int hasDestination;
int selected; int selected;
Task *task;
int profession; int profession;
Task *task;
void (*act)(Game *, Entity *);
Entity *next; Entity *next;
Entity *prev; Entity *prev;
} Entity; } Entity;
@ -30,6 +33,8 @@ typedef struct EntityList{
Entity * EntityInit(Sprite *sprite, int profession, TextureAtlas *atlas); Entity * EntityInit(Sprite *sprite, int profession, TextureAtlas *atlas);
EntityList * EntityListInit(); EntityList * EntityListInit();
void EntityMoveToDestination(Entity *entity);
void EntityListPrintForward(EntityList *entities); void EntityListPrintForward(EntityList *entities);
void EntityListInsert(EntityList *entities, Entity *data); void EntityListInsert(EntityList *entities, Entity *data);
void EntityListRemove(EntityList *entities, Entity *remove); void EntityListRemove(EntityList *entities, Entity *remove);

@ -0,0 +1,51 @@
#include "entityacts.h"
#include "../Textures/animationHandler.h"
#include "../MapObject/building.h"
void BuilderAct(Game *game, Entity *entity){
Building *target = (Building *) entity->task->target;
// Hat noch keine Baustelle oder die Baustelle wurde fertiggestellt
if(entity->task->target == 0 || !target->isBaustelle){
AnimationChangeType(entity->animationHandler, AN_ENTITY_IDLE);
if(entity->hasDestination == 1){
entity->hasDestination = 0;
}
// Prüft, ob eine Baustelle existiert
Building *current = game->buildings->head;
while(current != 0){
if(current->isBaustelle){
entity->hasDestination = 1;
entity->destX = current->sprite->x;
entity->destY = current->sprite->y;
entity->task->target = current;
entity->task->progress = 0;
break;
}
current = current->next;
}
}
else if(entity->hasDestination == 1){
EntityMoveToDestination(entity);
}
else{
// Is beim target angekommen
if(entity->task->progress == 0){
// Angekommen, noch nicht mit arbeiten begonnen
AnimationChangeType(entity->animationHandler, AN_ENTITY_ARBEITEN);
target->progress += 0.01;
}
else if(target->progress >= 1.0){
// Fertig mit arbeiten, Animation zu Idle zurück
AnimationChangeType(entity->animationHandler, AN_ENTITY_IDLE);
BuildingFinishConstruction(game, (Building *) entity->task->target);
entity->task->target = 0;
}
else{
target->progress += 0.2 * GetFrameTime();
}
}
}

@ -0,0 +1,8 @@
#ifndef ENTITYACTS_H_
#define ENTITYACTS_H_
#include "entity.h"
#include "../game.h"
void BuilderAct(Game *game, Entity *entity);
#endif

@ -1,6 +1,6 @@
CC = gcc CC = gcc
FLAGS = -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 FLAGS = -lraylib -lGL -lm -lpthread -ldl -lrt -lX11
OBJS = main.o sprite.o inputHandler.o isometricMap.o game.o textureatlas.o animation.o animationHandler.o button.o uiContainer.o debug.o building.o entity.o selectable.o task.o OBJS = main.o sprite.o inputHandler.o isometricMap.o game.o textureatlas.o animation.o animationHandler.o button.o uiContainer.o debug.o building.o entity.o selectable.o task.o entityacts.o
spiel: $(OBJS) spiel: $(OBJS)
$(CC) -o spiel $(OBJS) $(FLAGS) $(CC) -o spiel $(OBJS) $(FLAGS)
@ -50,5 +50,8 @@ selectable.o: Ui/selectable.c
task.o: Entity/task.c task.o: Entity/task.c
$(CC) -c Entity/task.c $(FLAGS) $(CC) -c Entity/task.c $(FLAGS)
entityacts.o: Entity/entityacts.c
$(CC) -c Entity/entityacts.c $(FLAGS)
clean: clean:
rm *.o spiel rm *.o spiel

@ -11,6 +11,7 @@ Building * BuildingInit(Game *game, int id, int x, int y){
new->sprite = newSprite; new->sprite = newSprite;
new->id = id; new->id = id;
new->isBaustelle = 1; new->isBaustelle = 1;
new->progress = 0;
new->next = 0; new->next = 0;
new->prev = 0; new->prev = 0;

@ -7,6 +7,7 @@ typedef struct Building{
Sprite *sprite; Sprite *sprite;
int id; int id;
int isBaustelle; int isBaustelle;
float progress;
struct Building *next; struct Building *next;
struct Building *prev; struct Building *prev;

Loading…
Cancel
Save