2017-01-07 11 views
1

Я разрабатываю 2-й космический шутер с LOVE2D в Lua, и поскольку я не математик и физик, у меня возникли вопросы с реализацией поведения рулевого управления для врагов ,Изменить угол (поворот) объекта в рулевом управлении (поиск) в игре 2d

я, наконец, удалось сделать врага «ищет» для игрока, и это выглядит следующим образом:

код, который делает его работу (формула берется из этого ответа - https://stackoverflow.com/a/2561054/2117550):

function Enemy:seek() 
    local dx = self.player.x - self.x - self.xvel 
    local dy = self.player.y - self.y - self.yvel 

    -- normalize 
    local len = math.sqrt(dx * dx + dy * dy) 
    dx, dy = dx/len, dy/len 

    return dx, dy 
end 

Затем я использую мой seek функцию в update:

function Enemy:update (dt) 
    -- seeking acceleration 
    local dx, dy = self:seek() 

    -- what is the proper way of calculating enemies rotation? 
    -- self.rotation = math.atan2(dx, dy) + ANGLE_ACCELERATION * dt 

    -- update velocity 
    self.xvel = self.xvel + dx * MAX_SPEED * dt -- * math.cos(self.rotation) it's not needed anymore? 
    self.yvel = self.yvel + dy * MAX_SPEED * dt -- * math.sin(self.rotation) it's not needed anymore? 

    -- moving entity in camera 
    _.checkWorldBounds(self) 

    local futureX = self.x + self.xvel * dt 
    local futureY = self.y + self.yvel * dt 
    local nextX, nextY, collisions, len = self.world:move(self, futureX, futureY, self.collisionFilter) 

    self.x = nextX 
    self.y = nextY 
    self.xvel = self.xvel * 0.99 
    self.yvel = self.yvel * 0.99 
end 

Итак, единственная проблема в том, что вращение врага не меняется, хотя перед космическим кораблем всегда следует смотреть в сторону игрока.

Я пробовал с math.atan2(dx, dy), но он постоянно меняет сущность.

Чего не хватает или что я делаю не так?

Я не ищу кого-то, чтобы закодировать это для меня (хотя это было бы очень приятно), но некоторые формулы или советы будут высоко оценены.

Если вы заинтересованы исходный код доступен по адресу - https://github.com/voronianski-on-games/asteroids-on-steroids-love2d

+0

Что не так с 'self.rotation = math.atan2 (dx, dy)'? –

+0

@EgorSkriptunoff Я пробовал с math.atan2 (dx, dy), но он постоянно менял объект – Kosmetika

+0

Да, Враг всегда будет смотреть прямо на Игрока. Разве это не то, что вы хотите? –

ответ

1

Я не могу вам сказать, что не так с вашим кодом, но, надеюсь, это поможет вам.

-- these are the coordinates of the point to which your object should be facing 
local playerx, playery = 100, 100 
-- these are the current coordinates of the object that needs to have its facing changed 
local shipx, shipy = 200, 200 

-- the angle to which your object should be rotated is calculated 
angle = math.atan2(playery - shipy, playerx - shipx) 

Обратите внимание, что при использовании body:setAngle(angle) («тело» Ваше тело объекты) ваши объекты будут мгновенно поворачивается заданный угол. Если вы хотите, чтобы повернуть в определенном темпе, вы можете использовать:

local currentAngle = body:getAngle() 
local adjustedAngle 

if currentAngle > angle then 
    adjustedAngle = currentAngle - rotationSpeed * dt 
elseif currentAngle < angle then 
    adjustedAngle = currentAngle + rotationSpeed * dt 
else 
    adjustedAngle = currentAngle 
end 
body:setAngle(adjustedAngle) 

отметить также, что «фронт» вашего корабля/тела/объекта вправо вдоль оси х. Другими словами, угол вычисляется по оси x, а 0 означает, что объект обращен вправо.