Thursday, December 26, 2019

opengl - Checking if an object is inside bounds of an isometric chunk


How would I check if an object is inside the bounds of an isometric chunk? for example I have a player and I want to check if its inside the bounds of this isometric chunk. I draw the isometric chunk's tiles using OpenGL Quads.


My first try was checking in a square pattern kind of thing:


e = object;
this = isometric chunk;


if (e.getLocation().getX() < this.getLocation().getX()+World.CHUNK_WIDTH*World.TILE_WIDTH && e.getLocation().getX() > this.getLocation().getX()) {
if (e.getLocation().getY() > this.getLocation().getY() && e.getLocation().getY() < this.getLocation().getY()+World.CHUNK_HEIGHT*World.TILE_HEIGHT) {
return true;
}
}
return false;

What happens here is that it checks in a SQUARE around the chunk so not the real isometric bounds. Image example: (THE RED IS WHERE THE PROGRAM CHECKS THE BOUNDS)


What I have now:


enter image description here



Desired check:


enter image description here


Ultimately I want to do the same for each tile in the chunk.


EXTRA INFO:


Till now what I had in my game is you could only move tile by tile but now I want them to move freely but I still need them to have a tile location so no matter where they are on the tile their tile location will be that certain tile. then when they are inside a different tile's bounding box then their tile location becomes the new tile. Same thing goes with chunks. the player does have an area but the area does not matter in this case. and as long as the X and Y are inside the bounding box then it should return true. they don't have to be completely on the tile.



Answer



e = object;
this = isometric chunk;

//for readability(long version)//



pointX = e.getLocation().getX();
pointY = e.getLocation().getY();


chunkSizeX = World.CHUNK_WIDTH * World.TILE_WIDTH;
chunkSizeY = World.CHUNK_HEIGHT * World.TILE_HEIGHT;


chunkCenterX = this.getLocation().getX() + chunkSizeX / 2.0;
chunkCenterY = this.getLocation().getY() + chunkSizeY / 2.0;



deltaX = pointX - chunkCenterX;
deltaY = pointY - chunkCenterY;

if(deltaX < 0) deltaX *= -1;
if(deltaY < 0) deltaY *= -1;

//these two are floating point number


distanceX = deltaX / chunkSizeX;
distanceY = deltaY / chunkSizeY;

if(distanceX + distanceY < 1.0) return true
else return false;

Basically, imagine each player starts in the center of the chunk. Assuming the player can only move: up, down, left and right and speed is adjusted proportionally when moving on the y-axis to:


TILE_HEIGHT / TILE_WIDTH * X_AXIS_SPEED

She will need at least n steps to get out of the player will need exactly n steps to get out. of the chunk area. I will not prove this unless requested. Therefore, we just check if the player took 100% of the necessary steps to get out of the chunk.



No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...