2017-01-07 4 views
1

Je suis en train de développer 2d space shooter avec LOVE2D à Lua et comme je ne suis pas un expert en maths et en physique, j'ai des questions sur le comportement des ennemis .Changer l'angle (rotation) de l'entité dans le comportement 2d

J'ai finalement réussi à faire ennemi « chercher » pour un joueur et il ressemble à:

code

qui le fait fonctionner (formule est tirée de cette réponse - 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 

Puis-je utiliser ma fonction seek dans 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 

Le seul problème est maintenant que la rotation de l'ennemi ne change pas, même si l'avant du vaisseau spatial doit toujours regarder dans le côté du joueur.

J'ai essayé avec math.atan2(dx, dy) mais il fait l'entité en rotation constante.

Ce qui manque ou ce que je fais mal?

Je ne cherche pas quelqu'un pour coder ceci pour moi (bien que ce serait très gentil) mais une certaine formule ou un conseil sera fortement appréciée.

Si vous êtes intéressé le code source est disponible à - https://github.com/voronianski-on-games/asteroids-on-steroids-love2d

+0

Qu'est-ce qui ne va pas avec 'self.rotation = math.atan2 (dx, dy)'? –

+0

@EgorSkriptunoff J'ai essayé avec math.atan2 (dx, dy) mais ça fait tourner l'entité constamment – Kosmetika

+0

Oui, l'ennemi regardera toujours directement le joueur. N'est-ce pas exactement ce que tu veux? –

Répondre

1

Je ne peux pas vous dire ce qui ne va pas avec votre code, mais nous espérons que cela va vous aider.

-- 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) 

Notez qu'en utilisant body:setAngle(angle) (« corps » est votre corps d'objets) vos objets seront instantanément tourné à l'angle donné. Si vous voulez faire tourner à un certain rythme, vous pouvez utiliser:

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) 

Notez également que le « front » de votre bateau/corps/objet est à droite le long de l'axe x. En d'autres termes, l'angle est calculé à partir de l'axe des abscisses et 0 signifie que l'objet est orienté vers la droite.