Показать сообщение отдельно
Старый 11.09.2012, 16:09
HorusWM вне форума Посмотреть профиль Отправить личное сообщение для HorusWM Найти все сообщения от HorusWM
  № 2  
Ответить с цитированием
HorusWM

Регистрация: Sep 2010
Сообщений: 90
То ли, действительно, никто тут не работал с этим методом, то ли не хотите признаваться) Если кого интересует - вот решение, к которому я пришел:
Код AS3:
vDirection  =  new Point(destination.x -x, destination.y -y); // создаем вектор движения к цели, когда объект должен начать двигаться
 
                protected function Move():void
		{
			if (vDirection != null)
			{
				var angle:Number; // угол результирующего вектора
				var vector:Point = new Point(); // временный вектор
 
				if (collided.length > 0) // здесь проверяется длина списка, содержащего все объекты-препятствия на сцене
				{
					var i:int;
					var result:Point; // результирующий вектор
					var L:Number; // длина рез. вектора
 
					result = new Point(destination.x -x, destination.y -y); // создаем рез. вектор, равный вектору направления
 
					L = Math.sqrt(result.x * result.x + result.y * result.y); // вычисляем длину рез. вектора
 
                                        // нормализуем рез. вектор
					result.x /= L;
					result.y /= L;
 
					if (L == 0)
					{
						result.x = 1;
						result.y = 1;
					}
 
					for (i = 0; i < collided.length; i++)
					{
					  var e:Entity = collided[i] as Entity;
 
                                          // пробегаемся по списку и выбираем те объекты, которые попадают в радиус действия сил,
                                          // у меня это константа COLLIDE_RADIUS и равна 2, т.е. просчет начинается почти вплотную
					  if (distanceFrom(e, true) <= COLLIDE_RADIUS)
					  {
						var dist:Number = distanceFrom(e, true);
 
                                                // вычисляем силу отталкивания обратно пропорциональную расстоянию
                                                // эффект будет заметен при бОльших значениях COLLIDE_RADIUS, чем 2
						var magnitude:Number = (speed * COLLIDE_RADIUS -speed * dist) / (speed * COLLIDE_RADIUS);
 
                                               // создаем вектор противодействующей силы
						var force:Point = new Point((x -e.x), (y -e.y));
 
						var len:Number = Math.sqrt(force.x * force.x + force.y * force.y) /magnitude;
 
                                                // нормализация
						force.x /= len;
						force.y /= len;
 
						if (len == 0)
						{
							force.x = 1;
							force.y = 1;
						}
 
                                                // складываем результирующий и противодействующий вектора
						result.x += force.x;
						result.y += force.y;
					  }
					}
 
					vector.x = result.x;
					vector.y = result.y;
				}
				else
				{
					vector.x = vDirection.x;
					vector.y = vDirection.y;
				}
 
                                // угол вектора в радианах
				angle = Math.atan2(vector.y, vector.x);
 
                                // ну и задаем движение
				x += speed * Math.cos(angle);
				y += speed * Math.sin(angle);
			}
		}
Если кто-то знает решение проще или может оптимизировать данное - буду только рад