Как я могу перетащить объект с обнаружением столкновения? - PullRequest
0 голосов
/ 11 ноября 2011

Я хочу создать функцию, в которой я могу перетащить мувиклип, который будет сталкиваться с другими мувиклипами на сцене, не перекрывая их. (т.е. объект нельзя перетаскивать поверх или через другие фрагменты ролика).

function dragHolder01(event:Event):void{
    if (mouseDownHolder01 == true) {
        for(var m:int = 0;m<blockHolder.numChildren; m++){
            var hitBlock:DisplayObject = blockHolder.getChildAt(m);
            if(movaHolder01.hitTestObject(hitBlock)){
                movaHolder01.x = movaHolder01x;
                movaHolder01.y = movaHolder01y;
                break;
            }
        }
        movaHolder01.startDrag();
        movaHolder01x = movaHolder01.x;
        movaHolder01y = movaHolder01.y;
    }
}

Думаю, у меня есть концептуальное решение, но мне нужна ваша помощь. Я подумал, что, возможно, я могу ограничить «startDrag», чтобы позволить перетаскивание в соответствии с прогрессией кадров, то есть игрок не сможет перетаскивать объект более чем на один пиксель за каждый кадр (и поэтому не может перетаскивать объект в другой более одного пикселя).

Есть идеи, как это сделать?

Ответы [ 3 ]

2 голосов
/ 11 ноября 2011

Разделите эту проблему на части.Как я вижу, части:

  • объект щелкают левой кнопкой мыши, вызывают startDrag () на нем и имеют готовый приемник enterFrame ().
  • на каждом кадре проверяют столкновения междуперетаскиваемый объект и нужные объекты сцены.
  • предположим, что у вас есть столкновение.Что дальше - как вы справляетесь с этим?Вы можете просто привязать его к предыдущему положению - таким образом, объекты будут застревать при малейшем контакте.Или вы можете сместить столкнувшийся объект на некоторый вектор.Это может быть вектор от центра препятствия к центру столкнувшегося объекта (если они оба маленькие.)
  • при отпускании левой кнопки, вызовите stopDrag ().

Если выПредпочитаю Box2D, есть и другие шаги:

  • превратить ваши видеоклипы в физические формы.Не спрашивайте меня, как - это не будет автоматически.
  • вместо startDrag () примените некоторую силу к перетаскиваемому объекту.Чем больше курсор мыши смещается от объекта, тем больше сила должна быть.Box2D автоматически разрешает столкновения и удаляет объекты.

Обновление: способ сохранения предыдущей позиции

var positions:Dictionary = new Dictionary();
var clip:MovieClip = ...; //load your clip somehow

//store position
position[clip] = new Point(clip.x, clip.y);

//read position
var pos:Point = position[clip];

//update position - reuses Point objects to make things somewhat faster
var pos:Point = position[clip];
pos.x = clip.x;
pos.y = clip.y;
//that's all, reference to Point is already in the Dictionary.

Существует другой метод.MovieClip не является окончательным классом, поэтому он может наследоваться и расширяться с предыдущей позиции.Он также динамичен, это означает, что вы можете просто вставить в него данные:

clip.prevX = clip.x; //prevX will be created if not exist
clip.prevY = clip.y;
//move clip
1 голос
/ 11 ноября 2011

Если вам нужно физическое поведение (то есть, что-то подпрыгивающее при ударе), не реализуйте его самостоятельно и используйте физический движок, такой как Box2D. У них есть несколько примеров объектов MouseDragged (см. MouseDrag класса Test http://box2dflash.svn.sourceforge.net/viewvc/box2dflash/Examples/TestBed/Test.as?revision=158&content-type=text%2Fplain).

Если вы хотите просто не перекрывающиеся объекты (в зависимости от желаемой степени обнаружения столкновений), вы можете использовать MovieClip.hitTest () в качестве обнаружения столкновений и проверить, что объект, перетаскиваемый (в позиции мыши), сделал это. ничего не ударил, а если и сделал, то вернешь его на прежнюю позицию. Обратите внимание, что мышь может двигаться с любой скоростью в течение определенного периода времени, поэтому перетаскиваемый объект может проходить через другой объект, если мышь перемещается слишком быстро (вы можете выполнить непрерывную интерполяцию фиксированного размера, чтобы избежать этого).

Физическое поведение и обнаружение столкновений являются серьезными математическими и компьютерными проблемами, и их не следует воспринимать легкомысленно. Если вам нужно приличное столкновение и физическое поведение, то знакомство с физическим движком (которое использовалось, тестировалось и оптимизировалось очень много раз) занимает гораздо меньше времени, чем написание собственного кода для выполнения этого поведения.

Если вы все еще не хотите использовать Physics Engine, покажите мне свой код, и я смогу сделать его более удобным для вас (возможно, за счет некоторого вычислительного времени).

0 голосов
/ 11 ноября 2011

Возможно, вы захотите взглянуть на физический движок, такой как Box2D: http://box2dflash.sourceforge.net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...