![]() |
|
||||||||||
|
|||||
|
[+1 05.06.13]
Регистрация: Mar 2013
Сообщений: 42
|
Народ, есть объекты которые двигаются по экрану, как сделать так чтобы они притягивались к определенным координатам. Например: двигаешь объект и к какой он ближе из заданных координат, к такой притягивается.
Как такое осуществить, подтолкните, куда копать? За ранее благодарен. |
|
|||||
|
Ну это элементарно, может быть не совсем красивое решение, но уж точно работающее.
Итак для начала создадим массив с нашими точками, но будем пользоваться не Point, а Vector3D, почему же Vector3D, а потому что в параметр Z мы будем записывать расстояние от точки до объекта. Затем напишем функцию для рассчета ближайшей точки, и функцию движения к этой точке. Но для начала допустим что в массиве pointsArr хранятся наши точки, а player - объект который должен двигаться к точке. var pointsArr:Array = new Array(); var player:Sprite = new Sprite(); public function movePlayerToPoint():void { //Вычисляем расстояние. var i:int = pointsArr.length; while (i--) { pointsArr[i].z = Math.sqrt((player.x - pointsArr[i].x)*(player.x - pointsArr[i].x)+(player.y - pointsArr[i].y)*(player.y - pointsArr[i].y)) } //Сортировка массива. pointsArr.sortOn("z", Array.NUMERIC); //Наименьшая точка и движение к ней. var point:Vector3D = pointsArr[0]; var playerSpeed:Number = 10; var playerAngle:Number = Math.atan2(point.y - player.y, point.x - player.x); player.x += playerSpeed * Math.cos(playerAngle); player.y += playerSpeed * Math.sin(playerAngle); } Последний раз редактировалось Bletraut; 13.06.2013 в 21:26. |
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
А автор не имеет в виду нечто вроде сетки как в фотошопе, по которой можно выравнивать объекты ?
__________________
Oomph |
|
|||||
|
[+1 05.06.13]
Регистрация: Mar 2013
Сообщений: 42
|
AlexLucas, не совсем то, без самой сетки(линейки), но притягивание объекта примерно такое же как в фотошопе
|
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
А как преподносятся координаты к которым надо цеплять объект ? Точки (x,y) или как в случае сетки - прямые (y = n, гориз., x = n, верт.) ?
__________________
Oomph |
|
|||||
|
[+1 05.06.13]
Регистрация: Mar 2013
Сообщений: 42
|
AlexLucas, есть заданные координаты, точки х и у
Добавлено через 1 минуту Но нужно только по Y, так как объекты двигаются вверх и вниз. |
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
package { import fl.controls.Button; import fl.controls.TextInput; import flash.display.Sprite; import flash.events.Event; import flash.events.FocusEvent; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.text.TextField; import flash.text.TextFieldAutoSize; public class Main extends Sprite { private var dragObject:Sprite = new Sprite(); private var initOffsetX:Number; private var initOffsetY:Number; //изначальная разница между коорд. объекта и мыши private var snapCoordArray:Array = new Array(); //массив координат к которым цепляем объект private const snapDistance:Number = 10; //расстояние на которое должен приблизиться объект к прямой чтобы его можно было прицепить public function Main() { this.graphics.beginFill(0x000000, 0.1); this.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); //рисуем объект который будем таскать dragObject.graphics.beginFill(0xff0000); dragObject.graphics.drawRect(0, 0, 30, 30); dragObject.addEventListener(MouseEvent.MOUSE_DOWN, prepareToDrag); addChild(dragObject); dragObject.x = 50; dragObject.y = 50; this.graphics.lineStyle(1, 0x000000); //задаём координаты к которым будем цеплять snapCoordArray.push( { y:150 }, { y:200 } ); //рисуем направляющие for (var i:int = 0; i < snapCoordArray.length; i++) { this.graphics.moveTo(0, snapCoordArray[i].y); this.graphics.lineTo(stage.width, snapCoordArray[i].y); } } private function prepareToDrag(e:MouseEvent):void { initOffsetX = e.stageX - dragObject.x; initOffsetY = e.stageY - dragObject.y; stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); } private function endDrag(e:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, drag); stage.removeEventListener(MouseEvent.MOUSE_UP, endDrag); } private function drag(e:MouseEvent):void { var rule:Object; dragObject.y = e.stageY - initOffsetY; dragObject.x = e.stageX - initOffsetX; for (var i:int = 0; i < snapCoordArray.length; i++) { rule = snapCoordArray[i]; if (/*проверяем верх*/dragObject.y < rule.y + snapDistance && dragObject.y > rule.y - snapDistance) { dragObject.y = rule.y; break; } if (/*проверяем низ*/ dragObject.y + dragObject.height < rule.y + snapDistance && dragObject.y + dragObject.height > rule.y - snapDistance) { dragObject.y = rule.y - dragObject.height; break; } } } } }
__________________
Oomph |
|
|||||
|
[+1 05.06.13]
Регистрация: Mar 2013
Сообщений: 42
|
AlexLucas, то что нужно огромное спасибо
|
![]() |
![]() |
Часовой пояс GMT +4, время: 06:30. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|