#include "sprite.h" #include "raylib.h" #include #include #include "../IsometricMap/isometricMap.h" #include "../Textures/textureIDs.h" #include "../Textures/animationHandler.h" #include "../Textures/animation.h" #include "../Textures/textureatlas.h" #include "../IsometricMap/tile.h" void DrawSpriteToWorld(Sprite *sprite, IsometricMap *map, Camera2D *camera){ Vector2 pos = {sprite->x - sprite->texture->width, sprite->y - sprite->texture->height/2}; IsometricMapUnproject(map, camera, pos.x, pos.y, sprite->z, &pos); pos.x -= camera->target.x; pos.y -= camera->target.y; /* if(sprite->selected){ DrawTexture(*sprite->texture, pos.x, pos.y, (Color){255, 255, 255, 200}); //DrawTexture(*sprite->texture, sprite->x, sprite->y, BLACK); } else{ */ DrawTexture(*sprite->texture, pos.x, pos.y, WHITE); //} } void DrawSpriteToScreen(Sprite *sprite){ /*if(sprite->selected){ DrawTexture(*sprite->texture, sprite->x, sprite->y, (Color){255, 255, 255, 200}); //DrawTexture(*sprite->texture, sprite->x, sprite->y, BLACK); } else{ */ DrawTexture(*sprite->texture, sprite->x, sprite->y, WHITE); // } } void SpriteUpdate(Sprite *sprite){ sprite->depth = sprite->x + sprite->y + sprite->z; if(sprite->angle <= 22.5 && sprite->angle >= -22.5){ // E AnimationChangeAnimation(sprite->animationHandler, E); } else if(sprite->angle > 0 && sprite->angle <= 67.5){ // NE AnimationChangeAnimation(sprite->animationHandler, NE); } else if(sprite->angle > 0 && sprite->angle <= 112.5){ // N AnimationChangeAnimation(sprite->animationHandler, N); } else if(sprite->angle > 0 && sprite->angle <= 157.5){ // NW AnimationChangeAnimation(sprite->animationHandler, NW); } else if(sprite->angle < 0 && sprite->angle >= -67.5){ // SE AnimationChangeAnimation(sprite->animationHandler, SE); } else if(sprite->angle < 0 && sprite->angle >= -112.5){ // S AnimationChangeAnimation(sprite->animationHandler, S); } else if(sprite->angle < 0 && sprite->angle >= -157.5){ // SW AnimationChangeAnimation(sprite->animationHandler, SW); } else{ // W AnimationChangeAnimation(sprite->animationHandler, W); } AnimationUpdate(sprite->animationHandler); sprite->texture = sprite->animationHandler->currentFrame->texture; } Sprite * SpriteCreate(TextureAtlas *atlas, int textureID, int x, int y){ Sprite *newSprite = malloc(sizeof(Sprite)); //AnimationHandler create Animation **animations = 0; if(textureID == worker){ animations = atlas->workerAnimations; } else if(textureID == cursor){ animations = atlas->cursorAnimation; } else{ printf("\n\n\n\n\n\n\n\nSpriteCreate mit falscher ID (%d) aufgerufen oder ID nicht bekannt!!!\n\n\n\n\n\n\n\n", textureID); } AnimationHandler *newHandler = AnimationHandlerInit(animations); newSprite->animationHandler = newHandler; newSprite->texture = newSprite->animationHandler->currentFrame->texture; newSprite->x = x - newSprite->texture->width / 2; newSprite->y = y - newSprite->texture->height / 2; newSprite->z = 0; newSprite->depth = newSprite->x + newSprite->y; newSprite->angle = 0; newSprite->next = 0; newSprite->prev = 0; return newSprite; } void SpriteListPrintForward(SpriteList *list){ Sprite *current = list->head; printf("\n[\n"); while(current != 0){ printf("%f,\n", current->depth); current = current->next; } printf("]\n"); } void SpriteListInsertBefore(SpriteList *list, Sprite *new, Sprite *current){ new->next = current; new->prev = current->prev; current->prev = new; if(current == list->head){ list->head = new; } else{ new->prev->next = new; } } void SpriteListInsertAfter(SpriteList *list, Sprite *new, Sprite *current){ new->prev = current; new->next = current->next; current->next = new; if(current == list->tail){ list->tail = new; } else{ new->next->prev = new; } } void SpriteListInsert(SpriteList *list, Sprite *new){ if(list->head == 0){ list->head = new; list->tail = new; } else{ Sprite *current = list->head; while(current != 0){ if(new->depth < current->depth){ SpriteListInsertBefore(list, new, current); return; } current = current->next; } SpriteListInsertAfter(list, new, list->tail); } } void SpriteListSpriteChanged(SpriteList *list, Sprite *changed){ if(changed != list->tail && changed->depth > changed->next->depth){ //Nach rechts Sprite *current = changed->next; SpriteListRemove(list, changed); while(current != 0){ if(changed->depth < current->depth){ SpriteListInsertBefore(list, changed, current); return; } current = current->next; } SpriteListInsertAfter(list, changed, list->tail); } else if(changed != list->head && changed->depth < changed->prev->depth){ //Nach links Sprite *current = changed->prev; SpriteListRemove(list, changed); while(current != 0){ if(changed->depth > current->depth){ SpriteListInsertAfter(list, changed, current); return; } current = current->prev; } SpriteListInsertBefore(list, changed, list->head); } } void SpriteListRemove(SpriteList *list, Sprite *remove){ if(remove == 0){ printf("WARNING: TRIED TO REMOVE NULLPOINTER\n"); } else if(list->head == remove && list->tail == remove){ list->head = 0; list->tail = 0; } else if(list->head == remove){ remove->next->prev = 0; list->head = remove->next; } else if(list->tail == remove){ remove->prev->next = 0; list->tail = remove->prev; } else{ remove->prev->next = remove->next; remove->next->prev = remove->prev; } remove->next = 0; remove->prev = 0; } SpriteList * SpriteListInit(){ SpriteList *newSpriteList = malloc(sizeof(SpriteList)); newSpriteList->head = 0; newSpriteList->tail = 0; return newSpriteList; } // iterates over all Sprites in the list and draws them to the world void SpriteListDrawAllSprites(SpriteList *list, IsometricMap *map, Camera2D *camera){ Sprite *current = list->head; // Only drawing the Sprites which are within Camera view Vector2 topleft = {0, 0}; IsometricMapProject(map, camera, topleft.x, topleft.y, &topleft); Vector2 topright = {GetScreenWidth(), 0}; IsometricMapProject(map, camera, topright.x, topright.y, &topright); Vector2 botleft = {0, GetScreenHeight()}; IsometricMapProject(map, camera, botleft.x, botleft.y, &botleft); Vector2 botright = {GetScreenWidth(), GetScreenHeight()}; IsometricMapProject(map, camera, botright.x, botright.y, &botright); int extraPixels = 0; int itmp, jtmp, maxI, maxJ; itmp = (int)(topleft.x) - extraPixels; jtmp = (int)(topright.y) - extraPixels; maxI = (int)(botright.x) + extraPixels; maxJ = (int)(botleft.y) + extraPixels; while(current != 0){ // drawing some extra corner pixels // if extraPixels == 0 you can see flickering in the corners // Only drawing the Sprites which are within Camera view if( current->x > itmp && current->y > jtmp && current->x < maxI && current->y < maxJ){ DrawSpriteToWorld(current, map, camera); } current = current->next; } }