unprojection of world coordinates working

main
JanEhehalt 3 years ago
parent 60a9f75da1
commit 340b16abf8

@ -3,6 +3,7 @@
"files.associations": {
"isometricrenderer.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
for(n = 9; n >= 0 ; n--){
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);

@ -64,12 +64,8 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x,
float tileWidthHalf = isometricMap->tileTextures[0].width / 2;
float tileHeightQuarter = isometricMap->tileTextures[0].height / 4;
int mouseAdjustmentX = -tileWidthHalf;
int mouseAdjustmentY = -tileHeightQuarter + (tileHeightQuarter * isometricMap->layer);
x += camera->target.x + mouseAdjustmentX;
y += camera->target.y + mouseAdjustmentY;
x += camera->target.x;
y += camera->target.y;
float xPos = (float) x;
float yPos = (float) y;
@ -82,11 +78,29 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x,
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){
x = (int)(x / isometricMap->tileTextures->width);
y = (int)(y / isometricMap->tileTextures->height);
y = (int)(y / isometricMap->tileTextures->height);
Tile *ptr = (Tile *) malloc(sizeof(Tile *));
ptr->x = 0;
ptr->y = 0;

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

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.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 *));
// Test Layers ---
int n = 0;
int i = 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
HideCursor();
SetTargetFPS(60);

BIN
main.o

Binary file not shown.

BIN
spiel

Binary file not shown.

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

Binary file not shown.

BIN
tile.o

Binary file not shown.
Loading…
Cancel
Save