Как сделать движение снаряда в flixel + as3
Так что у меня есть мой персонаж, который, когда я нажимаю кнопку мыши, должен запустить несколько лазеров, чтобы убить этих плохих парней.
В настоящее время я добавляю свой маленький лазер. Тогда я использую это:
this.velocity.x = (MousePos.x - StartPos.x) * bulletSpeed
//same for Y
(Я тоже пробовал это)
this.x += (MousePos.x - StartPos.x) / bulletSpeed
//same for Y
Теперь это было бы здорово, за исключением того факта, что лазер не движется с одинаковой скоростью. Под этим я подразумеваю, что если мышь находится, скажем, на расстоянии 1000 пикселей или на расстоянии 500 пикселей, она прибудет за то же время, что означает, что она движется быстрее, если мышь находится дальше.
Что мне нужно знать, так это как сделать так, чтобы объект двигался с определенной скоростью, независимо от того, как далеко он должен пройти.
Спасибо,
1 ответ
Это чистая математика. Скорость на любой оси не может быть больше, чем BulletSpeed, поэтому все, что вы рассчитываете, должно быть таким:
velocity.x = BulletSpeed * t;
где t - число от -1 до 1 включительно. Более того, это число обычно отличается для х и у.
velocity.x = BulletSpeed * tx;
velocity.y = BulletSpeed * ty;
Теперь перейдем к основной части - как рассчитать значение tx, ty? Сначала получите dx, dy и расстояние от StartPos до MousePos.
var dx:Number = MousePos.x - StartPos.x;
var dy:Number = MousePos.y - StartPos.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
Легко видеть, что в то время как объект проходит расстояние dist, его координаты x и y также идут на расстояния dx и dy. Это происходит в одно и то же время, но dx и dy, как правило, различаются, поэтому координаты должны меняться на разных этапах, чтобы прийти к финишу одновременно.
var step_x:Number = dx / dist;
var step_y:Number = dy / dist;
Эти значения всегда будут между -1 и 1. Теперь все, что вам нужно, это применить BulletSpeed:
velocity.x = BulletSpeed * step_x;
velocity.y = BulletSpeed * step_y;
или теперь без упрощений
velocity.x = BulletSpeed * dx / dist;
velocity.y = BulletSpeed * dy / dist;