unprojection of world coordinates working

main
JanEhehalt 3 years ago
parent 60a9f75da1
commit 340b16abf8

@ -3,6 +3,7 @@
"files.associations": { "files.associations": {
"isometricrenderer.h": "c", "isometricrenderer.h": "c",
"sprite.h": "c", "sprite.h": "c",
"map": "c" "map": "c",
"isometricmap.h": "c"
} }
} }

@ -67,8 +67,12 @@ void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, C
// TODO: n=2 no good style, but Segmentation fault when > layerAmount // TODO: n=2 no good style, but Segmentation fault when > layerAmount
for(n = 9; n >= 0 ; n--){ for(n = 9; n >= 0 ; n--){
if(layers[n] != 0){ if(layers[n] != 0){
float tileWidthHalf = layers[n]->tileTextures[0].width / 2;
float tileHeightQuarter = layers[n]->tileTextures[0].height / 4;
int mouseAdjustmentX = -tileWidthHalf;
int mouseAdjustmentY = -tileHeightQuarter + (tileHeightQuarter * layers[n]->layer);
IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->cursorWorldPos); IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x + mouseAdjustmentX, inputHandler->cursorPos.y + mouseAdjustmentY, &inputHandler->cursorWorldPos);
Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(layers[n], inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y); Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(layers[n], inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y);

@ -64,12 +64,8 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x,
float tileWidthHalf = isometricMap->tileTextures[0].width / 2; float tileWidthHalf = isometricMap->tileTextures[0].width / 2;
float tileHeightQuarter = isometricMap->tileTextures[0].height / 4; float tileHeightQuarter = isometricMap->tileTextures[0].height / 4;
int mouseAdjustmentX = -tileWidthHalf; x += camera->target.x;
int mouseAdjustmentY = -tileHeightQuarter + (tileHeightQuarter * isometricMap->layer); y += camera->target.y;
x += camera->target.x + mouseAdjustmentX;
y += camera->target.y + mouseAdjustmentY;
float xPos = (float) x; float xPos = (float) x;
float yPos = (float) y; float yPos = (float) y;
@ -82,11 +78,29 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x,
tmp->y = isoY * isometricMap->tileTextures[0].height; tmp->y = isoY * isometricMap->tileTextures[0].height;
} }
void IsometricMapUnproject(IsometricMap *isometricMap, Camera2D *camera, int x, int y, Vector2 *tmp){
float xPos = (float) x;
float yPos = (float) y;
float worldX = (xPos - yPos) / 2;
float worldY = (xPos + yPos) / 4;
worldX += camera->target.x;
worldY += camera->target.y;
tmp->x = worldX;
tmp->y = worldY;
}
Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float x, float y){ Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float x, float y){
x = (int)(x / isometricMap->tileTextures->width); x = (int)(x / isometricMap->tileTextures->width);
y = (int)(y / isometricMap->tileTextures->height); y = (int)(y / isometricMap->tileTextures->height);
Tile *ptr = (Tile *) malloc(sizeof(Tile *)); Tile *ptr = (Tile *) malloc(sizeof(Tile *));
ptr->x = 0; ptr->x = 0;
ptr->y = 0; ptr->y = 0;

@ -17,8 +17,6 @@ typedef struct IsometricMap{
// TODO: // TODO:
Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float x, float y); Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float x, float y);
// World Coordinates -> Screen Coordinates
Vector2 IsometricMapUnproject(IsometricMap *isometricMap, Camera2D *camera, int x, int y);
// Working // Working
IsometricMap * IsometricMapInit(int layer); IsometricMap * IsometricMapInit(int layer);
@ -26,7 +24,8 @@ 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, float x, float y, Vector2 *tmp); void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x, float y, Vector2 *tmp);
// World Coordinates -> Screen Coordinates
void IsometricMapUnproject(IsometricMap *isometricMap, Camera2D *camera, int x, int 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);

@ -9,7 +9,7 @@ KI Gegner ist erstmal zu aufwändig, ein wenig Ackern muss man aber immer!
Fantasy Welt oder Realistisch? Fantasy Welt oder Realistisch?
## Isometrie in RayLib ## Isometrie in RayLib
[Projection Orthogonal -> Isometric](https://gamedevelopment.tutsplus.com/tutorials/creating-isometric-worlds-a-primer-for-game-developers--gamedev-6511) [Projection Orthogonal -> Isometric](https://clintbellanger.net/articles/isometric_math/)
## TODO ## TODO

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
list.o

Binary file not shown.

@ -57,17 +57,10 @@ int main(){
camera.rotation = 0.0f; camera.rotation = 0.0f;
camera.zoom = 1.0f; camera.zoom = 1.0f;
// TODO -> Isometric Map Array for multiple Layers
// -> Make only most upper layer selectable
// take selected Tile, if that tile has one above select a tile in the upper layer
//IsometricMap *map = IsometricMapInit(50, 80, 0);
//IsometricMap *Layer1 = IsometricMapInit(20, 20, 1);
//IsometricMap *Layer2 = IsometricMapInit(15, 15, 2);
//IsometricMap *Layer3 = IsometricMapInit(10, 10, 3);
//IsometricMap *Layer4 = IsometricMapInit(4, 4, 4);
IsometricMap **layers = (IsometricMap **) malloc(10*sizeof(IsometricMap *)); IsometricMap **layers = (IsometricMap **) malloc(10*sizeof(IsometricMap *));
// Test Layers ---
int n = 0; int n = 0;
int i = 0; int i = 0;
int j = 0; int j = 0;
@ -110,6 +103,16 @@ int main(){
} }
} }
// -------
// Test of the IsometricMapUnproject Function
//Vector2 asdf = {500, 600};
//printf("unprojected %f %f\n",asdf.x, asdf.y);
//IsometricMapProject(layers[0], &camera, asdf.x, asdf.y, &asdf);
//printf("projected %f %f\n",asdf.x, asdf.y);
//IsometricMapUnproject(layers[0], &camera, asdf.x, asdf.y, &asdf);
//printf("unprojected %f %f\n",asdf.x, asdf.y);
// Hides the operating systems own cursor // Hides the operating systems own cursor
HideCursor(); HideCursor();
SetTargetFPS(60); SetTargetFPS(60);

BIN
main.o

Binary file not shown.

BIN
spiel

Binary file not shown.

@ -2,6 +2,7 @@
#include "raylib.h" #include "raylib.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "IsometricMap/isometricMap.h"
void SpriteAdd(Sprite *sprites, int *spriteAmount, Texture2D *texture, int x, int y){ void SpriteAdd(Sprite *sprites, int *spriteAmount, Texture2D *texture, int x, int y){
if(*spriteAmount < 100){ if(*spriteAmount < 100){

Binary file not shown.

BIN
tile.o

Binary file not shown.
Loading…
Cancel
Save