07-06-2011, 05:24 AM
Такой вопрос. Реально ли создать квадратную коллизию... кто то же явно придумывал данные формулы
Так что если есть желающие разобраться и попробовать создать квадратные коллизии пишите сюда ^^
Код:
public void setRange(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax)
{
_rangeXMin = xMin;
_rangeYMin = yMin;
_rangeZMin = zMin;
_rangeXMax = xMax;
_rangeYMax = yMax;
_rangeZMax = zMax;
_A = _rangeYMax * (_rangeZMax - _rangeZMin) + _rangeYMin * (_rangeZMin - _rangeZMax);
_B = _rangeZMin * (_rangeXMax - _rangeXMin) + _rangeZMax * (_rangeXMin - _rangeXMax);
_C = _rangeXMin * (_rangeYMax - _rangeYMin) + _rangeXMin * (_rangeYMin - _rangeYMax);
_D = -1 * (_rangeXMin * (_rangeYMax * _rangeZMax - _rangeYMin * _rangeZMax) + _rangeXMax * (_rangeYMin * _rangeZMin - _rangeYMin * _rangeZMax) + _rangeXMin * (_rangeYMin * _rangeZMax - _rangeYMax * _rangeZMin));
}
Код:
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, int instanceId)
{
ArrayList<L2DoorInstance> allDoors;
if (instanceId > 0 && InstanceManager.getInstance().getInstance(instanceId) != null)
allDoors = InstanceManager.getInstance().getInstance(instanceId).getDoors();
else
allDoors = _regions.get(MapRegionTable.getInstance().getMapRegion(x, y));
if (allDoors == null)
return false;
for (L2DoorInstance doorInst : allDoors)
{
if (doorInst.getXMax() == 0)
continue;
// line segment goes through box
// first basic checks to stop most calculations short
// phase 1, x
if ((x <= doorInst.getXMax() && tx >= doorInst.getXMin())
|| (tx <= doorInst.getXMax() && x >= doorInst.getXMin()))
{
//phase 2, y
if ((y <= doorInst.getYMax() && ty >= doorInst.getYMin())
|| (ty <= doorInst.getYMax() && y >= doorInst.getYMin()))
{
// phase 3, basically only z remains but now we calculate it with another formula (by rage)
// in some cases the direct line check (only) in the beginning isn't sufficient,
// when char z changes a lot along the path
if (doorInst.getCurrentHp() > 0 && !doorInst.getOpen())
{
int px1 = doorInst.getXMin();
int py1 = doorInst.getYMin();
int pz1 = doorInst.getZMin();
int px2 = doorInst.getXMax();
int py2 = doorInst.getYMax();
int pz2 = doorInst.getZMax();
int l = tx - x;
int m = ty - y;
int n = tz - z;
int dk;
if ((dk = (doorInst.getA() * l + doorInst.getB() * m + doorInst.getC() * n)) == 0)
continue; // Parallel
float p = (float) (doorInst.getA() * x + doorInst.getB() * y + doorInst.getC() * z + doorInst.getD()) / (float) dk;
int fx = (int) (x - l * p);
int fy = (int) (y - m * p);
int fz = (int) (z - n * p);
if ((Math.min(x, tx) <= fx && fx <= Math.max(x, tx)) && (Math.min(y, ty) <= fy && fy <= Math.max(y, ty))
&& (Math.min(z, tz) <= fz && fz <= Math.max(z, tz)))
{
if (((fx >= px1 && fx <= px2) || (fx >= px2 && fx <= px1))
&& ((fy >= py1 && fy <= py2) || (fy >= py2 && fy <= py1))
&& ((fz >= pz1 && fz <= pz2) || (fz >= pz2 && fz <= pz1)))
return true; // Door between
}
}
}
}
}
return false;
}