Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.06.2013, 18:03
AlexTrin вне форума Посмотреть профиль Отправить личное сообщение для AlexTrin Найти все сообщения от AlexTrin
  № 1  
Ответить с цитированием
AlexTrin
[+1 05.06.13]

Регистрация: Mar 2013
Сообщений: 42
По умолчанию Притягивание объекта к координатам

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

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

Старый 13.06.2013, 21:11
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 2  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 567
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Ну это элементарно, может быть не совсем красивое решение, но уж точно работающее.

Итак для начала создадим массив с нашими точками, но будем пользоваться не Point, а Vector3D, почему же Vector3D, а потому что в параметр Z мы будем записывать расстояние от точки до объекта. Затем напишем функцию для рассчета ближайшей точки, и функцию движения к этой точке. Но для начала допустим что в массиве pointsArr хранятся наши точки, а player - объект который должен двигаться к точке.

Код AS3:
		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.
Старый 14.06.2013, 12:21
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 3  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
А автор не имеет в виду нечто вроде сетки как в фотошопе, по которой можно выравнивать объекты ?
__________________
Oomph

Старый 14.06.2013, 12:43
AlexTrin вне форума Посмотреть профиль Отправить личное сообщение для AlexTrin Найти все сообщения от AlexTrin
  № 4  
Ответить с цитированием
AlexTrin
[+1 05.06.13]

Регистрация: Mar 2013
Сообщений: 42
AlexLucas, не совсем то, без самой сетки(линейки), но притягивание объекта примерно такое же как в фотошопе

Старый 14.06.2013, 13:30
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 5  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
А как преподносятся координаты к которым надо цеплять объект ? Точки (x,y) или как в случае сетки - прямые (y = n, гориз., x = n, верт.) ?
__________________
Oomph

Старый 14.06.2013, 15:05
AlexTrin вне форума Посмотреть профиль Отправить личное сообщение для AlexTrin Найти все сообщения от AlexTrin
  № 6  
Ответить с цитированием
AlexTrin
[+1 05.06.13]

Регистрация: Mar 2013
Сообщений: 42
AlexLucas, есть заданные координаты, точки х и у

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

Старый 14.06.2013, 17:43
AlexLucas вне форума Посмотреть профиль Отправить личное сообщение для AlexLucas Найти все сообщения от AlexLucas
  № 7  
Ответить с цитированием
AlexLucas
[+1 05.11.12]
 
Аватар для AlexLucas

Регистрация: Feb 2011
Сообщений: 431
Код AS3:
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   (1.6 Кб)
Вложения
Тип файла: swf NewProject.swf (1.6 Кб, 135 просмотров)
__________________
Oomph

Старый 14.06.2013, 19:53
AlexTrin вне форума Посмотреть профиль Отправить личное сообщение для AlexTrin Найти все сообщения от AlexTrin
  № 8  
Ответить с цитированием
AlexTrin
[+1 05.06.13]

Регистрация: Mar 2013
Сообщений: 42
AlexLucas, то что нужно огромное спасибо

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:26.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 06:26.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.