2016-09-02 2 views
2

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

physics.setGravity(0, 0) 

fireBullets = function () 
    local bullet = display.newRect(sceneGroup,0,0, 40, 40) 
    bullet:setFillColor(0, 1, 0) 

    local h = player.height 
    local posX = h * math.sin(math.rad(player.rotation)) 
    local posY = h * math.cos(math.rad(player.rotation)) 
    bullet.x = player.x + posX 
    bullet.y = player.y - posY 
    bullet.rotation = player.rotation 

Пока все хорошо, пули появляются с точным вращением плеера.

local angle = math.rad(bullet.rotation) 
    local xDir = math.cos(angle) 
    local yDir = math.sin(angle) 

    physics.addBody(bullet, "dynamic") 
    bullet:setLinearVelocity(xDir * 100, yDir * 100) 
end 

Они не двигаются вперед в соответствии с их направлением, они, похоже, двигаются вправо. Что случилось с моими расчетами?

ответ

3

Вы можете перевернуть sin/cos для x/y и использовать -величивание по y.

Вот полезный рефакторинга:

local function getLinearVelocity(rotation, velocity) 
    local angle = math.rad(rotation) 
    return { 
    xVelocity = math.sin(angle) * velocity, 
    yVelocity = math.cos(angle) * -velocity 
    } 
end 

... и вы можете заменить:

local angle = math.rad(bullet.rotation) 
local xDir = math.cos(angle) 
local yDir = math.sin(angle) 

physics.addBody(bullet, "dynamic") 
bullet:setLinearVelocity(xDir * 100, yDir * 100) 

с:

physics.addBody(bullet, "dynamic") 
local bulletLinearVelocity = getLinearVelocity(bullet.rotation, 100) 
bullet:setLinearVelocity(bulletLinearVelocity.xVelocity, bulletLinearVelocity.yVelocity) 
+1

Спасибо очень много. – Abdou023

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