#include "list.h" #include #include #include "../sprite.h" #include "raylib.h" #include "raymath.h" #include "../Textures/textureIDs.h" Node * ListCreateNode(Sprite *data){ Node *new = (Node *) malloc(sizeof(Node)); new->data = *data; new->next = 0; new->prev = 0; return new; } void ListPrintForward(List *list){ Node *current = list->head; printf("\n[\n"); while(current != 0){ //printf("(%f | %f),\n", current->data.x, current->data.y); current = current->next; } printf("]\n"); } void ListInsertFront(List *list, Sprite *data){ Node *new = ListCreateNode(data); if(list->head == 0){ list->head = new; list->tail = new; } else if(list->head == list->tail){ list->head = new; list->head->next = list->tail; list->tail->prev = list->head; } else{ list->head->prev = new; new->next = list->head; list->head = new; } } void ListInsertBack(List *list, Sprite *data){ Node *new = ListCreateNode(data); if(list->head == 0){ list->head = new; list->tail = new; } else if(list->head == list->tail){ list->tail = new; list->head->next = list->tail; list->tail->prev = list->head; } else{ list->tail->next = new; new->prev = list->tail; list->tail = new; } } List * ListInit(){ List *newList = (List *) malloc(sizeof(List)); newList->head = 0; newList->tail = 0; return newList; } // iterates over all Sprites in the list and draws them to the world void ListDrawAllSprites(List *list, IsometricMap **map, Camera2D *camera){ Node *current = list->head; while(current != 0){ DrawSpriteToWorld(¤t->data, map, camera); current = current->next; } } // iterates over all Sprites in the list and does their acting (moving etc) void ListActAllSprites(Game *game){ // Sprites move towards their destination float movementSpeed = 150.0f * GetFrameTime(); Node *current = game->sprites->head; while (current != 0){ if(current->data.hasDestination == 1){ Vector2 movement = { current->data.destX - current->data.x, current->data.destY - current->data.y }; if(Vector2Length(movement) < movementSpeed){ current->data.hasDestination = 0; current->data.x = current->data.destX; current->data.y = current->data.destY; } else{ movement = Vector2Normalize(movement); movement = Vector2Scale(movement, movementSpeed); current->data.x += movement.x; current->data.y += movement.y; // Change sprite according to direction Vector2 nullvektor = {0,0}; float angle = Vector2Angle(movement, nullvektor); angle = angle * RAD2DEG; angle -= 35.26; if(angle <= 22.5 && angle >= -22.5){ // E AnimationChangeAnimation(current->data.animationHandler, E); } else if(angle > 0 && angle <= 67.5){ // NE AnimationChangeAnimation(current->data.animationHandler, NE); } else if(angle > 0 && angle <= 112.5){ // N AnimationChangeAnimation(current->data.animationHandler, N); } else if(angle > 0 && angle <= 157.5){ // NW AnimationChangeAnimation(current->data.animationHandler, NW); } else if(angle < 0 && angle >= -67.5){ // SE AnimationChangeAnimation(current->data.animationHandler, SE); } else if(angle < 0 && angle >= -112.5){ // S AnimationChangeAnimation(current->data.animationHandler, S); } else if(angle < 0 && angle >= -157.5){ // SW AnimationChangeAnimation(current->data.animationHandler, SW); } else{ // W AnimationChangeAnimation(current->data.animationHandler, W); } } } SpriteUpdateAnimation(¤t->data); // updating z-position according to the tile the sprite stands on Tile *floorTile = IsometricMapGetTileFromWorldCoordinates(game->layers, current->data.x, current->data.y, 0); Tile *topTile = IsometricMapGetMostUpperTile(game->layers, floorTile); current->data.z = topTile->z; current = current->next; } }