2015-01-04 2 views
-1

Я использую некоторые вещи, которые я собрал из разных методов по всему миру, чтобы сделать эту работу еще моими пулями, летящими в казалось бы случайных направлениях. Я пробовал бросать отрицательные знаки перед вещами и переключать триггер, но безрезультатно. Я попытался использовать вращение руки игрока, потому что это точно указывает на мышь пользователя, но это не дало мне больше точности.2D Lua - Скорость пули неверна и предсказуема

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

local x, y = objects.PlayerArm:GetPos() 
local bullet = createBullet(x + objects.Player:GetWide(), y) 

local mX, mY = gui.MouseX(), gui.MouseY() 
local shootAngle = math.atan2((mY - y), (mX - x)) 
shootAngle = math.deg(math.Clamp(shootAngle, -90, 90)) 
--shootAngle = objects.PlayerArm.Rotation 

bullet.VelocityX = math.cos(shootAngle) * 5 
bullet.VelocityY = math.sin(shootAngle) * 5 
--bullet.Rotation = shootAngle 
print("Angle", shootAngle, "Velocity X and Y", bullet.VelocityX, bullet.VelocityY) 

Вот некоторые из того, что было напечатано на консоли каждый раз, когда я выстрелил в пулю.

Угол +47,920721521 Скорость Х и Y -3,4948799788437 -3,5757256513158

Угол +24,928474135461 Скорость Х и Y 4,8960495864893 -1,0142477244922

Угол 16,837472625676 Скорость Х и Y -2,1355174970471 -4,5210137159497

Угол 10,684912400003 Скорость X и Y -1.5284445365972 -4.7606572338855

Угол -1.029154804306 Скорость X и Y 2.5777 162320797 -4,2843178018061

Угол -11,63363399894 Velocity X и Y 2,978190104641 4,0162648942293

Угол -22,671343621981 Velocity X и Y -3,8872502993046 3,1447233758403

http://i.gyazo.com/e8ed605098a91bd450b10fda7d484975.png

+1

Нужно ли использовать радианы вместо градусов? – iamnotmaynard

+0

О, мужчина, большое вам спасибо. Я оставил shootAngle в качестве радианов и изменил math.sin (shootAngle) на math.sin (-shootAngle) и зафиксировал его. – Exho

ответ

1

Как @iamnotmaynard подозревал, Lua использует математику Кассиопеяне библиотеки, и поэтому все триггеры используют радианы вместо градусов. Лучше всего хранить все углы в радианах и просто печатать их в градусах для более удобного формата. В противном случае у вас есть много конверсий между радианами и из них каждый раз, когда используется угол. Ниже приведен код, обновляемый только для использования радианов и печати в градусах.

local mX, mY = gui.MouseX(), gui.MouseY() 
local shootAngle = math.atan2((mY - y), (mX - x)) 
shootAngle = math.max(-math.pi/2, math.min(shootAngle, math.pi/2)) 
bullet.VelocityX = math.cos(shootAngle) * 5 
bullet.VelocityY = math.sin(shootAngle) * 5 
print("Angle (radians)", shootAngle, "(degrees)", math.deg(shootAngle), 
     "Velocity X and Y", bullet.VelocityX, bullet.VelocityY) 

Однако для вычисления скорости в направлениях х и у углы необязательны. Функция ниже вычисляет VelocityX и VelocityY, используя только смещения, и гарантирует, что скорость также находится только в нижнем правом и верхнем правом квадрантах.

function shoot(x, y, dirx, diry, vel) 
    local dx = math.max(dirx - x, 0) 
    local dy = diry - y 
    local sdist = dx * dx + dy * dy 
    if sdist > 0 then 
    local m = vel/math.sqrt(sdist) 
    return dx * m, dy * m 
    end 
end 

bullet.VelocityX, bullet.VeclocityY = shoot(x, y, gui.MouseX(), gui.MouseY(), 5) 
Смежные вопросы