2011-12-16 2 views
3

Я ищу способ заставить свою сущность (пулю) двигаться в направлении x и y, где и находился игрок, когда пуля была запущена. Так что в моем классе сущностей я есть -Как заставить сущность двигаться в направлении x и y?

float xSpeed = 1.0F; 
    float ySpeed = 0.0F; 

если бы я хотел, чтобы переместить объект в diaganal линии я бы xSpeed ​​и ySpeed ​​= 1.0f Как бы заставить его двигаться в директорию другого х и у ?

Спасибо за помощь EDIT - Решено, спасибо за помощь кому-либо еще, кто считает этот вопрос, нуждающихся в помощи, вот мой код-

float xSpeed = 0; 
    float ySpeed = 0; 

то у меня есть некоторые математики, чтобы сделать это так что они движутся с одинаковой скоростью

ySpeed = ySpeed * (float) (2.5/Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed)); 
    xSpeed = xSpeed * (float) (2.5/Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed)); 

и этот код, чтобы установить xSpeed ​​и ySpeed, основанный на топор и у вы хотите, чтобы двигаться в направлении

xSpeed = (Game.PlayerX - x)/3; 
    ySpeed = (Game.Playery - y)/3; 

, а затем, наконец, добавить xSpeed ​​и ySpeed ​​к й и у вашего лица

this.x += xSpeed; 
    this.y += ySpeed; 

ответ

7

Обычный способ установить относительные х и у скорости, чтобы покрыть необходимые х и у расстояния в положенное время в пути:

float xSpeed = (targetLocation.x - currentLocation.x)/travelTime; 
float ySpeed = (targetLocation.y - currentLocation.y)/travelTime; 

Если вы хотите путешествовать с заданной скоростью, а не в заранее заданное время поездки, сделать выше вычисление с travelTime набором некоторой произвольной величины (1.0f будет работать нормально, так что вы могли бы просто устранить дивизион). Затем вычислить этот фактор:.

float factor = desiredSpeed/Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed); 

(Обратите внимание, что вы будете деление на ноль, если xSpeed и ySpeed оба 0, но это просто означает, что текущие и целевые места идентичны Если это возможно состояние, вас должен включать в себя соответствующую проверку) Наконец, подрегулировать xSpeed и ySpeed множителем:.

xSpeed *= factor; 
ySpeed *= factor; 

следует отметить, что, установив travelTime в 1, это просто подлый способ умножения предопределенное Шпее d синусом и косинусом угла, который направление движения делает с осью х, без упоминания тригонометрии вообще. :)

+0

работает отлично, спасибо за помощь: D, может ли желаемая скорость быть с плавающей точкой, а 2, чтобы замедлить и 3 - быстро: D. Первое сообщение на этом сайте, но будет defo использовать снова, такое приятное сообщество –

+0

@JackPatrick - я предполагал, что все было плавающим. Добро пожаловать в сообщество, кстати. –

+0

Хорошо, спасибо за помощь, я добавил решение к первому сообщению, чтобы помочь другим. –

0

Вам необходимо определить скорость объекта и направление. Затем вы можете использовать простой триггер для определения смещения x/y за шаг.

Если вы используете свой текущий алгоритм, ваш объект будет изменять скорость в зависимости от его направления, что, вероятно, не то, что вы хотите сделать.

Линейная Направление: Скорость х = 1 скорость у = 0

Общая скорость = 1

Diagnol Направление: Скорость х = 1 скорость у = 1

Общая скорость = 2

Уточнить проблему? Ваша скорость должна быть постоянной независимо от направления.

Используйте так называемый Vector, чтобы описать направление и скорость вашего объекта.

класс Vector { int x; int y; угол плавания; плавающая величина; }

Х, y, угол и величина описывают треугольник. Движение, которое вы хотите, будет точкой на линии гипотенузы треугольника, измененной временным шагом вашего двигателя.

редактировать -

Представьте себе круг, который имеет радиус 1 единицу, с его происхождением 0, 0.

Нарисуйте линию от начала координат до левой стороны. Вы получаете линию длиной 1 единицу, которая пересекает круг в (1,0)

Теперь нарисуйте линию от начала координат под углом 45 градусов к краю круга.

Вы также получите линию длиной 1 единицу, однако координата X/Y, где линия пересекает круг, будет (0,7,0,7) НЕ (1,1).

Я не язя передо мной, поэтому, пожалуйста, кто-то изменить, если моя математика здесь не так, но я beilive вы хотите что-то вроде этого:

newPositionX = CurrentX + (соз (угол) * скорость * Timestep)

newPositionY = CurrentY + (sin (угол) * скорость * Timestep)

+0

Фактически, во втором случае общая скорость - sqrt (2), а не 2. –

+0

@TedHopp Это должен быть sqrt (2), вот в чем проблема. Как Джек описывает свой код, скорость равна 2. Т.е. объект перемещается влево/вправо, а затем вверх/вниз в тот же временной интервал, что он будет двигаться только влево/вправо в другом направлении. – asawyer

+0

@TedHopp Или мне может понадобиться больше кофе. Вы, конечно, правы, треугольник с двумя сторонами 1 длины имеет противоположную сторону sqrt (2) – asawyer

Смежные вопросы