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

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.10.2011, 21:43
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 11  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
В примере пять точек, остальные генерятся автоматически через константу, для плавности хода и контролируемости траектории и скорости перемещения.
Вот пример попроще
Код AS3:
package  
{
 
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	/**
	 * ...
	 * @author Alex Lexcuk
	 */
	public class DocMoveCurve extends Sprite
	{
 
		public var debSp:Sprite;
		public var lastM:Point = new Point();
		public var curM:Point = new Point();
		public var b:Point = new Point();
		public var speedStep:int = 10;
		public var curveArr:Vector.<Point> = new Vector.<Point>();
		public var persSp:Sprite;
		public var frameCount:int;
		public function DocMoveCurve() 
		{
			addChild(debSp = new Sprite());
			addChild(persSp = new Sprite());
			debSp.graphics.lineStyle(0);
			persSp.graphics.beginFill(0xFF0080);
			persSp.graphics.drawCircle(0, 0, 5);
			curveArr.push(new Point());
			stage.addEventListener(MouseEvent.CLICK, stageClickHandler);
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
 
		public function enterFrameHandler(e:Event):void {
			persSp.x = curveArr[frameCount].x;
			persSp.y = curveArr[frameCount].y;
			frameCount++;
			if (frameCount >= curveArr.length) frameCount = 0;
		}
 
		public function stageClickHandler(e:MouseEvent):void {
			drawMousePath();
		}
 
		public function drawMousePath():void {
			var mx:Number = debSp.mouseX;
			var my:Number = debSp.mouseY;
			var bt:Point = new Point(lastM.x - b.x,lastM.y - b.y);
			var mt:Point = new Point(lastM.x - mx, lastM.y - my);
			bt.normalize( mt.length / 2);
			b = bt.add(lastM);
 
			debSp.graphics.moveTo(lastM.x, lastM.y);
			debSp.graphics.curveTo(b.x, b.y, mx, my);
			debSp.graphics.drawCircle(b.x, b.y, 4);
 
			curM = new Point(mx, my);
			addToArrPosCurve();
			lastM = new Point(mx, my);
		}
 
		public function addToArrPosCurve():void {
			var i:int;
			var p:Point = new Point();
			var lp:Point = lastM.clone();
			var ps:Point;
 
			for (i = 0; i <= 100; i++) {
				p.x = myCurveTo(lastM.x, b.x, curM.x, i / 100);
				p.y = myCurveTo(lastM.y, b.y, curM.y, i / 100);
				ps = p.subtract(lp);
				if (ps.length > speedStep) {
					curveArr.push(lp = p.clone());
					debSp.graphics.drawCircle(p.x, p.y, 4);
				}
			}
 
		}
 
		public function myCurveTo(n1:int, n2:int, n3:int, n4:Number):Number{
			return (1 - n4) * (1 - n4) * n1 + 2 * n4 * (1 - n4) * n2 + n4 * n4 * n3;
		}
	}
 
}
Это надо скомпилить и кликать мышкой на рабочем поле из левого верхнего угла строится траектория и по ней перемещается окружность, если кликнуть на севере то окружность полетит на север, если на западе, то на запад.

Привязать коробку не сложно.
__________________
Гоночка

Старый 21.10.2011, 23:57
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 12  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
А я тормоз :о)) Только непонятно как будет скорость объекта на траекторию влиять, или она одинакова для двух объектов с разной скоростью? По любому с меня +.

Нашел решение, выложу попозже, когда допилю.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 22.10.2011, 11:54
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 13  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Если не использовать функцию киллОртогоналВелосити и сделать большую скорость, то объект не будет следовать траектории, там будут большие заносы, вылеты за траекторию, пролёты чекпоинтов и пр. А с другой стороны с киллОртогоналВелосити вообще заносов нет и немного не интересно.
__________________
Гоночка

Старый 22.10.2011, 19:56
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 14  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Своего почти добился :о)

Код AS3:
private function updateBody():void
		{
			if(!_lastPoint) //Если нет точки, куда лететь
				return;
			_body.SetAwake(true);
 
			//Вектор от центра самолетика до нужной точки
			var pointVec:b2Vec2 = b2Vec2.Make(_lastPoint.x - _body.GetPosition().x, _lastPoint.y - _body.GetPosition().y);
			//Угол между осью X и pointVec
			var pointAngle:Number = getAngle( _body.GetPosition().x, _body.GetPosition().y, _lastPoint.x, _lastPoint.y, true);
			//Угол поворота самолета
			var bodyAngle:Number = _body.GetAngle();
			//Вектор движения cамолетика 
			var vec:b2Vec2 = b2Vec2.Make(_speed * Math.cos(bodyAngle), _speed * Math.sin(bodyAngle));
 
			trace(toDegrees(pointAngle).toPrecision(5), toDegrees(bodyAngle).toPrecision(5), toDegrees(pointAngle-bodyAngle).toPrecision(5));
 
			var sign:int = 1;
			//Если самолетик не "смотрит" на точку, то поворачиваем его на _angleStep (pointVec и vec не сонаправленны)
			if(Math.abs(pointAngle-bodyAngle) > _angleStep)
				bodyAngle += _angleStep * sign;
			else 
			{
				//Доворачиваем самолетик
				bodyAngle = pointAngle;
				//TODO calc distance
				//_lastPoint = null;
			}
			redraw();
			_body.SetAngle(normAngle(bodyAngle));
			_body.SetLinearVelocity(vec);
 
		}
Проблема осталась только в sign, не могу придумать, как правильно менять знак, что бы самолет правильно поворачивал, сейчас если следующая точка, расположена против часовой стрелки от предыдущей, то самолет разворачивается по большой дуге.

Вот, что получилось
Исходник

Добавлено через 16 минут
[IMG]http://dl.************/u/6132064/plane_angle2.png[/IMG]
Вот картинка, как работает, сравните с предыдущей :о))
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

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

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


 


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


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