![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Перемещаю акселерометром (это не важно, тоже самое для 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); } |
|
|||||
|
Если расстояние от вашего объекта до центра больше нужного радиуса, то просто возвращайте объект обратно. Примерно такой вариант:
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; } } } } |
|
|||||
|
Спасибо работает, но, к сожалению, на мобиле тормозит. Видимо сложноватые просчеты.
Для своего случая, я ещё добавил обнуление скорости когда dist > RADIUS Добавлено через 1 час 55 минут Интересно, а можно ли как-то сделать HitTest внутри объекта? Нужно попробовать RealHitTest. |
![]() |
![]() |
Часовой пояс GMT +4, время: 11:40. |
|
|
« Предыдущая тема | Следующая тема » |
|
|