Библиотеки AS3 с эквивалентом startDrag (), имеющим непрямоугольные границы (т.е. круглые)? - PullRequest
1 голос
/ 27 июля 2011

Я просто стараюсь не использовать свою собственную функцию перетаскивания. Кто-нибудь знает какие-нибудь библиотеки, которые имеют эквивалент startDrag(), где вы можете использовать, скажем, круговой радиус для границ перетаскивания, а не прямоугольный прямоугольник?

Ответы [ 4 ]

1 голос
/ 27 июля 2011

(для области перетаскивания по кругу) - вам нужно:

a) Mouse_down: сохранить начальную позициюНачните слушать Enter_frame.

b) Enter_Frame: проверьте расстояние от положения мыши до положения pos (используйте пифагоры)

c) перемещайте ваш объект только если расстояние меньше x

d) Mouse_up: прекратить прослушивание энтерфрейма

1 голос
/ 27 июля 2011

Вы можете использовать простую круговую процедуру обнаружения столкновений, она обрабатывает область попадания, используя радиус объектов и расстояние между ними. Возможно, вам придется вручную выполнить этот расчет в своем методе onDrag и остановить перетаскивание при столкновении с круговыми границами, рассчитанными ниже.

        var deltax : Number = targetCentreCoord.x - hitTestCentreCoord.x;
        var deltay : Number = targetCentreCoord.y - hitTestCentreCoord.y;

        //works out if our circles are colliding, distance between the circles inc radius               
        if (((deltax * deltax) + (deltay * deltay)) <= ((((targetRadius) + (hitTargetRadius)) * ((targetRadius) + (hitTargetRadius))))) 
        {
            Log.info("collision occured with " + candidate.name + " target coords " + targetCentreCoord + " candidate coords " + hitTestCentreCoord);
            return true;
        } 
        return false;
0 голосов
/ 17 июня 2015

Это можно сделать без события ENTER_FRAME. Есть слушатель MOUSE_DOWN, проверьте границы там, если в пределах границ, то добавить слушателя MOUSE_MOVE. Кроме того, начните с прослушивателя MOUSE_UP, чтобы удалить прослушиватель MOUSE_MOVE.

0 голосов
/ 27 июля 2011

Нет, вам нужно сделать идеальное столкновение пикселей (или в этом случае, щелкнув мышью), чтобы сделать это.По своей природе все экранные объекты всегда имеют прямоугольные границы.Таким образом, в основном вам нужно будет сделать что-то вроде этого:

mySprite.addEventListener(MouseEvent.MOUSE_DOWN, mousedDown);

function mousedDown(e:MouseEvent):void
{
    //Draw my sprite to a bitmap, then check the bitmap colour at mouseX/mouseY
    uint colour = myBitmap.getPixel32(mouseX, mouseY);
    if(colour != TRANSPARENT){
        //We've actually clicked on the object, drag it
        Sprite(e.currentTarget).startDrag();
    }
}

Обратите внимание, что это просто псевдокод, вам нужно выяснить, как выглядит значение uint, как прозрачный, а также вам придетсяучитывать, где находится начальная точка спрайта при рисовании в растровое изображение.Скажем, у вас есть спрайт и его содержимое внутри, вам нужно будет создать объект Matrix с отрицательным смещением X и Y, которое в 5 раз больше ширины вашего спрайта, чтобы правильно его нарисовать.

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