Quickest way to iterate through a rectangles lines?
Just emit the four corners by hand: (x, y), (x+w, y), (x+w, y+h) and (x, y+h). You already know the shape, the origin and the size, and the number of points to calculate is so trivial that hand calculation is easy enough.
are you trying to do something like this ?
#define MAX_POLYVERTS 4
#define MASK_POLYVERTS (MAX_POLYVERTS - 1)
int rect_pts[MAX_POLYVERTS][2] = { {x, y}, {x+w, y}, {x+w, y+h}, {x, y+h}};
int a, b;
for(a = 0; a <= MAX_POLYVERTS; a++)
{
point1_x = rect_pts[a][0];
point1_y = rect_pts[a][1];
// get coords of next point, use bitmask to 'wrap' value back to zero
point2_x = rect_pts[(a+1)&MASK_POLYVERTS][0];
point2_y = rect_pts[(a+1)&MASK_POLYVERTS][1];
// ... do something here with points 1 and 2
}
yeah, but that would require four for-loops, which is inefficient. Performance is critical.
Emitting four trivial vertices requires zero loops. Even radioteeth's solution has only one loop, an that loop can easily be expanded and eliminated alltogether if you don't want it.
I am checking if the rectangle is intersecting with solid tile.
Here is my previous code(it was two for loops instead of one:
int x = entity.x;
int y = entity.y;
int width = entity.width;
int height = entity.height;
//Check the top and bottom line
for(int i = 0; i < width; i++)
if(foo(i, y) || foo(i, y + height))
...
//Check left and right line
for(int i = 0; i < height; i++)
if(foo(x, i) || foo(x, i + width))
...
I am checking if the rectangle is intersecting with solid tile.
Here is my previous code(it was two for loops instead of one:
int x = entity.x; int y = entity.y; int width = entity.width; int height = entity.height; //Check the top and bottom line for(int i = 0; i < width; i++) if(foo(i, y) || foo(i, y + height)) ... //Check left and right line for(int i = 0; i < height; i++) if(foo(x, i) || foo(x, i + width)) ...
AABB vs AABB :
I am checking if the rectangle is intersecting with solid tile.
Are your "tiles" in a rectangular shape? If so, you don't need to test the pixils, you can use math to see if they are intersecting.
for (int t=0;t<NUMBER_OF_TILES;t++){
int px=entity.x-tile[t].x;
int py=entity.y-tile[t].y;
bool xCollide=false,yCollide=false;
if (entity.sizeX<=tile.sizeX){
if (((px>=0)&&(px<tile[t].sizeX))||((px+entity.sizeX>=0)&&(px+entity.sizeX<tile[t].sizeX))) xCollide=true;
}
else{
//if the entity size is greater than the tile size, px needs to be reversed
px=tile[t].x-entity.x;
if (((px>=0)&&(px<entity.sizeX))||((px+tile[t].sizeX>=0)&&(px+tile[t].sizeX<entity.sizeX))) xCollide=true;
}
if (entity.sizeY<=tile[t].sizeY){
if (((py>=0)&&(py<tile[t].sizeY))||((py+entity.sizeY>=0)&&(py+entity.sizeY<tile[t].sizeY))) yCollide=true;
}
else{
//if the entity size is greater than the tile size, py needs to be reversed
py=tile[t].y-entity.y;
if (((py>=0)&&(py<entity.sizeY))||((py+tile[t].sizeY>=0)&&(py+tile[t].sizeY<entity.sizeY))) yCollide=true;
}
if (xCollide && yCollide){//they are colliding
//do something......
}
}
This code checks the bounds of x and y values to determine whether the rectangle of the "entity" is colliding with the rectangle of the "tile". If it collides in both x and y, then at least some part of the entity is colliding with that tile.
If your "entity" is not solid, then you can just check the linear bounds of x and y seperately
Topic Locked
This topic has been locked by a moderator. New replies are not allowed.