【发布时间】:2022-08-02 20:47:46
【问题描述】:
我正在制作ursina / panda3d 游戏,我想让一些敌人跟随玩家。我决定使用来自panda3d.bullet 的BulletCharacterControllerNode 并设置一个setLinearMovement。我不知道为什么,但它没有起作用,所以这是我的代码灵感来自 Roboto 先生:
class AIPathFinder(DirectObject):
def __init__(self):
self.radius = 30
self.loadModels()
self.setAI()
def loadModels(self):
# Seeker
h = 4
w = 0.6
shape = BulletCapsuleShape(w, h - 2 * w, ZUp)
points = [Point3(3, 0, 2), Point3(3, 0, 2), Point3(30, 0, 2)]
self.enemies = []
self.enemiesNP = []
self.enemiesModels = []
for i in range(3):
self.enemy = BulletCharacterControllerNode(shape, 0.4, \'Enemy\')
self.enemyNP = render.attachNewNode(self.enemy)
self.enemyNP.setPos(points[i])
self.enemyNP.setH(45)
self.enemies.append(self.enemy)
# Can\'t get enemy to collide with character
self.enemyNP.setCollideMask(BitMask32.allOn())
world_p.attachCharacter(self.enemy)
self.enemiesNP.append(self.enemyNP)
# ralphStartPos = Vec3(-10, 0, 0)
self.seekerActorNP = Actor(\"models/ralph\",
{\"run\":\"models/ralph-run\"})
self.seekerActorNP.reparentTo(self.enemyNP)
self.seekerActorNP.setScale(0.7)
self.seekerActorNP.setH(180)
self.seekerActorNP.setPos(0, 0, 0)
self.enemiesModels.append(self.seekerActorNP)
# Start the character in the idle position
self.seekerActorNP.loop(\'run\')
# self.seeker.reparentTo(render)
# self.seeker.setScale(0.5)
# self.seeker.setPos(ralphStartPos)
# Target
self.target = loader.loadModel(\"models/arrow\")
self.target.setColor(1,0,0)
self.target.setPos(player.position)
self.target.setScale(1)
self.target.reparentTo(render)
def update(self, task):
self.target.setPos(player.position)
speed = Vec3(LVector3(2,2,2))
omega = 0.0
radius = 30
pursue = [False, False, False]
for i in range(3):
if player.getDistance(self.enemiesModels[i]) < radius:
pursue[i] = True
self.enemiesModels[i].lookAt(player)
self.enemiesModels[i].setP(0)
self.enemiesModels[i].setH(self.enemiesModels[i].getH() + 180)
for i in self.enemiesNP:
i.lookAt(player)
for i in range(3):
if pursue[i] == True:
print(pursue[i])
speed.setY(11.0)
print(speed)
self.enemies[i].setLinearMovement(speed, True)
else:
speed.setY(0)
self.enemies[i].setLinearMovement(speed, True)
return task.cont
def setAI(self):
#Creating AI World
# self.AIworld = AIWorld(render)
#AI World update
taskMgr.add(self.AIUpdate,\"AIUpdate\")
taskMgr.add(self.update,\"Position\")
self.seekerActorNP.loop(\"run\")
#to update the AIWorld
def AIUpdate(self,task):
return Task.cont