IsometricMap Layers added, currently Array, might be List in the future && Selecting tiles from every layer possible

main
JanEhehalt 3 years ago
parent e836ba2510
commit 7fc4434836

@ -6,6 +6,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include "../List/list.h" #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? //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 // Man hat einen Übergabeparameter mit dem man dann alles verändern kann, man muss nicht alles was man verändern will einzeln übergeben
@ -53,17 +54,34 @@ Vector2 GetRectangle(Vector2 rectStart){
return rectStart; return rectStart;
} }
void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap *map){ void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap **layers){
inputHandler->cursorPos.x = GetMousePosition().x; inputHandler->cursorPos.x = GetMousePosition().x;
inputHandler->cursorPos.y = GetMousePosition().y; inputHandler->cursorPos.y = GetMousePosition().y;
// resetting last selected Tile to grass texture // resetting last selected Tile to grass texture
IsometricMapChangeTextureIdOfTile(map, (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 0); int n = 9;
// updating selected tile if(inputHandler->selectedLayer != -1){
IsometricMapProject(map, camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->selectedTile); IsometricMapChangeTextureIdOfTile(layers[inputHandler->selectedLayer], (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 0);
// setting currently selected tile to tower }
IsometricMapChangeTextureIdOfTile(map, (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 1); for(n = 2; n >= 0 ; n--){
if(layers[n] != 0){
IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->selectedTile);
Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(layers[n], inputHandler->selectedTile.x, inputHandler->selectedTile.y);
if(selectedTile != 0){
//printf("ALARM bei n = %d \n", n);
inputHandler->selectedTile.x = selectedTile->x;
inputHandler->selectedTile.y = selectedTile->y;
// setting currently selected tile to tower
inputHandler->selectedLayer = n;
IsometricMapChangeTextureIdOfTile(layers[n], (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 1);
break;
}
}
}
if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){ if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){

@ -13,7 +13,7 @@ typedef struct InputHandler{
int selectedLayer; int selectedLayer;
} InputHandler; } InputHandler;
void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap *map); void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap **layers);
void keyboardInput(InputHandler *inputHandler, Camera2D *camera); void keyboardInput(InputHandler *inputHandler, Camera2D *camera);

@ -14,6 +14,8 @@ IsometricMap * IsometricMapInit(int x, int y, int layer){
map->originY = -layer * map->tileTextures[0].width / 4; map->originY = -layer * map->tileTextures[0].width / 4;
map->width = x * map->tileTextures[0].width; map->width = x * map->tileTextures[0].width;
map->height = y * map->tileTextures[0].height; map->height = y * map->tileTextures[0].height;
map->widthBounds = 100;
map->heightBounds = 100;
Tile*** tiles = (Tile***)malloc(x*sizeof(Tile*)); Tile*** tiles = (Tile***)malloc(x*sizeof(Tile*));
int n = 0; int n = 0;
@ -59,13 +61,13 @@ Tile * IsometricMapGetTileFromArrayPosition(IsometricMap *map, int x, int y){
return map->tiles[x][y]; return map->tiles[x][y];
} }
void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, int y, Vector2 *tmp){ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x, float y, Vector2 *tmp){
int mouseAdjustmentX = -8; int mouseAdjustmentX = -8;
int mouseAdjustmentY = -4; int mouseAdjustmentY = -4;
float tileWidthHalf = isometricMap->tileTextures[0].width / 2; float tileWidthHalf = isometricMap->tileTextures[0].width / 2;
float tileHeightHalf = isometricMap->tileTextures[0].height / 4; float tileHeightQuarter = isometricMap->tileTextures[0].height / 4;
x += camera->target.x + mouseAdjustmentX; x += camera->target.x + mouseAdjustmentX;
y += camera->target.y + mouseAdjustmentY; y += camera->target.y + mouseAdjustmentY;
@ -74,19 +76,34 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, in
float yPos = (float) y; float yPos = (float) y;
int isoX = 0.5 * ( xPos / tileWidthHalf + yPos / tileHeightHalf); float isoX = 0.5 * ( xPos / tileWidthHalf + yPos / tileHeightQuarter);
int isoY = 0.5 * ( -xPos / tileWidthHalf + yPos / tileHeightHalf); float isoY = 0.5 * ( -xPos / tileWidthHalf + yPos / tileHeightQuarter);
tmp->x = isoX * isometricMap->tileTextures[0].width;
tmp->y = isoY * isometricMap->tileTextures[0].height;
}
Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float x, float y){
x = (int)(x / isometricMap->tileTextures->width);
y = (int)(y / isometricMap->tileTextures->height);
//Vector2 tmp = {isoX * tileWidthHalf * 2, isoY * tileHeightHalf * 2}; Tile *ptr = (Tile *) malloc(sizeof(Tile *));
//Vector2* tmp = (Vector2 *) malloc(sizeof(Vector2)); ptr->x = 0;
tmp->x = isoX; ptr->y = 0;
tmp->y = isoY;
//return tmp; if( x < isometricMap->sizeX && y < isometricMap->sizeY &&
x >= 0 && y >= 0 ){
ptr->x = isometricMap->tiles[(int)x][(int)y]->x;
ptr->y = isometricMap->tiles[(int)x][(int)y]->y;
return ptr;
}
ptr = 0;
return ptr;
} }
void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId){ void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId){
//if(x < isometricMap->sizeX && y < isometricMap->sizeY){ //if(x < isometricMap->sizeX && y < isometricMap->sizeY){
@ -105,7 +122,7 @@ void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId
void IsometricMapChangeTextureIdOfTile(IsometricMap *map, int x, int y, int id){ void IsometricMapChangeTextureIdOfTile(IsometricMap *map, int x, int y, int id){
if( x < map->sizeX && y < map->sizeY && if( x < map->sizeX && y < map->sizeY &&
x > map->originX && y > map->originY ){ x >= 0 && y >= 0 ){
(map->tiles[x][y])->textureId = id; (map->tiles[x][y])->textureId = id;
} }
} }

@ -12,6 +12,8 @@ typedef struct IsometricMap{
int originY; int originY;
int width; int width;
int height; int height;
int widthBounds;
int heightBounds;
} IsometricMap; } IsometricMap;
// TODO: // TODO:
@ -24,7 +26,7 @@ IsometricMap * IsometricMapInit(int x, int y, int layer);
Vector2 * IsometricMapCalcOffsetForTileAt(int x, int y, int textureSize); Vector2 * IsometricMapCalcOffsetForTileAt(int x, int y, int textureSize);
Tile * IsometricMapGetTileFromArrayPosition(IsometricMap *isometricMap, int x, int y); Tile * IsometricMapGetTileFromArrayPosition(IsometricMap *isometricMap, int x, int y);
// Screen Coordinates -> World Coordinates // Screen Coordinates -> World Coordinates
void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, int y, Vector2 *tmp); void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x, float y, Vector2 *tmp);
void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId); void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId);
void IsometricMapChangeTextureIdOfTile(IsometricMap *map, int x, int y, int id); void IsometricMapChangeTextureIdOfTile(IsometricMap *map, int x, int y, int id);

@ -35,21 +35,26 @@ void IsometricRendererDrawMap(IsometricRenderer *renderer, int height){
} }
} }
void IsometricRendererRenderIsometricMap(IsometricMap *map, InputHandler *input){ void IsometricRendererRenderIsometricMap(IsometricMap **map, InputHandler *input){
int n = 0;
int i = 0; int i = 0;
int j = 0; int j = 0;
for(i=0; i < map->sizeX; i++){ for(n = 0; n < 9; n++){
for(j=0; j < map->sizeY; j++){ if(map[n] == 0){
Vector2 *offset = IsometricMapCalcOffsetForTileAt(i,j, map->tileTextures[0].width); break;
}
float x = map->originX + offset->x; for(i=0; i < map[n]->sizeX; i++){
float y = map->originY + offset->y; for(j=0; j < map[n]->sizeY; j++){
Vector2 *offset = IsometricMapCalcOffsetForTileAt(i,j, map[n]->tileTextures[0].width);
int textureId = map->tiles[i][j]->textureId;
float x = map[n]->originX + offset->x;
DrawTexture(map->tileTextures[textureId], x, y, WHITE); float y = map[n]->originY + offset->y;
int textureId = map[n]->tiles[i][j]->textureId;
DrawTexture(map[n]->tileTextures[textureId], x, y, WHITE);
}
} }
} }
} }

@ -10,6 +10,6 @@ typedef struct IsometricRenderer{
void IsometricRendererDrawMap(IsometricRenderer *renderer, int height); void IsometricRendererDrawMap(IsometricRenderer *renderer, int height);
void IsometricRendererRenderIsometricMap(IsometricMap *map, InputHandler *input); void IsometricRendererRenderIsometricMap(IsometricMap **map, InputHandler *input);
#endif #endif

@ -14,6 +14,4 @@ Fantasy Welt oder Realistisch?
## TODO ## TODO
+ Sprites in LinkedList speichern + Sprites in LinkedList speichern
+ LinkedList erweitern + LinkedList erweitern
+ IsometricMap Array erstellen für die verschiedenen Layer
+ Auswählen von Tiles auf höheren Layern

@ -29,7 +29,7 @@ int main(){
inputHandler.cursorPos.y = 0; inputHandler.cursorPos.y = 0;
inputHandler.selectedTile.x = 0; inputHandler.selectedTile.x = 0;
inputHandler.selectedTile.y = 0; inputHandler.selectedTile.y = 0;
inputHandler.selectedLayer = 0; inputHandler.selectedLayer = -1;
Camera2D camera = { 0 }; Camera2D camera = { 0 };
camera.target = (Vector2){0, 0}; camera.target = (Vector2){0, 0};
@ -39,13 +39,18 @@ int main(){
// TODO -> Isometric Map Array for multiple Layers // TODO -> Isometric Map Array for multiple Layers
// -> Make only most upper layer selectable // -> Make only most upper layer selectable
// take selected Tile, if that tile has one above select a tile in the upper layer // take selected Tile, if that tile has one above select a tile in the upper layer
IsometricMap *map = IsometricMapInit(50, 80, 0); //IsometricMap *map = IsometricMapInit(50, 80, 0);
IsometricMap *Layer1 = IsometricMapInit(20, 20, 1); //IsometricMap *Layer1 = IsometricMapInit(20, 20, 1);
IsometricMap *Layer2 = IsometricMapInit(15, 15, 2); //IsometricMap *Layer2 = IsometricMapInit(15, 15, 2);
IsometricMap *Layer3 = IsometricMapInit(10, 10, 3); //IsometricMap *Layer3 = IsometricMapInit(10, 10, 3);
IsometricMap *Layer4 = IsometricMapInit(4, 4, 4); //IsometricMap *Layer4 = IsometricMapInit(4, 4, 4);
IsometricMap **layers = (IsometricMap **) malloc(10*sizeof(IsometricMap *));
layers[0] = IsometricMapInit(50, 80, 0);
layers[1] = IsometricMapInit(20, 20, 1);
layers[2] = IsometricMapInit(15, 10, 2);
IsometricMapAddTile(Layer4, 2, 2, 1);
SetTargetFPS(60); SetTargetFPS(60);
while(!WindowShouldClose()){ while(!WindowShouldClose()){
@ -56,11 +61,13 @@ int main(){
BeginMode2D(camera); BeginMode2D(camera);
IsometricRendererRenderIsometricMap(map, &inputHandler); //IsometricRendererRenderIsometricMap(map, &inputHandler);
IsometricRendererRenderIsometricMap(Layer1, &inputHandler); //IsometricRendererRenderIsometricMap(Layer1, &inputHandler);
IsometricRendererRenderIsometricMap(Layer2, &inputHandler); //IsometricRendererRenderIsometricMap(Layer2, &inputHandler);
IsometricRendererRenderIsometricMap(Layer3, &inputHandler); //IsometricRendererRenderIsometricMap(Layer3, &inputHandler);
IsometricRendererRenderIsometricMap(Layer4, &inputHandler); //IsometricRendererRenderIsometricMap(Layer4, &inputHandler);
IsometricRendererRenderIsometricMap(layers, &inputHandler);
ListDrawAllSprites(sprites); ListDrawAllSprites(sprites);
@ -72,7 +79,7 @@ int main(){
DrawSprite(&cursorSprite); DrawSprite(&cursorSprite);
// User Input Handling // User Input Handling
mouseInput(&inputHandler, sprites, &texture, &camera, map); mouseInput(&inputHandler, sprites, &texture, &camera, layers);
keyboardInput(&inputHandler, &camera); keyboardInput(&inputHandler, &camera);
// Sprites move towards their destination // Sprites move towards their destination

Loading…
Cancel
Save