import direct.directbase.DirectStart from pandac.PandaModules import * from direct.showbase import DirectObject from direct.task import Task from direct.actor import Actor from direct.interval.IntervalGlobal import * import math, sys, random class World(DirectObject): def __init__(self): self.accept('escape', sys.exit) taskMgr.add(self.playStartSound,'play start sound') def playStartSound(self,task): self.sound = loader.loadSfx('belltree_up2.wav') self.sound.play() return Task.done world = World() #Load the first environment model environ = loader.loadModel("models/environment") environ.reparentTo(render) environ.setScale(0.25) environ.setPos(-8,42,0) class monster(Actor.Actor): def __init__(self, targets): Actor.Actor.__init__(self,'models/monster1', {'idle':'models/monster1-idle', 'pincer':'models/monster1-pincer-attack-both'}) self.play('pincer') self.loop('idle') self.reparentTo(render) self.targets = targets self.attacking = False self.sound1 = loader.loadSfx('munch1.wav') self.sound1.setLoop(True) self.prevtime = 0 taskMgr.add(self.update, 'monster update') def update(self, task): elapsed = task.time - self.prevtime self.prevtime = task.time if self.attacking: if self.getCurrentAnim() != 'pincer': self.attacking = False self.sound1.stop() self.prey.detachNode() else: target = None targetDist = 1000000 targetDir = None for t in self.targets: tdir = t.getPos() - self.getPos() if tdir.length() < targetDist: target = t targetDist = tdir.length() targetDir = tdir if target: targetDir.setZ(0) if targetDir.length() > 3: targetDir.normalize() self.setPos(self.getPos() + targetDir*5*elapsed) self.setH(math.degrees(-math.atan2(targetDir[0], targetDir[1]))) self.loop('idle', 0) else: self.play('pincer') if self.sound1.status() == 1: self.sound1.play() self.prey = target self.targets.remove(target) self.attacking = True return Task.cont class dummyTarget(Actor.Actor): def __init__(self,player): Actor.Actor.__init__(self,'models/ralph', {'walk':'models/ralph-walk', 'offbalance':'models/ralph-offbalance'}) self.loop('walk') self.reparentTo(render) self.setColor(0,0,1) self.dir = random.uniform(0, 2*math.pi) self.ddir = 0 self.prevtime = 0 self.player = player self.offbalance = False taskMgr.add(self.update, 'dummyTarget update') def update(self, task): elapsed = task.time - self.prevtime self.prevtime = task.time if self.offbalance: if self.getCurrentAnim() != 'offbalance': self.offbalance = False self.loop('walk') else: self.ddir += random.uniform(-math.pi,math.pi)*5*elapsed if self.ddir > math.pi: self.ddir = math.pi elif self.ddir < -math.pi: self.ddir = -math.pi self.dir += self.ddir * elapsed dvec = Vec3(math.sin(self.dir), -math.cos(self.dir), 0) self.setPos(self.getPos() + dvec*2*elapsed) self.setH(math.degrees(self.dir)) if self.getDistance(self.player) < 4: self.play('offbalance') self.offbalance = True return Task.cont class player(Actor.Actor): def __init__(self): Actor.Actor.__init__(self,'models/ralph', {'run':'models/ralph-run', 'jump':'models/ralph-jump', 'walk':'models/ralph-walk'}) self.reparentTo(render) self.key = {'up':False, 'left':False, 'right':False, ' ':False} self.accept('arrow_up', self.setKeyState, ['up', True]) self.accept('arrow_up-up', self.setKeyState, ['up', False]) self.accept('arrow_right', self.setKeyState, ['right', True]) self.accept('arrow_right-up', self.setKeyState, ['right', False]) self.accept('arrow_left', self.setKeyState, ['left', True]) self.accept('arrow_left-up', self.setKeyState, ['left', False]) self.accept('space', self.setKeyState, [' ', True]) self.accept('space-up', self.setKeyState, [' ', False]) self.jumping = False self.jumpStart = 0 self.prevtime = 0 taskMgr.add(self.update, 'player update') def setKeyState(self, name, val): self.key[name] = val def update(self, task): elapsed = task.time - self.prevtime self.prevtime = task.time if self.jumping: dir = Vec3(math.sin(math.radians(self.getH())), -math.cos(math.radians(self.getH())), 0) p = self.getPos() + dir*10*elapsed p.setZ(math.sin(task.time - self.jumpStart)*4) self.setPos(p) if self.getCurrentAnim() != 'jump': self.jumping = False self.pose('walk',0) else: if self.key['up']: dir = Vec3(math.sin(math.radians(self.getH())), -math.cos(math.radians(self.getH())), 0) self.setPos(self.getPos() + dir*5*elapsed) self.loop('run',0) if self.key['right']: self.setH(self.getH() - 180*elapsed) if not self.key['up']: self.loop('walk',0) if self.key['left']: self.setH(self.getH() + 180*elapsed) if not self.key['up']: self.loop('walk',0) if not (self.key['up'] or self.key['right'] or self.key['left']): self.pose('walk',0) if self.key[' ']: self.jumping = True self.jumpStart = task.time self.play('jump') return Task.cont ralph = player() ralph.setPos(0,0,0) targets = [ralph] for p in [ [-20,10,0], [-10,-12,0], [5,-15,0] ]: g = dummyTarget(ralph) g.setPos(p[0],p[1],p[2]) targets.append(g) monster1 = monster(targets) monster1.setPos(20,20,3) def setCam(task): base.camera.setPos(0, -50, 50) base.camera.setHpr(0, -45, 0) return Task.cont taskMgr.add(setCam, 'setCam') run()