#include "inputHandler.h" #include "raylib.h" #include "../sprite.h" #include "../IsometricMap/isometricMap.h" #include #include #include #include "../List/list.h" #include "../IsometricMap/tile.h" //TODO: Macht es Sinn ein einzelnes "Game" struct zu haben, das alle möglichen Pointer hat zu allen arrays, camera, textures etc? // Man hat einen Übergabeparameter mit dem man dann alles verändern kann, man muss nicht alles was man verändern will einzeln übergeben void DrawRect(Vector2 rectStart, Vector2 *mousePosition){ float width = GetMousePosition().x - rectStart.x; float height = GetMousePosition().y - rectStart.y; if(width < 0 && height >= 0){ width *= -1; rectStart.x -= width; } else if(height < 0 && width >= 0){ height *= -1; rectStart.y -= height; } else if(height < 0 && width < 0){ height *= -1; width *= -1; rectStart.x -= width; rectStart.y -= height; } DrawRectangleLines(rectStart.x, rectStart.y, width, height, GREEN); } Vector2 GetRectangle(Vector2 rectStart){ float width = GetMousePosition().x - rectStart.x; float height = GetMousePosition().y - rectStart.y; if(width < 0 && height >= 0){ width *= -1; rectStart.x -= width; } else if(height < 0 && width >= 0){ height *= -1; rectStart.y -= height; } else if(height < 0 && width < 0){ height *= -1; width *= -1; rectStart.x -= width; rectStart.y -= height; } return rectStart; } void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap **layers){ inputHandler->cursorPos.x = GetMousePosition().x; inputHandler->cursorPos.y = GetMousePosition().y; // resetting last selected Tile to grass texture int n = 9; if(inputHandler->selectedLayer != -1){ IsometricMapChangeTextureIdOfTile(layers[inputHandler->selectedLayer], (int) inputHandler->cursorWorldPos.x, (int) inputHandler->cursorWorldPos.y, 0); } // TODO: n=2 no good style, but Segmentation fault when > layerAmount for(n = 9; n >= 0 ; n--){ if(layers[n] != 0){ IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->cursorWorldPos); Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(layers[n], inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y); if(selectedTile != 0){ inputHandler->cursorWorldPos.x = selectedTile->x; inputHandler->cursorWorldPos.y = selectedTile->y; // setting currently selected tile to tower inputHandler->selectedLayer = n; IsometricMapChangeTextureIdOfTile(layers[n], (int) inputHandler->cursorWorldPos.x, (int) inputHandler->cursorWorldPos.y, 1); break; } } } if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){ if(inputHandler->pressed == 0){ inputHandler->rectStart.x = GetMousePosition().x; inputHandler->rectStart.y = GetMousePosition().y; inputHandler->pressed = 1; } } if(inputHandler->pressed){ DrawRect(inputHandler->rectStart, &(inputHandler->cursorPos)); } if(IsMouseButtonReleased(MOUSE_BUTTON_LEFT)){ inputHandler->pressed = 0; float width = GetMousePosition().x - inputHandler->rectStart.x; float height = GetMousePosition().y - inputHandler->rectStart.y; // Add Sprite if(width + height <= 1){ ListInsertBack(sprites, SpriteCreate(texture, inputHandler->cursorPos.x + (*camera).target.x - (texture->width)/2, inputHandler->cursorPos.y + (*camera).target.y - (texture->height)/2)); } // Berechnung, welche Sprites ausgewählt wurden Vector2 rect = GetRectangle(inputHandler->rectStart); width = abs(width); height = abs(height); printf("Auswahl: x: %f, y: %f, w: %f, h: %f\n", rect.x, rect.y, width, height); float deltaX; float deltaY; Node *current = sprites->head; while (current != 0){ deltaX = current->data.x + current->data.texture->width/2 - (rect.x + camera->target.x); deltaY = current->data.y + current->data.texture->height/2 - (rect.y + camera->target.y); printf("deltaX: %f, deltaY: %f\n", deltaX, deltaY); if(deltaX > 0 && deltaX < width && deltaY > 0 && deltaY < height){ current->data.selected = 1; } else{ current->data.selected = 0; } current = current->next; } } if(IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)){ Node *current = sprites->head; while (current != 0){ if(current->data.selected){ current->data.hasDestination = 1; current->data.destX = inputHandler->cursorPos.x + (*camera).target.x - (texture->width)/2; current->data.destY = inputHandler->cursorPos.y + (*camera).target.y - (texture->height)/2; } current = current->next; } } } void keyboardInput(InputHandler *inputHandler, Camera2D *camera){ if(IsKeyDown(KEY_W)){ (*camera).target.y -= 1000.0f * GetFrameTime(); } if(IsKeyDown(KEY_S)){ (*camera).target.y += 1000.0f * GetFrameTime(); } if(IsKeyDown(KEY_D)){ (*camera).target.x += 1000.0f * GetFrameTime(); } if(IsKeyDown(KEY_A)){ (*camera).target.x -= 1000.0f * GetFrameTime(); } }