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 à:
codequi 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
Qu'est-ce qui ne va pas avec 'self.rotation = math.atan2 (dx, dy)'? –
@EgorSkriptunoff J'ai essayé avec math.atan2 (dx, dy) mais ça fait tourner l'entité constamment – Kosmetika
Oui, l'ennemi regardera toujours directement le joueur. N'est-ce pas exactement ce que tu veux? –