Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Квадратные коллизии
#1
Такой вопрос. Реально ли создать квадратную коллизию... кто то же явно придумывал данные формулы
Код:
    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;
    }
Так что если есть желающие разобраться и попробовать создать квадратные коллизии пишите сюда ^^
[Изображение: master.gif]
Ответ
#2
Собственно не понятны две вещи
- с какой целью вам нужны коллизии
- в чем сложность их создания? Вам нужен контроллер коллизий объектов в мире или что-то иное?
Ответ
#3
Всё спасибо уже сделал) а так нужно было для создания своих стен)
[Изображение: master.gif]
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Коллизии Commynity Laguerro 5 1,770 05-12-2014, 03:33 AM
Последний пост: Laguerro

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)