Просмотр полной версии : Притягивание объекта к координатам
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, то что нужно огромное спасибо
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.