|
@@ -255,7 +255,9 @@ Entity::Entity(
|
|
|
jumpSpeed(0.f),
|
|
jumpSpeed(0.f),
|
|
|
id(entityId),
|
|
id(entityId),
|
|
|
placeBlockCooldown(0.0),
|
|
placeBlockCooldown(0.0),
|
|
|
- movementFlags(0)
|
|
|
|
|
|
|
+ movementFlags(0),
|
|
|
|
|
+ collisionMap(0),
|
|
|
|
|
+ collisionMapLength(0)
|
|
|
{}
|
|
{}
|
|
|
|
|
|
|
|
void Entity::onDeath(Entity* zActor, Item* zUsedItem, ItemSkill* zUsedSkill)
|
|
void Entity::onDeath(Entity* zActor, Item* zUsedItem, ItemSkill* zUsedSkill)
|
|
@@ -588,7 +590,7 @@ ItemSkill* Entity::zSkill(int itemType)
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
|
|
|
|
+void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl)
|
|
|
{
|
|
{
|
|
|
Framework::Vec3<float> minXY = -boundingBox;
|
|
Framework::Vec3<float> minXY = -boundingBox;
|
|
|
Framework::Vec3<float> maxXY = boundingBox;
|
|
Framework::Vec3<float> maxXY = boundingBox;
|
|
@@ -621,20 +623,25 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
if (yl < (int)maxXY.y) yl = (int)maxXY.y;
|
|
if (yl < (int)maxXY.y) yl = (int)maxXY.y;
|
|
|
xl = xl - x + 1;
|
|
xl = xl - x + 1;
|
|
|
yl = yl - y + 1;
|
|
yl = yl - y + 1;
|
|
|
- *map = new bool[xl * yl];
|
|
|
|
|
- memset(*map, 0, xl * yl * sizeof(bool));
|
|
|
|
|
|
|
+ if (collisionMapLength < xl * yl)
|
|
|
|
|
+ {
|
|
|
|
|
+ delete[] collisionMap;
|
|
|
|
|
+ collisionMap = new bool[xl, yl];
|
|
|
|
|
+ collisionMapLength = xl * yl;
|
|
|
|
|
+ }
|
|
|
|
|
+ memset(collisionMap, 0, xl * yl * sizeof(bool));
|
|
|
int xi = (int)minXY.x - x;
|
|
int xi = (int)minXY.x - x;
|
|
|
int yi = (int)minXY.y - y;
|
|
int yi = (int)minXY.y - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
xi = (int)maxXY.x - x;
|
|
xi = (int)maxXY.x - x;
|
|
|
yi = (int)maxXY.y - y;
|
|
yi = (int)maxXY.y - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
xi = (int)minXmaxY.x - x;
|
|
xi = (int)minXmaxY.x - x;
|
|
|
yi = (int)minXmaxY.y - y;
|
|
yi = (int)minXmaxY.y - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
xi = (int)maxXminY.x - x;
|
|
xi = (int)maxXminY.x - x;
|
|
|
yi = (int)maxXminY.y - y;
|
|
yi = (int)maxXminY.y - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
auto dir = minXmaxY - minXY;
|
|
auto dir = minXmaxY - minXY;
|
|
|
float m = 0;
|
|
float m = 0;
|
|
|
if (abs(dir.x) >= abs(dir.y))
|
|
if (abs(dir.x) >= abs(dir.y))
|
|
@@ -648,7 +655,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
{
|
|
{
|
|
|
int xi = xx - x;
|
|
int xi = xx - x;
|
|
|
int yi = (int)yy - y;
|
|
int yi = (int)yy - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
yy += m;
|
|
yy += m;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -663,7 +670,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
{
|
|
{
|
|
|
int xi = (int)xx - x;
|
|
int xi = (int)xx - x;
|
|
|
int yi = yy - y;
|
|
int yi = yy - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
xx += m;
|
|
xx += m;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -680,7 +687,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
{
|
|
{
|
|
|
int xi = xx - x;
|
|
int xi = xx - x;
|
|
|
int yi = (int)yy - y;
|
|
int yi = (int)yy - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
yy += m;
|
|
yy += m;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -695,7 +702,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
{
|
|
{
|
|
|
int xi = (int)xx - x;
|
|
int xi = (int)xx - x;
|
|
|
int yi = yy - y;
|
|
int yi = yy - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
xx += m;
|
|
xx += m;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -712,7 +719,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
{
|
|
{
|
|
|
int xi = xx - x;
|
|
int xi = xx - x;
|
|
|
int yi = (int)yy - y;
|
|
int yi = (int)yy - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
yy += m;
|
|
yy += m;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -727,7 +734,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
{
|
|
{
|
|
|
int xi = (int)xx - x;
|
|
int xi = (int)xx - x;
|
|
|
int yi = yy - y;
|
|
int yi = yy - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
xx += m;
|
|
xx += m;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -744,7 +751,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
{
|
|
{
|
|
|
int xi = xx - x;
|
|
int xi = xx - x;
|
|
|
int yi = (int)yy - y;
|
|
int yi = (int)yy - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
yy += m;
|
|
yy += m;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -759,7 +766,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
{
|
|
{
|
|
|
int xi = (int)xx - x;
|
|
int xi = (int)xx - x;
|
|
|
int yi = yy - y;
|
|
int yi = yy - y;
|
|
|
- (*map)[xi + yi * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xi + yi * xl] = 1;
|
|
|
xx += m;
|
|
xx += m;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -769,7 +776,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
int max = -1;
|
|
int max = -1;
|
|
|
for (int xx = 0; xx < xl; xx++)
|
|
for (int xx = 0; xx < xl; xx++)
|
|
|
{
|
|
{
|
|
|
- if ((*map)[xx + yy * xl])
|
|
|
|
|
|
|
+ if (collisionMap[xx + yy * xl])
|
|
|
{
|
|
{
|
|
|
if (xx < min) min = xx;
|
|
if (xx < min) min = xx;
|
|
|
if (xx > max) max = xx;
|
|
if (xx > max) max = xx;
|
|
@@ -777,7 +784,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
}
|
|
}
|
|
|
for (int xx = min; xx <= max; xx++)
|
|
for (int xx = min; xx <= max; xx++)
|
|
|
{
|
|
{
|
|
|
- (*map)[xx + yy * xl] = 1;
|
|
|
|
|
|
|
+ collisionMap[xx + yy * xl] = 1;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -785,21 +792,19 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
|
|
|
bool Entity::isCollidingWithBlock(const Dimension* zDimension)
|
|
bool Entity::isCollidingWithBlock(const Dimension* zDimension)
|
|
|
{
|
|
{
|
|
|
int x, y, xl, yl;
|
|
int x, y, xl, yl;
|
|
|
- bool* map;
|
|
|
|
|
- calcBlockCollision(x, y, xl, yl, &map);
|
|
|
|
|
- bool result = isCollidingWithBlock(zDimension, x, y, xl, yl, map);
|
|
|
|
|
- delete[] map;
|
|
|
|
|
|
|
+ calcBlockCollision(x, y, xl, yl);
|
|
|
|
|
+ bool result = isCollidingWithBlock(zDimension, x, y, xl, yl);
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool Entity::isCollidingWithBlock(
|
|
bool Entity::isCollidingWithBlock(
|
|
|
- const Dimension* zDimension, int x, int y, int xl, int yl, bool* map)
|
|
|
|
|
|
|
+ const Dimension* zDimension, int x, int y, int xl, int yl)
|
|
|
{
|
|
{
|
|
|
for (int yy = 0; yy < yl; yy++)
|
|
for (int yy = 0; yy < yl; yy++)
|
|
|
{
|
|
{
|
|
|
for (int xx = 0; xx < xl; xx++)
|
|
for (int xx = 0; xx < xl; xx++)
|
|
|
{
|
|
{
|
|
|
- if (map[xx + yy * xl])
|
|
|
|
|
|
|
+ if (collisionMap[xx + yy * xl])
|
|
|
{
|
|
{
|
|
|
for (int zz = (int)(location.z - boundingBox.z);
|
|
for (int zz = (int)(location.z - boundingBox.z);
|
|
|
zz <= (int)(location.z + boundingBox.z);
|
|
zz <= (int)(location.z + boundingBox.z);
|