PDA

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


AlexTrin
13.06.2013, 18:03
Народ, есть объекты которые двигаются по экрану, как сделать так чтобы они притягивались к определенным координатам. Например: двигаешь объект и к какой он ближе из заданных координат, к такой притягивается.
Как такое осуществить, подтолкните, куда копать?

За ранее благодарен.

Bletraut
13.06.2013, 21:11
Ну это элементарно, может быть не совсем красивое решение, но уж точно работающее.

Итак для начала создадим массив с нашими точками, но будем пользоваться не 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);
}

AlexLucas
14.06.2013, 12:21
А автор не имеет в виду нечто вроде сетки как в фотошопе, по которой можно выравнивать объекты ?

AlexTrin
14.06.2013, 12:43
AlexLucas, не совсем то, без самой сетки(линейки), но притягивание объекта примерно такое же как в фотошопе

AlexLucas
14.06.2013, 13:30
А как преподносятся координаты к которым надо цеплять объект ? Точки (x,y) или как в случае сетки - прямые (y = n, гориз., x = n, верт.) ?

AlexTrin
14.06.2013, 15:05
AlexLucas, есть заданные координаты, точки х и у

Добавлено через 1 минуту
Но нужно только по Y, так как объекты двигаются вверх и вниз.

AlexLucas
14.06.2013, 17:43
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;
}
}


}
}
}

Тащите красный прямоугольник.

NewProject.swf

AlexTrin
14.06.2013, 19:53
AlexLucas, то что нужно огромное спасибо