From 5a7fa96cf40f91c46d8c32aa729cb2459319f326 Mon Sep 17 00:00:00 2001 From: JanEhehalt Date: Wed, 30 Nov 2022 20:15:01 +0100 Subject: [PATCH] branching out --- IsometricMap/isometricMap.c | 11 +++++++++-- IsometricMap/isometricMap.h | 2 ++ IsometricMap/isometricRenderer.c | 11 ++++++++--- README.md | 3 ++- game.c | 4 ++-- main.c | 15 +++++++++++++++ 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/IsometricMap/isometricMap.c b/IsometricMap/isometricMap.c index 254e90d..cf25544 100644 --- a/IsometricMap/isometricMap.c +++ b/IsometricMap/isometricMap.c @@ -16,8 +16,8 @@ IsometricMap * IsometricMapInit(int layer){ //map->tileTextures[0] = LoadTexture("assets/desert.png"); //map->tileTextures[1] = LoadTexture("assets/bigtower.png"); - map->width = 100; - map->height = 100; + map->width = 200; + map->height = 200; map->textureWidth = map->tileTextures[0].width; map->textureHeight = map->tileTextures[0].height; map->worldPixelWidth = map->width * map->textureWidth; @@ -60,6 +60,13 @@ Vector2 * IsometricMapCalcOffsetForTileAt(int x, int y, int textureSize){ return offset; } +Vector2 * IsometricMapCalcOffsetForTileAtEfficient(int x, int y, int halfTextureSize, int quarterTextureSize){ + Vector2* offset = (Vector2 *)malloc(sizeof(Vector2)); + offset->x = x * halfTextureSize - y * halfTextureSize; + offset->y = x * quarterTextureSize + y * quarterTextureSize; + return offset; +} + // returns Tile at x y on layer isometricMap Tile * IsometricMapGetTileFromArrayPosition(IsometricMap *map, int x, int y){ return map->tiles[x][y]; diff --git a/IsometricMap/isometricMap.h b/IsometricMap/isometricMap.h index 2a8ec2c..10327ca 100644 --- a/IsometricMap/isometricMap.h +++ b/IsometricMap/isometricMap.h @@ -38,6 +38,8 @@ IsometricMap * IsometricMapInit(int layer); // For Rendering: calculates coordinate offset for a single tile at arrayPosition x y // Only works for tiles with texture width == height (and for 22.5 degree?) Vector2 * IsometricMapCalcOffsetForTileAt(int x, int y, int textureSize); +// saves many divisions +Vector2 * IsometricMapCalcOffsetForTileAtEfficient(int x, int y, int halfTextureSize, int quarterTextureSize); // Gives the most upper Tile above *tile Tile * IsometricMapGetMostUpperTile(IsometricMap **isometricMap, Tile *tile); diff --git a/IsometricMap/isometricRenderer.c b/IsometricMap/isometricRenderer.c index d33e7c4..2719012 100644 --- a/IsometricMap/isometricRenderer.c +++ b/IsometricMap/isometricRenderer.c @@ -48,10 +48,15 @@ void IsometricRendererRenderIsometricMap(Game *game){ for(i=0; i < game->layers[n]->width; i++){ for(j=0; j < game->layers[n]->height; j++){ // if tile had texture id -1, it would be empty tile - if(game->layers[n]->tiles[i][j]->textureId != -1){ - Vector2 *offset = IsometricMapCalcOffsetForTileAt(i,j, game->layers[n]->textureWidth); + if(game->layers[n]->tiles[i][j]->textureId == -1){ + } + else{ + int quarterTextureSize = game->layers[n]->textureWidth / 4; + int halfTextureSize = game->layers[n]->textureWidth / 2; + // SHOULD BE SET ONCE INITIALLY + Vector2 *offset = IsometricMapCalcOffsetForTileAtEfficient(i,j, halfTextureSize, quarterTextureSize); // the higher the layer the higher it needs to be drawed - offset->y -= n * (game->layers[n]->textureHeight/4); + offset->y -= n * quarterTextureSize; int textureId = game->layers[n]->tiles[i][j]->textureId; diff --git a/README.md b/README.md index 7a16309..68010f0 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,8 @@ Fantasy Welt oder Realistisch? + MapEditor * Rendering Reihenfolge: layer 0, Sprites auf layer 0, layer 1, Sprites auf layer 1; Theoretisch müssen die einzelnen Layer Reihenweise gedrawed werden mit den Sprites zwischendrin + IsometricMap struct erstellen, das den IsometricMap(+Layer) Array speichert ? - ++ TODO: Das rendern der IsometricMap wird bei größeren Maps sehr ineffizient; ++ Add offset x and y to each tile to be calculated ONCE, not every frame ### WiP diff --git a/game.c b/game.c index fb07a95..7f66bb7 100644 --- a/game.c +++ b/game.c @@ -70,9 +70,9 @@ Game *GameInit() for (n = 0; n < 10; n++) { - for (i = 0; i < 100; i++) + for (i = 0; i < game->layers[n]->width; i++) { - for (j = 0; j < 100; j++) + for (j = 0; j < game->layers[n]->height; j++) { if(i > 50 && i < 70 && j == 50){ IsometricMapChangeTextureIdOfTile(game->layers, i, j, n, 0); diff --git a/main.c b/main.c index e20c9b3..a081f46 100644 --- a/main.c +++ b/main.c @@ -22,6 +22,7 @@ int main(){ //SetTargetFPS(60); // GAME MAIN ROUTINE + int c = 0; while(!WindowShouldClose()){ ListActAllSprites(game); @@ -34,6 +35,20 @@ int main(){ IsometricRendererRenderIsometricMap(game); ListDrawAllSprites(game->sprites, game->layers, game->camera); + /* + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + ListInsertBack(game->sprites, SpriteCreate(game->textures, 1, 250 + c % 500, 250 + c % 500)); + c+=10; + printf("Sprites: %d\n", c); + */ EndMode2D(); // Moving cursor Sprite to Mouse Pos and drawing it