PDA

Просмотр полной версии : Перемещение объекта в пределах круглой области


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

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
Если расстояние от вашего объекта до центра больше нужного радиуса, то просто возвращайте объект обратно. Примерно такой вариант:
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
xSpeed = 0;
ySpeed = 0;

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