Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Перемещение объекта в пределах круглой области (http://www.flasher.ru/forum/showthread.php?t=177148)

Astraport 25.03.2012 16:35

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

Код AS3:

private const СX:Number = 200;
private const СY:Number = 200;
private const RADIUS:int = 50;
private var accelerometer:Accelerometer;       
private var xSpeed:Number = 0;
private var ySpeed:Number = 0;
 
if (Accelerometer.isSupported) {
        accelerometer = new Accelerometer();
        accelerometer.addEventListener(AccelerometerEvent.UPDATE, accUpdateHandler);
        addEventListener(Event.ENTER_FRAME, startDragging);
}
 
private final function accUpdateHandler(event:AccelerometerEvent):void  {
        xSpeed -= event.accelerationX * 10;
        ySpeed += event.accelerationY * 10;
}
 
protected function startDragging(event:Event):void  {
        event.stopPropagation();
        var newX:Number = ball.x + xSpeed;
        var newY:Number = ball.y + ySpeed;
 
        if (DistanceTwoPoints(newX, СX,  newY, СY) > RADIUS){
ball.x = newX; //Вот в этой части никак не соображу как правильно задать координаты шарика
ball.y = newY;
xSpeed = 0;
ySpeed = 0;
        } else {
ball.x += xSpeed*20;
ball.y += ySpeed*20;
        }
}
 
protected function DistanceTwoPoints(x1:Number, x2:Number,  y1:Number, y2:Number): Number {
                                var dx:Number = x1-x2;
                                var dy:Number = y1-y2;
                                return Math.sqrt(dx * dx + dy * dy);
                        }


samana 25.03.2012 16:49

Если расстояние от вашего объекта до центра больше нужного радиуса, то просто возвращайте объект обратно. Примерно такой вариант:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import flash.text.TextField;
 
        /**
        * ...
        * @author Samana
        */

        public class Main extends Sprite
        {
                static public const RADIUS:int = 150;
                private var centerPoint:Point = new Point(300, 300);
 
                private var circle:Circle = new Circle();
 
 
                public function Main():void
                {
                        circle.x = 300;
                        circle.y = 300;
                        addChild(circle);
 
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
                }
 
                private function stage_mouseMove(e:MouseEvent):void
                {
                        circle.x = mouseX;
                        circle.y = mouseY;
 
                        var dx:Number = circle.x - centerPoint.x;
                        var dy:Number = circle.y - centerPoint.y;
                        var dist:Number = Math.sqrt(dx * dx + dy * dy);
                        var ang:Number = Math.atan2(dy, dx);
 
                        if (dist > RADIUS)
                        {
                                circle.x = centerPoint.x + Math.cos(ang) * RADIUS;
                                circle.y = centerPoint.y + Math.sin(ang) * RADIUS;
                        }
                }
 
 
        }
 
}


Astraport 25.03.2012 17:16

Спасибо работает, но, к сожалению, на мобиле тормозит. Видимо сложноватые просчеты.
Для своего случая, я ещё добавил обнуление скорости когда dist > RADIUS
Код AS3:

xSpeed = 0;
ySpeed = 0;

Добавлено через 1 час 55 минут
Интересно, а можно ли как-то сделать HitTest внутри объекта? Нужно попробовать RealHitTest.


Часовой пояс GMT +4, время: 07:41.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.