@ -5,6 +5,7 @@
# include "raymath.h"
# include "raylib.h"
// returns pointer to IsometricMap Instance
IsometricMap * IsometricMapInit ( int layer ) {
IsometricMap * map = ( IsometricMap * ) malloc ( sizeof ( IsometricMap ) ) ;
@ -15,31 +16,32 @@ IsometricMap * IsometricMapInit(int layer){
//map->tileTextures[0] = LoadTexture("assets/desert.png");
//map->tileTextures[1] = LoadTexture("assets/bigtower.png");
map - > originX = 0 ;
map - > originY = - layer * map - > tileTextures [ 0 ] . width / 4 ;
map - > width = 100 * map - > tileTextures [ 0 ] . width ;
map - > height = 100 * map - > tileTextures [ 0 ] . height ;
map - > widthBounds = 100 ;
map - > heightBounds = 100 ;
map - > layer = layer ;
map - > width = 100 ;
map - > height = 100 ;
map - > textureWidth = map - > tileTextures [ 0 ] . width ;
map - > textureHeight = map - > tileTextures [ 0 ] . height ;
map - > worldPixelWidth = map - > width * map - > textureWidth ;
map - > worldPixelWidth = map - > height * map - > textureHeight ;
map - > layer = layer ;
Tile * * * tiles = ( Tile * * * ) malloc ( map - > widthBounds * sizeof ( Tile * ) ) ;
// mallocating the twodimensional Tiles Array
Tile * * * tiles = ( Tile * * * ) malloc ( map - > width * sizeof ( Tile * ) ) ;
int n = 0 ;
for ( n = 0 ; n < map - > widthBounds ; n + + ) {
tiles [ n ] = ( Tile * * ) malloc ( map - > height Bounds * sizeof ( Tile * ) ) ;
for ( n = 0 ; n < map - > width ; n + + ) {
tiles [ n ] = ( Tile * * ) malloc ( map - > height * sizeof ( Tile * ) ) ;
}
int i = 0 ;
int j = 0 ;
for ( i = 0 ; i < map - > width Bounds ; i + + ) {
for ( j = 0 ; j < map - > height Bounds ; j + + ) {
for ( i = 0 ; i < map - > width ; i + + ) {
for ( j = 0 ; j < map - > height ; j + + ) {
Tile * tmp = ( Tile * ) malloc ( sizeof ( Tile ) ) ;
// initially all the Tiles are "empty"
tmp - > textureId = - 1 ;
tmp - > x = i ;
tmp - > y = j ;
tmp - > z = layer ;
tiles [ i ] [ j ] = tmp ;
}
}
@ -49,6 +51,8 @@ IsometricMap * IsometricMapInit(int layer){
return map ;
}
// 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 ) {
Vector2 * offset = ( Vector2 * ) malloc ( sizeof ( Vector2 ) ) ;
offset - > x = x * textureSize / 2 - y * textureSize / 2 ;
@ -56,15 +60,16 @@ Vector2 * IsometricMapCalcOffsetForTileAt(int x, int y, int textureSize){
return offset ;
}
// returns Tile at x y on layer isometricMap
Tile * IsometricMapGetTileFromArrayPosition ( IsometricMap * map , int x , int y ) {
return map - > tiles [ x ] [ y ] ;
}
// Project: Screen Coordinates -> World Coordinates
// Unproject: World Coordinates -> Screen Coordinates writes result in tmp Vector
void IsometricMapProject ( IsometricMap * isometricMap , Camera2D * camera , float x , float y , Vector2 * tmp ) {
float tileWidthHalf = isometricMap - > t ileTextures[ 0 ] . w idth / 2 ;
float tileHeightQuarter = isometricMap - > t ileTextures[ 0 ] . h eight / 4 ;
float tileWidthHalf = isometricMap - > t extureW idth / 2 ;
float tileHeightQuarter = isometricMap - > t extureH eight / 4 ;
x + = camera - > target . x ;
y + = camera - > target . y ;
@ -72,7 +77,6 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x,
float xPos = ( float ) x ;
float yPos = ( float ) y ;
float isoX = 0.5 * ( xPos / tileWidthHalf + yPos / tileHeightQuarter ) ;
float isoY = 0.5 * ( - xPos / tileWidthHalf + yPos / tileHeightQuarter ) ;
@ -80,52 +84,70 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x,
tmp - > y = isoY * isometricMap - > tileTextures [ 0 ] . height ;
}
// Unproject: World Coordinates -> Screen Coordinates
void IsometricMapUnproject ( IsometricMap * isometricMap , Camera2D * camera , int x , int y , Vector2 * tmp ) {
// Unproject: World Coordinates -> Screen Coordinates writes result in tmp Vector
void IsometricMapUnproject ( IsometricMap * * isometricMap , Camera2D * camera , int x , int y , float z , Vector2 * tmp ) {
float xPos = ( float ) x ;
float yPos = ( float ) y ;
float world X = ( xPos - yPos ) / 2 ;
float world Y = ( xPos + yPos ) / 4 ;
float screen X = ( xPos - yPos ) / 2 ;
float screen Y = ( xPos + yPos ) / 4 ;
world X + = camera - > target . x ;
world Y + = camera - > target . y ;
screen X + = camera - > target . x ;
screen Y + = camera - > target . y ;
tmp - > x = worldX ;
tmp - > y = worldY ;
// z is currently implemented as z=1 equals 1 layer, z=2 would be two layers height (could be smoothed)
// hardcoded tile height
screenY - = z * 10 ;
tmp - > x = screenX ;
tmp - > y = screenY ;
}
Tile * IsometricMapGetTileFromWorldCoordinates ( IsometricMap * isometricMap , float x , float y ) {
// returns Tile * -> tile at coordinates x y z=layer
Tile * IsometricMapGetTileFromWorldCoordinates ( IsometricMap * * isometricMap , float x , float y , float z ) {
x = ( int ) ( x / isometricMap - > tileTextures - > width ) ;
y = ( int ) ( y / isometricMap - > tileTextures - > height ) ;
Tile * ptr = ( Tile * ) malloc ( sizeof ( Tile * ) ) ;
ptr - > x = 0 ;
ptr - > y = 0 ;
int layer = ( int ) z ;
if ( x < isometricMap - > widthBounds & & y < isometricMap - > heightBounds & &
x > = 0 & & y > = 0 ) {
if ( isometricMap - > tiles [ ( int ) x ] [ ( int ) y ] - > textureId ! = - 1 ) {
ptr - > x = isometricMap - > tiles [ ( int ) x ] [ ( int ) y ] - > x ;
ptr - > y = isometricMap - > tiles [ ( int ) x ] [ ( int ) y ] - > y;
return ptr ;
x = ( int ) ( x / isometricMap [ layer ] - > textureWidth ) ;
y = ( int ) ( y / isometricMap [ layer ] - > textureHeight ) ;
if ( x < isometricMap [ layer ] - > width & & y < isometricMap [ layer ] - > height & & x > = 0 & & y > = 0 ) {
if ( isometricMap [ layer ] - > tiles [ ( int ) x ] [ ( int ) y ] - > textureId ! = - 1 ) {
return ( isometricMap [ layer ] - > tiles [ ( int ) x ] [ ( int ) y ] ) ;
}
}
ptr = 0 ;
Tile * ptr = 0 ;
return ptr ;
}
// IsometricMapAddTile and IsometricMapChangeTextureIdOfTile pretty much do the same by now...
void IsometricMapAddTile ( IsometricMap * isometricMap , int x , int y , int textureId ) {
isometricMap - > tiles [ x ] [ y ] - > textureId = textureId ;
isometricMap - > tiles [ x ] [ y ] - > x = x ;
isometricMap - > tiles [ x ] [ y ] - > y = y ;
// Gives the most upper Tile above *tile
Tile * IsometricMapGetMostUpperTile ( IsometricMap * * isometricMap , Tile * tile ) {
Tile * ptr = ( Tile * ) malloc ( sizeof ( Tile * ) ) ;
// hardcoded layer amount
int n = 9 ;
for ( n = 9 ; n > = 0 ; n - - ) {
if ( tile - > x < isometricMap [ n ] - > width & & tile - > y < isometricMap [ n ] - > height & &
tile - > x > = 0 & & tile - > y > = 0 ) {
if ( isometricMap [ n ] - > tiles [ tile - > x ] [ tile - > y ] - > textureId ! = - 1 ) {
ptr - > x = isometricMap [ n ] - > tiles [ tile - > x ] [ tile - > y ] - > x ;
ptr - > y = isometricMap [ n ] - > tiles [ tile - > x ] [ tile - > y ] - > y ;
ptr - > z = isometricMap [ n ] - > tiles [ tile - > x ] [ tile - > y ] - > z ;
return ptr ;
}
}
}
ptr = 0 ;
return ptr ;
}
void IsometricMapChangeTextureIdOfTile ( IsometricMap * map , int x , int y , int id ) {
if ( x < map - > widthBounds & & y < map - > heightBounds & &
// changes to Texture ID of tile at x y on maplayer layer
void IsometricMapChangeTextureIdOfTile ( IsometricMap * * map , int x , int y , int layer , int id ) {
if ( x < map [ layer ] - > width & & y < map [ layer ] - > height & &
x > = 0 & & y > = 0 ) {
( map - > tiles [ x ] [ y ] ) - > textureId = id ;
}
( map [ layer ] - > tiles [ x ] [ y ] ) - > textureId = id ;
}
else {
printf ( " WARNING: trying to change Texture of Tile which is out of bounds! \n " ) ;
}
}