This spawns zombies:
def spawnWave(self):
self.abc = True
for x in range(self.maxZombieInThisWave):
realRowUp = None
lastDigit = None
rowLeft = None
rowUp = None
i = x+1
self.zombie.append("blank")
self.zombie[x] = loader.loadModel("zombie")
self.zombie[x].reparentTo(render)
r = x/3
rowUp = str(r)[0]
length = len(str(x))
lastDigit = str(x)[(length)-1]
if lastDigit == 1 or 4 or 7 or 0:
rowLeft = 1505.4
if lastDigit == 2 or 5 or 8:
rowLeft = 1502.9
if lastDigit == 3 or 6 or 9:
rowLeft == 1498.2
if rowUp == '1' or '0':
realRowUp = 245.3
if rowUp == '2':
realRowUp = 155.3
if rowUp == '3':
realRowUp = -14.6
self.zombie[x].setPos((rowLeft), (realRowUp), 12)
self.zombie[x].setScale(5)
self.zombie[x].setP(0)
self.zombie[x].setR(0)
self.zombie[x].setPythonTag("HP", 100)
self.colNode.append(None)
self.zombie[x].setPythonTag("COLNODE", self.colNode[x])
self.colNode[x] = self.zombie[x].attachNewNode(CollisionNode("z"+str(x)))
self.colNode[x].show()
self.colNode[x].node().addSolid(CollisionTube(0, 0, 20, 0, 0, -20, 50000))
self.zdummy.append(None)
self.zombie[x].setPythonTag("ZDummy", x)
self.zdummy[x] = self.loader.loadModel("smiley")
self.zdummy[x].hide
self.zombie[x].setPythonTag("next2Protag", False)
self.zombie[x].setPythonTag("justHit", False)
def maintainN2P(self, task):
for x in self.zombie:
distanceBetween = x.getDistance(self.cam)
if distanceBetween <= 4:
x.setPythonTag("next2Protag", True)
else:
x.setPythonTag("next2Protag", False)
return task.cont
def reload(self, task):
if self.playerReloads > 0:
self.playerReloads = self.playerReloads - 1
self.playerBullets = 8
def reloadCore(self):
if self.playerReloads != 0:
self.reloadSequence.start()
self.taskMgr.doMethodLater(3.4, self.reload, "self.reload")
def zombieDie(self, zombieKilled, colNode, i):
zombieKilled.removeNode()
del self.zombie[int(i)]
self.numZombies -=1
def setup_cd(self):
base.cTrav = CollisionTraverser()
self.notifier = CollisionHandlerQueue()
def update_zombie(self, task):
for i in self.zombie:
zdummy = self.zdummy[i.getPythonTag("ZDummy")]
zdummy.setPos(self.zombie[i.getPythonTag("ZDummy")].getPos())
zdummy.lookAt(self.cam)
zdummy.setH(zdummy.getH()-180)
if i.getPythonTag("justHit") == False and i.getPythonTag("next2Protag") == False:
i.setH(zdummy.getH())
i.setY(i, -.2)
if i.getPythonTag("next2Protag") == True and i.getPythonTag("justHit") == False:
i.setPythonTag("justHit", True)
self.playerHP = ((self.playerHP)-10)
i.setPythonTag("justHit", True)
self.taskMgr.doMethodLater(.5, self.resetZombieHit, "reset zombie hit", extraArgs = [i])
return task.cont
self.abc is a test variable.
This detects shots:
if self.notifier.getNumEntries() >= 1:
self.dr = True
for i in self.notifier.getEntries():
if "zombie" in str(i):
self.zombiesHit.append(i.getIntoNode().getName())
for x in self.zombiesHit:
zombieName = self.getZomName(x)
dst = zombieName.getDistance(self.cam)
zombieName.setPythonTag("dst", dst)
self.distanceZombies.append(dst)
lengthDst = len(self.distanceZombies)
shortestDistance = min(self.distanceZombies)
zombieNName = shortestDistance
for i in self.zombiesHit:
x = self.getZomName(i)
if x.getPythonTag("dst") == (shortestDistance):
self.zombie_shot(x.getPythonTag("HP"), x, x.getPythonTag("COLNODE"), self.getZomNum(i))
self.clear(self.distanceZombies)
self.clear(self.zombiesHit)
self.notifier.clearEntries
return task.cont
self.dr is also a test variable.
This returns zomnums (self.zombie is a list, and each zombie has a position in it). It also returns zomNames.
def getZomNum(self, i):
return i[1:]
def getZomName(self, i):
x = None
x = i
zomNum = str(x)[1:]
print(zomNum)
self.zomName = self.zombie[(int(zomNum))]
return self.zomName
But then when I shoot a zombie:
self.zomName = self.zombie[(int(zomNum))]
IndexError: list index out of range
This really confuses me. When I print the colNodes being hit, it numbers 0 through 8 with only 3 zombies!
Tell me if I need to clarify anything, I know it’s a lot of code.
Thanks.