def shoot(): bala = self.particlesDummy.attachNewNode("balaDummy") balaImage = OnscreenImage(image="prova/textures/bala.png", parent=bala) balaImage.setTransparency(1) balaImage.setScale(.1, 1., .2) balaImage.setBillboardPointEye() bala.setQuat(self.modelAvio.getQuat(render)) if self.balaPositiu: bala.setPos(self.balaDreta.getPos(render)) self.balaPositiu = False else: bala.setPos(self.balaEsquerra.getPos(render)) self.balaPositiu = True balaSphere = bala.attachNewNode(self.balaCol) balaColHandler = CollisionHandlerQueue() base.cTrav.addCollider(balaSphere, balaColHandler) #~ if type(self.shootPoint) == 'libpanda.Point3': #~ bala.lookAt(self.shootPoint) #~ else: bala.setH(bala, 180.) taskMgr.add( mouBala, "moubala", extraArgs=[bala, balaImage, self.BALA_VEL, balaColHandler], appendTask=True)
def configureDance(self): self.PRESSED,self.NPRESSED,self.PERFECT,self.GOOD,self.MISS=10,-10,2,1,0 danceNode = self.render.attachNewNode(PandaNode('dance')) # load and set up scene danceScene = self.loader.loadModel("../models/disco_hall") danceScene.reparentTo(danceNode) danceScene.setPosHpr(0, 50, -4, 90, 0, 0) self.configureLights(danceNode) self.configureDancer(danceNode) scoreCircle=OnscreenImage( image = '../textures/arrivalCircle.png', pos = (-1,0,0.8)) scoreCircle.setTransparency(TransparencyAttrib.MAlpha) scoreCircle.setScale(0.2) scoreText= OnscreenText(text =str(0), pos = (-1.02,0.76), scale = 0.1,fg=(1,1,1,1)) position=self.dancer.getPos() position[1]=0 position[2]=-0.4 GUIarrows=DirectFrame(frameColor=(0.3,0.3,0.7,0.3), frameSize=(-0.8,.8,0.2,-0.2), pos=position) hitSign=OnscreenImage(image ='../textures/circle.png', pos = (-0.6, 0, -0.4)) hitSign.setTransparency(TransparencyAttrib.MAlpha) hitSign.setScale(0.15) scoreReminder=OnscreenText(text ='PERFECT', pos = (-0.6,-0.4), scale = 0.04,fg=(1,1,1,1),shadow=(0.4,0.4,0.7,0.3)) self.setPanel('dance',Panel(danceNode, {'scoreCircle': scoreCircle, 'GUIarrows':GUIarrows,'hitSign': hitSign,'scoreText': scoreText, 'scoreReminder': scoreReminder}))
def loadGUI(self): self.vidas_imgs = list() w = 0.24 for i in range(self.VIDAS): image_warning = OnscreenImage( image='../data/Texture/signal_warning.png', pos=(-1 + i * w, 0, 0.85), parent=self._playing_node2d) image_warning.setScale(0.1) image_warning.setTransparency(TransparencyAttrib.MAlpha) image_warning.hide() image_ok = OnscreenImage(image='../data/Texture/signal_ok.png', pos=(-1 + i * w, 0, 0.85), parent=self._playing_node2d) image_ok.setScale(0.1) image_ok.setTransparency(TransparencyAttrib.MAlpha) image_ok.show() self.vidas_imgs.append((image_ok, image_warning)) self._level_time_O = OnscreenText(text='', pos=(0, 0.85), scale=0.14, fg=(1.0, 1.0, 1.0, 1.0), bg=(0.0, 0.0, 0.0, 1.0), parent=self._playing_node2d)
class ItemIcon(): def __init__(self, itemName, parentNode): print 'itemicon', itemName, parentNode self.parentNode = parentNode # The node of its parent (e.g. the inventory) self.itemName = itemName # The filename of the icon self.image = None # The actual icon #self.iconNode = aspect2d.attachNewNode('iconnode') self.LoadContent() def LoadContent(self): self.itemImage = OnscreenImage(image = "Assets/Images/Items/%s.png" % (self.itemName)) self.itemImage.setScale((self.itemImage.getTexture().getOrigFileXSize() / 1024.0, 1, self.itemImage.getTexture().getOrigFileYSize() / 1024.0)) self.itemImage.setTransparency(TransparencyAttrib.MAlpha) self.itemImage.reparentTo(self.parentNode) def setBin(self, binType, value): print 'set bin', binType, value self.itemImage.setBin(binType, value) def SetPos(self, pos): self.itemImage.setPos(pos) def Destroy(self): self.itemImage.destroy()
def clear(self,fadeout = 0,bgfile = None): self.clearQuickItems() if not fadeout: self.itemEntries.clear() self.reload() else: dr = self.camera.node().getDisplayRegion(0) texture = dr.getScreenshot() w = dr.getPixelWidth() h = dr.getPixelHeight() self.itemEntries.clear() self.reload() if bgfile: bgentry = StoryViewItemEntry(fileName = bgfile,key = '__bg__',category = SVIC.BG) self.newItem(bgentry) tempbg = OnscreenImage(texture) if w > h: tempbg.setScale(1*w/float(h),1,1) else: tempbg.setScale(1,1,1*h/float(w)) tempbg.setColor(1,1,1,1) tempbg.reparentTo(self.bgNodePath) tempbg.setName('__tempbg__') li = LerpColorInterval(tempbg, fadeout, (1,1,1,0), (1,1,1,1),blendType = 'easeInOut' ) self._intervals.append(li) li.start()
def LoadImage(self, filename, parent): myImage = OnscreenImage(image = 'Assets/Images/HUD/%s' % (filename)) myImage.setTransparency(TransparencyAttrib.MAlpha) myImage.reparentTo(parent) myImage.setScale((myImage.getTexture().getOrigFileXSize() / 1024.0, 1, myImage.getTexture().getOrigFileYSize() / 1024.0)) myImage.hide() return myImage
def makeOnscreenVariable(self,fileName,x,y,z,width,height): imageVariable = OnscreenImage(image = fileName) imageVariable.reparentTo(pixel2d) imageVariable.setPos(x,y,z) imageVariable.setScale(width,1,height) #probably needs an include of some sort imageVariable.setTransparency(TransparencyAttrib.MAlpha) return imageVariable
def generate2DArrows(self,arrowList): self.movingArrows =[None] * self.FULLSCORE for i in range(len(arrowList)): imagePath = self._2DdownArrow if(arrowList[i].type == 'l'): imagePath = self._2DrightArrow arrow=OnscreenImage(image = imagePath, pos = (0.3, 0, 0)) arrow.setTransparency(TransparencyAttrib.MAlpha) arrow.setScale(0.1) x,y,z=-0.6,0,0 startX,startY,startZ=x+arrowList[i].getExpectedTime(),y,z arrow.setPos(startX,startY,startZ) arrow.reparentTo(self.getPanel('dance').getItem('GUIarrows')) arrow.hide() self.movingArrows[i] = arrow
def loadGUI(self): self.vidas_imgs = list() w = 0.24 for i in range(self.VIDAS): image_warning = OnscreenImage(image = '../data/Texture/signal_warning.png', pos=(-1 + i*w, 0, 0.85), parent=self._playing_node2d) image_warning.setScale(0.1) image_warning.setTransparency(TransparencyAttrib.MAlpha) image_warning.hide() image_ok = OnscreenImage(image = '../data/Texture/signal_ok.png', pos=(-1 + i*w, 0, 0.85), parent=self._playing_node2d) image_ok.setScale(0.1) image_ok.setTransparency(TransparencyAttrib.MAlpha) image_ok.show() self.vidas_imgs.append((image_ok, image_warning)) self._level_time_O = OnscreenText(text = '', pos = (0, 0.85), scale = 0.14, fg=(1.0, 1.0, 1.0, 1.0), bg=(0.0, 0.0, 0.0, 1.0), parent=self._playing_node2d)
def __init__(self): ShowBase.__init__(self) imageObject = OnscreenImage(image='me.png', pos=(-0.5, 0, 0.02)) # Reparent the model to render. imageObject.reparentTo(self.render) # Apply scale and position transforms on the model. imageObject.setScale(10, 10, 10) imageObject.setPos(0, 42, 0) car = OnscreenImage(image="car.png", pos=(0,0,0)) car.reparent_to(self.render) car.setScale(3, 3, 3) car.setPos(0, 41, 0) self.accept('arrow_left-up', self.car_go_left, [car]) self.accept('arrow_right-up', self.car_go_right, [car])
class HUD(): def __init__(self): self.speedometer = OnscreenImage(image = 'img/speedometerDial.png', pos = (-1, 0, -.7) ) self.speedometer.setScale(.25) self.speedometer.setTransparency(TransparencyAttrib.MAlpha) self.speedPin = OnscreenImage(image = 'img/speedometerNeedle.png', pos = (-1, 0, -.7)) self.speedPin.setScale(.10) self.speedPin.setTransparency(TransparencyAttrib.MAlpha) self.speedPin.setHpr(0, 0, 0) self.minimap = OnscreenImage(image = 'img/minimap.png', pos = (1.05, 0, -.65)) self.minimap.setScale(.19, .19, .3) self.dot = OnscreenImage(image = 'img/dot.png', pos = (1.01, 0, -.55)) self.dot.setScale(.025) font1 = loader.loadFont('img/goodfish.ttf') self.lapText = OnscreenText(text = "0/10", font = font1, pos = (1, -.1, 0), fg = (1, 1, 1, 1) ) self.lapText.setScale(.05) self.placeText = OnscreenText(text = "", font = font1, pos = (1, -.2, 0), fg = (1, 1, 1, 1)) self.placeText.setScale(.05) self.timerText = OnscreenText(text = "Time: ", font = font1, pos = (1, -.3, 0), fg = (1, 1, 1, 1)) def update(self, velocity, x, y, laps, place, time): if velocity < 0: velocity = -velocity self.dot.setPos(1.01+(x/4250), 0, -.55+(y/4250)) self.lapText.setText("Laps: " + str(laps)+"/3") self.speedPin.setHpr(0, 0, 4*velocity) self.placeText.setText("Position: "+str(place)) self.timerText.setText("Time: "+ str(round(time))) """def getDist(self, x, y, checkpoint): cx = checkpoint[0] cy = checkpoint[1] dist = math.sqrt((cx-x)**2 + (cy-y)**2) rotAngle = math.atan2(-y,x) newX = x*math.cos(rotAngle) - y*math.sin(rotAngle) dToCheckpoint = dist - newX return dToCheckpoint""" """def updateMiniMap(self, x, y): self.dot.setPos(1+(x/1000), 0, -.7+(y/1000))"""
def shoot(): bala = self.particlesDummy.attachNewNode("balaDummy") balaImage = OnscreenImage(image="prova/textures/bala.png", parent=bala) balaImage.setTransparency(1) balaImage.setScale(0.1, 1.0, 0.2) balaImage.setBillboardPointEye() bala.setQuat(self.modelAvio.getQuat(render)) if self.balaPositiu: bala.setPos(self.balaDreta.getPos(render)) self.balaPositiu = False else: bala.setPos(self.balaEsquerra.getPos(render)) self.balaPositiu = True balaSphere = bala.attachNewNode(self.balaCol) balaColHandler = CollisionHandlerQueue() base.cTrav.addCollider(balaSphere, balaColHandler) # ~ if type(self.shootPoint) == 'libpanda.Point3': # ~ bala.lookAt(self.shootPoint) # ~ else: bala.setH(bala, 180.) taskMgr.add(mouBala, "moubala", extraArgs=[bala, balaImage, self.BALA_VEL, balaColHandler], appendTask=True)
class Menu(DirectObject): def __init__(self): self.title = OnscreenImage(image = 'img/titleScreen.png', pos = (0, 0, 0) ) self.pointer = OnscreenImage(image = 'img/titleSelector.png', pos = (-.2, 0 ,-.63)) self.pointer.setScale(.05) self.start = False self.instructions = False self.pointerPosition = 1 self.pointer.setTransparency(TransparencyAttrib.MAlpha) self.accept("enter", self.screenHandler) self.accept("arrow_up", self.movePointerUp) self.accept("arrow_down", self.movePointerDown) self.accept("backspace", self.back) self.accept("escape", sys.exit) def screenHandler(self): if self.pointerPosition == 1: self.start = True self.title.destroy() self.pointer.destroy() else: self.instructions = True self.title.setImage('img/instructions.png') def back(self): if self.instructions == True: self.instructions = False self.title.setImage('img/titleScreen.png') self.pointer.setImage('img/titleSelector.png') def movePointerUp(self): if self.pointerPosition == 2: self.pointer.setPos(-.2, 0, -.63) self.pointerPosition = 1 def movePointerDown(self): if self.pointerPosition == 1: self.pointer.setPos(-.2, 0, -.8) self.pointerPosition = 2 def destroy(self): self.ignoreAll()
class Cursor: def __init__(self, path, scale, hotspot): if not path: return self.__set_standard_curson(False) self.cursor_img = OnscreenImage(path) self.cursor_img.setTransparency(True) self.cursor_img.setScale(scale) self.cursor_img.setBin('gui-popup', 50) self.hotspot_dx = scale[0] * (1 - 2 * hotspot[0]) self.hotspot_dy = scale[2] * (1 - 2 * hotspot[1]) eng.event.attach(self.on_frame) def __set_standard_curson(self, show): props = WindowProperties() props.setCursorHidden(not show) base.win.requestProperties(props) def show(self): self.cursor_img.show() def show_standard(self): self.__set_standard_curson(True) def hide(self): self.cursor_img.hide() def hide_standard(self): self.__set_standard_curson(False) def cursor_top(self): self.cursor_img.reparent_to(self.cursor_img.get_parent()) def on_frame(self): if base.mouseWatcherNode.hasMouse(): x = base.mouseWatcherNode.getMouseX() y = base.mouseWatcherNode.getMouseY() h_x = x * base.getAspectRatio() + self.hotspot_dx self.cursor_img.setPos(h_x, 0, y - self.hotspot_dy)
class TestApp(ShowBase): def __init__(self): ShowBase.__init__(self) self.set_background_color(0.1137, 0.1450, 0.1725) self.disable_mouse() self.mire = OnscreenImage(image=os.path.join(MAINDIR, 'test.jpeg')) self.mire.setScale(1.6, 1, 1) self.mire.hide() self.is_shown = False command_dic = {"toggleImage": self.toggleImage} self.commandline = pconsole.Console() self.commandline.create(command_dic, app=self, event='f1') self.task_mgr.add(self.update, "updatingTask") def update(self, task): return task.cont def toggleImage(self): if self.is_shown: self.mire.hide() else: self.mire.show() self.is_shown = not self.is_shown
class KeyValue(object): weaponOverHeat = 5 time = 0 step = False curScale = 0 fireRight = True fireLeft = False delayShot = 0 def __init__(self, camera, id): self.audio3d = Audio3DManager(base.sfxManagerList[0], base.camera) #load the other keyValue texture keyTexRed = base.loader.loadTexture("resources/tex/keyValueRed.png") #Set model and projectile paths self.gunPath1 = NodePath("gun") self.gunPath1.reparentTo(base.camera) self.gunPath1.setPos(1.2 ,10,-3.5) self.gunModel1 = loader.loadModel("./resources/keyValue") self.gunModel1.setTexture(keyTexRed,1) self.gunModel1.reparentTo(self.gunPath1) self.gunModel1.setPos(camera,1.2,4.5,-1.7) self.gunModel1.setHpr(-90,0,0) self.gunPath2 = NodePath("gun") self.gunPath2.reparentTo(base.camera) self.gunPath2.setPos(-1.2,10,-3.5) self.gunModel2 = loader.loadModel("./resources/keyValue") self.gunModel2.reparentTo(self.gunPath2) self.gunModel2.setPos(camera,-1.2,4.5,-1.7) self.gunModel2.setHpr(-90,0,0) self.reticle = OnscreenImage("./resources/kvReticle.png") self.reticle.setTransparency(True) self.reticle.setScale(0) base.taskMgr.add(self.animate, "kvReticle") def hide(self): self.reticle.setScale(0) self.gunModel1.hide() self.gunPath1.hide() self.gunModel2.hide() self.gunPath2.hide() def show(self): self.gunModel1.show() self.gunPath1.show() self.gunModel2.show() self.gunPath2.show() def fire(self, task): #Fires left or right if self.fireRight: #Spawn projectile, add it to taskMgr and play sfx proj = KVProjectile(self.gunPath1, base.camera, len(base.projectileList)) proj.projectileModel.setColor(0, 0, 255) base.taskMgr.add(proj.moveTask, "move projectile") base.projectileList.append(proj) shotSfx = self.audio3d.loadSfx("./resources/sounds/key_value.wav") self.audio3d.attachSoundToObject(shotSfx, base.camera) shotSfx.play() self.fireRight = False self.fireLeft = True else: #Spawn projectile, add it to taskMgr and play sfx proj = KVProjectile(self.gunPath2, base.camera, len(base.projectileList)) proj.projectileModel.setColor(255, 0, 0) base.taskMgr.add(proj.moveTask, "move projectile") base.projectileList.append(proj) shotSfx = self.audio3d.loadSfx("./resources/sounds/key_value.wav") self.audio3d.attachSoundToObject(shotSfx, base.camera) shotSfx.play() self.fireRight = True self.fireLeft = False base.player.overHeat += self.weaponOverHeat self.delayShot = task.time + .1 base.taskMgr.add(self.contTask, "weaponDelay") def contTask(self, task): return task.cont def animate(self, task): if task.time - self.time > .05: self.reticle.setScale(self.curScale) if self.curScale < .03 and self.step: self.curScale += .001 self.reticle.setScale(self.curScale) self.time = task.time if self.curScale >= .03: self.step = False elif self.curScale > .01: self.curScale -= .001 self.reticle.setScale(self.curScale) self.time = task.time if self.curScale <= .01: self.step = True return task.cont def canShoot(self): taskList = base.taskMgr.getTasksNamed("weaponDelay") if taskList[0].time >= self.delayShot: return True else: return False def getOverHeat(self): return self.overheat def resetWeapon(self): delayShot = 0
class LevelTwo(object): def __init__(self, m): """ :param m: Menu """ self.levelName = "levelTwo" self.gameState = '' m.game = self self.menu = m self.setLight() self.loadScene() if self.menu.tempPlayer is None: self.initCollision() self.initPlayer() else: print 'temp not none' self.node = self.menu.tempPlayer self.node.node.setPos(-250, 265, 20) self.node.game = self self.node.initMission() self.node.mission.memoryNum = self.menu.tempPlayer.mission.memoryNum self.enemy = Enemylevel2(self.node) # self.node.node.setPos(-800, 0, 20) # self.node.node.setPos(-370, 2800, 25) self.node.node.setPos(-700, 0, 25) self.node.node.setHpr(-90, 0, 0) base.accept("escape", self.pauseGame) base.disableMouse() props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.mutableMap = {} self.glowFilter() self.initMania() self.finalcard.reparentTo(hidden) self.initBag() # self.menu.loadState = True self.menu.passFrame.show() self.node.erosionFrame.show() self.node.currentItemFrame.show() if not self.menu.skipUseless: self.menu.loadState = True taskMgr.add(self.waitOne, "waitOne") else: self.save = Save(self) if self.menu.selectedSave == 2: self.save.loadFile('gameinfo_2.save') elif self.menu.selectedSave == 3: self.save.loadFile('gameinfo_3.save') self.node.changeCamera() self.menu.loadState = True self.menu.passFrame.hide() self.setupskillpattern() def waitOne(self, task): if task.time < 1: self.menu.passFrame['frameColor'] = (0, 0, 0, 1 - task.time) return task.cont self.menu.passFrame['frameColor'] = (0, 0, 0, 0) self.menu.passFrame.hide() self.beginPlot() return task.done def beginPlot(self): self.menu.ocanioDialog.show() props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.node.endTask() self.nextPlot() def nextPlot(self): self.menu.ocanioButton['text'] = '刚一踏出房间,房间的门就被重重的锁上了。无论我怎么叫喊,\n' \ '里面都没有回应。我尽可能不去想最糟糕的情况,大概kura不会有什么问题的吧。' self.menu.ocanioButton['command'] = self.node.mission.hideOcanio self.menu.ocanioButton['extraArgs'] = [] def initBag(self): self.bagState = True self.bagText = "" if self.menu.tempPlayer is not None: self.node.bag = self.menu.tempPlayer.bag else: self.node.bag = Bag(self.node) base.accept("b", self.openBag) def openBag(self): # print 'b' if self.bagState: self.node.bag.bagframe.show() self.node.bag.showdisplay.setActive(True) self.node.bag.textObject.setText(self.bagText) self.bagState = not self.bagState props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.menu.selectDialog.hide() self.gameState = 'pause' self.node.state = 'pause' self.node.endTask() base.accept('escape', self.openBag) else: self.node.bag.bagframe.hide() self.node.bag.showdisplay.setActive(False) self.bagText = self.node.bag.textObject.getText() self.node.bag.textObject.setText("") self.node.bag.textObject.setWordwrap(0) self.bagState = not self.bagState props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.gameState = '' self.node.state = '' self.node.initTask() base.accept('escape', self.pauseGame) def initCollision(self): """ create the collision system """ base.cTrav = CollisionTraverser() base.pusher = CollisionHandlerPusher() base.cTrav.setRespectPrevTransform(True) def loadScene(self): """ load the self.sceneModel must have <Group> *something* { <Collide> { Polyset keep descend } in the egg file """ self.goodmanager = GoodsManager() # AddGoods(self,Node,CollisionName,Name,Interactive) self.goodmanager.AddGoods(loader.loadModel('res/models/Scene2/Scene2Cat/Scene2_light.egg'), ["light"], "light", False) self.goodmanager.AddGoods(loader.loadModel('res/models/Scene2/Scene2Cat/Scene2_Ver7.0_wall.egg'), ["Wall", "floor"], "wall", False) self.goodmanager.AddGoods(loader.loadModel('res/models/Scene2/Scene2Cat/Elevator/dianti.egg'), ["dianti"], "dianti_box", True) self.goodmanager.AddGoods(loader.loadModel('res/models/Scene2/Scene2Cat/Elevator/broken_dianti.egg'), ["broken_dianti"], "broken_dianti_box", True) self.goodmanager.GoodsIta['broken_dianti_box'].Node.hide() ''' corridor ''' prefix = 'res/models/Scene2/Scene2Cat/Corridor/Scene2_Ver5.0_' self.loadIn(prefix + 'clock_2.egg', "clock_box", True) # self.loadIn(prefix + 'Outdoor.egg', "outdoor_box", True) self.loadIn(prefix + 'ElectricBox_2.egg', "ElectricBox", True) self.loadIn(prefix + 'entrance.egg', "entrance_box", True) self.loadIn(prefix + 'picture1.egg', "painting_1", True) self.loadIn(prefix + 'picture2.egg', "painting_2", True) self.loadIn(prefix + 'picture3.egg', "painting_3", True) self.loadIn(prefix + 'picture4.egg', "painting_4", True) self.loadIn(prefix + 'picture5.egg', "painting_5", True) self.loadIn(prefix + 'picture6.egg', "painting_6", True) self.loadIn(prefix + 'picture7.egg', "painting_7", True) self.loadIn(prefix + 'picture8.egg', "painting_8", True) self.loadIn(prefix + 'picture9.egg', "painting_9", True) self.loadIn(prefix + 'picture8_cut.egg', "painting_cut", True) self.goodmanager.GoodsIta["painting_cut"].Node.hide() self.goodmanager.GoodsIta["outdoor_box"] = Door(Vec3(374.1351, 1973.22, 105.000), "outdoor_box", prefix + 'Outdoor.egg', 90, Door.Out) ''' hall ''' prefix = 'res/models/Scene2/Scene2Cat/Hall/Scene2_Ver5.0_' self.loadIn(prefix + 'food.egg', 'food_box', True) self.loadIn(prefix + 'cake.egg', 'cake_box', True) self.loadIn(prefix + 'diary.egg', 'diary_box', True) self.loadIn(prefix + 'safe_2.egg', 'safe_box', True) self.loadIn(prefix + 'carrot.egg', 'carrot_box', True) self.loadIn(prefix + 'window.egg', 'window_box', True) self.loadIn(prefix + 'window_broken.egg', 'window_broken_box', True) self.goodmanager.GoodsIta['window_broken_box'].Node.hide() self.loadIn(prefix + 'biaoyu.egg', 'biaoyu_box', True) # self.loadIn(prefix + 'Backdoor.egg', 'backdoor', True) # self.loadIn(prefix + 'Frontdoor.egg', 'frontdoor', True) self.loadIn(prefix + 'hammer_2.egg', 'hammer_box', True) self.loadIn(prefix + 'zhalan_2.egg', 'rabbit_cage', True) self.loadIn(prefix + 'vaccine.egg', 'hallvaccine_box', True) self.loadIn(prefix + 'refrigerator_2.egg', 'fridge_box', True) self.loadIn(prefix + 'rabbit.egg', 'rabbit_box', False) self.loadIn(prefix + 'yuanzhuo.egg', 'yuanzhuo_box', False) self.loadIn(prefix + 'changzhuo_2.egg', 'changzhuo_box', False) self.goodmanager.GoodsIta["Frontdoor"] = Door(Vec3(342.9760, 357.22, 105.000), "Frontdoor", prefix + 'Frontdoor.egg', 90, Door.Out) self.goodmanager.GoodsIta["Backdoor"] = Door(Vec3(342.9760, 1571.22, 105.000), "Backdoor", prefix + 'Backdoor.egg', 90, Door.Out) ''' Outroom ''' prefix = 'res/models/Scene2/Scene2Cat/Outroom/Scene2_Ver5.0_' self.loadIn(prefix + 'vase_2.egg', 'vase_box', True) self.loadIn(prefix + 'knife.egg', 'knife_box', True) self.loadIn(prefix + 'jiazi_2.egg', 'jiazi_box', False) self.loadIn(prefix + 'rongqi.egg', 'rongqi_box', False) self.loadIn(prefix + 'vaccine.egg', 'vaccine_box', True) self.loadIn(prefix + 'lavabo_2.egg', 'lavabo_box', True) self.loadIn(prefix + 'mirror.egg', 'mirror_box', True) self.loadIn(prefix + 'furnace_2.egg', 'furnace_box', True) self.loadIn(prefix + 'bookshelf.egg', 'bookshelf_box', True) self.loadIn(prefix + 'xiaozhuozi_2.egg', 'xiaozhuozi_box', False) self.goodmanager.staticGoods["infireish"] = GoodsParticle("fireish", (-370, 3183, 25), 16, render,31) self.goodmanager.staticGoods["insteam"] = GoodsParticle("steam", (-370, 3183, 50), 5, render,30) self.goodmanager.GoodsIta['Scene2_book-beijuji'] = Book(prefix+'beijuji.egg','beijuji',(-350, 3183, 50)) self.goodmanager.GoodsIta['Scene2_book-beijuji'].Node.setHpr(30, 30, 30) for i in range(8): name = "outflowers" + str(i+1) self.goodmanager.AddGoods(loader.loadModel(prefix + name + '.egg'), [name], name, False) self.goodmanager.staticGoods[name].Node.setTwoSided(True) self.goodmanager.staticGoods['outflowers7'].Node.hide() self.goodmanager.staticGoods['outflowers8'].Node.hide() self.mirrorShader = loader.loadShader("shaders/mirrorShader.sha") self.goodmanager.GoodsIta['mirror_box'].Node.setShader(self.mirrorShader) # self.goodmanager.GoodsIta['mirror_box'].Node.setTwoSided(True) self.mirror(self.goodmanager.GoodsIta['mirror_box'].Node) ''' Inroom ''' prefix = 'res/models/Scene2/Scene2Cat/Inroom/Scene2_Ver5.0_' self.loadIn(prefix + 'invase.egg', 'invase_box', True) self.loadIn(prefix + 'inknife.egg', 'inknife_box', True) self.loadIn(prefix + 'injiazi.egg', 'injiazi_box', False) self.loadIn(prefix + 'inlavabo.egg', 'inlavabo_box', True) self.loadIn(prefix + 'inrongqi.egg', 'inrongqi_box', False) self.loadIn(prefix + 'infurnace.egg', 'infurnace_box', True) self.loadIn(prefix + 'inbookshelf.egg', 'inbookshelf_box', True) self.loadIn(prefix + 'inxiaozhuozi.egg', 'inxiaozhuozi_box', False) self.goodmanager.staticGoods["fireish"] = GoodsParticle("fireish", (-370, 2870, 25), 16, render, 31) self.goodmanager.staticGoods["steam"] = GoodsParticle("steam", (-370, 2870, 50), 5, render, 30) self.goodmanager.GoodsIta['Scene2_book-xijuji'] = Book(prefix + 'inxijuji.egg', 'inxijuji', (-350, 2870, 50)) self.goodmanager.GoodsIta['Scene2_book-xijuji'].Node.setHpr(30, 30, 30) for i in range(8): name = "inflowers" + str(i+1) self.goodmanager.AddGoods(loader.loadModel(prefix + name + '.egg'), [name], name, False) self.goodmanager.staticGoods[name].Node.hide() self.goodmanager.staticGoods[name].Node.setTwoSided(True) self.goodmanager.staticGoods['inflowers1'].Node.show() self.h2so4_1 = GoodsParticle("H2SO4", (-380, 2270, 136), 6, render, 32) self.h2so4_2 = GoodsParticle("smo", (-380, 2270, 110), 5, render, 33) self.h2so4_3 = GoodsParticle("surface-1", (-365, 2270, 100), 10, render, 34) self.h2so4_3.particle.setScale(10, 20, 10) self.h2so4_4 = GoodsParticle("H2SO4", (-380, 3895.5, 136), 6, render, 32) self.h2so4_5 = GoodsParticle("smo", (-380, 3890, 110), 5, render, 33) self.h2so4_6 = GoodsParticle("surface-1", (-363, 3890, 100), 10, render, 34) self.h2so4_6.particle.setScale(10, 20, 10) def loadIn(self, path, name, b): self.goodmanager.AddGoods(loader.loadModel(path), [name], name, b) def itemCollision(self, model, name, radius): nodePath = NodePath(name) node = CollisionNode(name) node.addSolid(CollisionSphere(20, 0, radius, radius)) solid = model.attachNewNode(node) nodePath.reparentTo(model) solid.show() base.cTrav.addCollider(solid, base.pusher) base.pusher.addCollider(solid, nodePath, base.drive.node()) def initPlayer(self): """ loads the player and creates all the controls for him""" self.node = Player(self.goodmanager, self.menu, self) # self.enemy = Enemy(self.node) self.enemy = Enemylevel2(self.node) # self.goodmanager.GoodsIta["enemy"] = Enemy(self.node) # self.goodmanager.GoodsIta["enemy"].state = 1 def pauseGame(self): props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.menu.selectDialog.hide() self.gameState = 'pause' self.node.state = 'pause' self.node.endTask() self.node.erosionFrame.hide() self.node.currentItemFrame.hide() base.accept('escape', self.escapeEvent) base.accept('b', self.menu.nothing) self.menu.pauseFrame.show() def escapeEvent(self): self.menu.pauseFrame.hide() self.node.state = '' self.node.initTask() self.node.erosionFrame.show() self.node.currentItemFrame.show() base.accept('escape', self.pauseGame) base.accept('b', self.openBag) props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) def mirror(self,tex): self.mirrorBuffer = base.win.makeTextureBuffer("mirror", 512, 512) print 'mirrorBuffer',self.mirrorBuffer self.mirrorBuffer.setSort(-3) self.mirrorBuffer.setClearColor(LVector4(0, 0, 0, 1)) print base.cam.node().getLens() self.mirrorCamera = base.makeCamera(self.mirrorBuffer) self.mirrorCamera.reparentTo(render) self.mirrorCamera.setPos((424,3080,104. )) self.mirrorCamera.setH(180) pl = self.mirrorCamera.node().getLens() pl.setFov(90) pl.setNear(100) self.mirrorCamera.node().setLens(pl) self.finalcard = self.mirrorBuffer.getTexture() tex.setTexture(self.finalcard,1) # self.UnLoadmirror() def UnLoadmirror(self): self.mirrorBuffer.getEngine().removeWindow(self.mirrorBuffer) self.mirrorBuffer = None self.mirrorCamera = None def makeFilterBuffer(self, srcbuffer, name, sort, prog): blurBuffer = base.win.makeTextureBuffer(name, 512, 512) blurBuffer.setSort(sort) blurBuffer.setClearColor(LVector4(1, 0, 0, 1)) blurCamera = base.makeCamera2d(blurBuffer) blurScene = NodePath("new Scene") blurCamera.node().setScene(blurScene) shader = loader.loadShader(prog) card = srcbuffer.getTextureCard() card.reparentTo(blurScene) card.setShader(shader) return blurBuffer def glowFilter(self): glowShader = loader.loadShader("shaders/glowShader.sha") # dlight = DirectionalLight('dlight') # alight = AmbientLight('alight') # dlnp = render.attachNewNode(dlight) # alnp = render.attachNewNode(alight) # dlight.setColor(LVector4(0.3, 0.3, 0.3, 1)) # alight.setColor(LVector4(0.8, 0.8, 0.8, 1)) # dlnp.setHpr(0, -60, 0) # render.setLight(dlnp) # render.setLight(alnp) # create the glow buffer. This buffer renders like a normal scene, # except that only the glowing materials should show up nonblack. glowBuffer = base.win.makeTextureBuffer("Glow scene", 1024, 768) glowBuffer.setSort(-3) glowBuffer.setClearColor(LVector4(0, 0, 0, 1)) # We have to attach a camera to the glow buffer. The glow camera # must have the same frustum as the main camera. As long as the aspect # ratios match, the rest will take care of itself. self.glowCamera = base.makeCamera( glowBuffer, lens=base.cam.node().getLens()) # Tell the glow camera to use the glow shader tempnode = NodePath(PandaNode("temp node")) tempnode.setShader(glowShader) self.glowCamera.node().setInitialState(tempnode.getState()) self.glowCamera.node().setCameraMask(BitMask32.bit(0)) # set up the pipeline: from glow scene to blur x to blur y to main # window. blurXBuffer = self.makeFilterBuffer( glowBuffer, "Blur X", -2, "shaders/XBlurShader.sha") blurYBuffer = self.makeFilterBuffer( blurXBuffer, "Blur Y", -1, "shaders/YBlurShader.sha") self.finalcard = blurYBuffer.getTextureCard() self.finalcard.reparentTo(render2d) Attrib = ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_incoming_alpha) self.finalcard.setAttrib(Attrib) base.bufferViewer.setPosition("llcorner") base.bufferViewer.setLayout("hline") base.bufferViewer.setCardSize(0.652, 0) base.accept("tab", self.toggleGlow) self.glowOn = False def limitGlow(self, task): if task.time < 5: return task.cont else: self.glowOn = False self.finalcard.reparentTo(hidden) # self.goodmanager.GoodsIta["box"].CloseHighLight() return task.done def toggleGlow(self): self.showskillpattern("eyepattern") if self.glowOn: return self.glowOn = True taskMgr.add(self.limitGlow, "limitGlow") if self.node.EROSION + 10 > 100: self.node.EROSION = 100 else: self.node.EROSION += 10 self.finalcard.reparentTo(render2d) # self.goodmanager.GoodsIta["box"].OpenHighLight() def initMania(self): base.accept("space", self.mania) self.maniaState = False def mania(self): self.showskillpattern("maniapattern") if not self.maniaState: self.node.speed *= 1.4 self.maniaState = True if self.node.EROSION + 10 > 100: self.node.EROSION = 100 else: self.node.EROSION += 10 taskMgr.remove("fadeSpeed") taskMgr.add(self.fadeSpeed, "fadeSpeed") def fadeSpeed(self, task): if task.time < 10: return task.cont else: self.node.speed /= 1.4 self.maniaState = False return task.done def setupskillpattern(self): self.eyepattern = OnscreenImage(image="res/skill_icon/eye-white.png", pos=(-1.2, 1, -0.8)) self.eyepattern.setTransparency(TransparencyAttrib.MAlpha) self.eyepattern.setScale(0.1) self.eyepattern.setSa(0.8) self.eyepattern.hide() self.maniapattern = OnscreenImage(image="res/skill_icon/mania-white.png", pos=(-1.2 + 0.3, 1, -0.8)) self.maniapattern.setTransparency(TransparencyAttrib.MAlpha) self.maniapattern.setScale(0.1) self.maniapattern.setSa(0.8) self.maniapattern.hide() self.screen_patternArray = {} self.screen_patternArray["eyepattern"] = [self.eyepattern, False, 5.0, 5.0] self.screen_patternArray["maniapattern"] = [self.maniapattern, False, 10.0, 10.] self.patterntask = False self.patterntaskpretime = 0 # self.mouseIconNormal.setSa(0.5) def showskillpattern(self, patternname): self.screen_patternArray[patternname][2] = self.screen_patternArray[patternname][3] self.screen_patternArray[patternname][1] = True self.screen_patternArray[patternname][0].show() if self.patterntask == False: taskMgr.add(self.showskillpatterntask, "showskillpatterntask") self.patterntask = True def showskillpatterntask(self, task): num = 0 for key in self.screen_patternArray: if self.screen_patternArray[key][1] == True: self.screen_patternArray[key][2] -= globalClock.getDt() if self.screen_patternArray[key][2] < 5.: if sin(self.screen_patternArray[key][2] * pi * 5) > 0: self.screen_patternArray[key][0].setSa(0) else: self.screen_patternArray[key][0].setSa(0.8) self.screen_patternArray[key][0].setPos(-1.2 + num * 0.3, 1, -0.8) if self.screen_patternArray[key][2] < 0: self.screen_patternArray[key][1] = False self.screen_patternArray[key][0].hide() self.screen_patternArray[key][0].setSa(0.8) num += 1 if num > 0: return task.cont self.patterntask = False return def setLight(self): render.setLightOff() alight=AmbientLight('alight') alnp=render.attachNewNode(alight) alight.setColor(VBase4(0.3,0.3,0.3,1)) render.setLight(alnp) # myFog = Fog("Fog Name") # myFog.setColor(0.2,0.5, 0.1) # myFog.setExpDensity(0.5) # render.setFog(myFog) self.lightpivot1 = render.attachNewNode("lightpivot1") self.lightpivot1.setPos(-124, 947, 50) self.plight1=PointLight('plight1') self.plight1.setColor(VBase4(1, 0.5, 0, 1)) self.temp=LVector3(0.6, 0.08, 0) self.plight1.setAttenuation(self.temp) plnp1=self.lightpivot1.attachNewNode(self.plight1) plnp1.setPos(0,0,50) render.setLight(plnp1) self.lightpivot2 = render.attachNewNode("lightpivot2") self.lightpivot2.setPos(0, 0, 50) self.plight2 = PointLight('plight2') self.plight2.setColor(VBase4(1, 0.5, 0, 1)) self.temp = LVector3(0.6, 0.08, 0) self.plight2.setAttenuation(self.temp) plnp2 = self.lightpivot2.attachNewNode(self.plight2) plnp2.setPos(-200, 0, 50) render.setLight(plnp2) self.lightpivot3 = render.attachNewNode("lightpivot3") self.lightpivot3.setPos(52, 2491, 50) self.plight3 = PointLight('plight3') self.plight3.setColor(VBase4(1, 0.5, 0, 1)) self.temp = LVector3(0.6, 0.08, 0) self.plight3.setAttenuation(self.temp) plnp3 = self.lightpivot3.attachNewNode(self.plight3) plnp3.setPos(-200, 0, 50) render.setLight(plnp3) slight = Spotlight('slight') slight.setColor(VBase4(0.1, 0.5, 0.1, 1)) #slight.setAttenuation(LVector3(0.5,0.08,0)) lens = PerspectiveLens() lens.setFov(10) slight.setLens(lens) slnp = render.attachNewNode(slight) slnp.setPos(-811, 3, 0) slnp.lookAt(415,10,0) # slnp.setPos(0,0,0) # slnp.lookAt(0,0,50) render.setLight(slnp)
class Game(object): def __init__(self, m): """ :param m: Menu """ self.levelName = "tutorial" self.gameState = '' m.game = self self.menu = m self.initCollision() self.loadScene() self.initPlayer() base.accept("escape", self.pauseGame) base.disableMouse() props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.mutableMap = {} self.glowFilter() self.initMania() self.finalcard.reparentTo(hidden) self.initBag() self.menu.loadState = True # self.menu.passFrame.show() # self.node.erosionFrame.show() # self.node.currentItemFrame.show() # taskMgr.add(self.waitOne, "waitOne") self.maniaSound = loader.loadSfx("res/sounds/Darkness3.mp3") self.setupskillpattern() self.SetLight() if not self.menu.skipUseless: self.initVideo() self.attachControls() self.IgnoreControls() def IgnoreControls(self): for name in self.keyEven: base.ignore(name) print base.getAllAccepting() def attachControls(self): self.keyEven = ["tab", 'escape', 'b', 'space'] base.accept('b', self.openBag) base.accept("tab", self.toggleGlow) base.accept("escape", self.pauseGame) base.accept('space', self.mania) def initVideo(self): self.node.endTask() media_file = "res/videos/begining.avi" self.tex = MovieTexture("preVideo") success = self.tex.read(media_file) assert success, "Failed to load video!" cm = CardMaker("preVideo Card") # cm.setFrameFullscreenQuad() # cm.setFrame(-1.3, 1.3, -1, 1) cm.setFrame(-1.2, 1.2, -.95, .95) # Tell the CardMaker to create texture coordinates that take into # account the padding region of the texture. cm.setUvRange(self.tex) self.card = NodePath(cm.generate()) self.card.reparentTo(base.render2d) self.card.setTexture(self.tex) self.videoSound = loader.loadSfx(media_file) self.tex.synchronizeTo(self.videoSound) self.videoSound.play() taskMgr.add(self.playVideo, 'playGameVideo') def playVideo(self, task): if self.videoSound.status() != AudioSound.PLAYING: self.videoSound.stop() self.menu.soundMgr.setMusicVolume(0) self.menu.musicVolume = 0 self.card.hide() # self.menu.soundMgr.playMusic('bgm1.mp3') self.menu.passFrame.show() self.node.erosionFrame.show() self.node.currentItemFrame.show() taskMgr.add(self.waitOne, "waitOne") self.attachControls() self.node.initTask() return task.done return task.cont def waitOne(self, task): if task.time < 2: self.menu.passFrame['frameColor'] = (0, 0, 0, 1 - task.time) return task.cont self.menu.passFrame['frameColor'] = (0, 0, 0, 0) self.menu.passFrame.hide() self.beginPlot() return task.done def beginPlot(self): self.menu.tutorialDialog.show() props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.node.endTask() self.nextPlot(0) def nextPlot(self, index): if index == 1 or index == 0: self.menu.nextButton['text'] = self.node.mission.plotText[0][index] self.menu.nextButton['command'] = self.nextPlot self.menu.nextButton['extraArgs'] = [index + 1] elif index == 2: self.menu.ocanioButton['text'] = self.node.mission.plotText[0][ index] self.menu.ocanioButton['command'] = self.nextPlot self.menu.ocanioButton['extraArgs'] = [index + 1] self.menu.tutorialDialog.hide() self.menu.ocanioDialog.show() elif index == 3: self.menu.nextButton['text'] = self.node.mission.plotText[0][index] self.menu.nextButton['command'] = self.node.mission.hideTutorial self.menu.nextButton['extraArgs'] = [] self.menu.tutorialDialog.show() self.menu.ocanioDialog.hide() def initBag(self): self.bagState = True self.bagText = "" self.node.bag = Bag(self.node) base.accept("b", self.openBag) def openBag(self): # print 'b' if self.bagState: self.node.bag.bagframe.show() self.node.bag.showdisplay.setActive(True) self.node.bag.textObject.setText(self.bagText) self.bagState = not self.bagState props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.menu.selectDialog.hide() self.gameState = 'pause' self.node.state = 'pause' self.node.endTask() base.accept('escape', self.openBag) else: self.node.bag.bagframe.hide() self.node.bag.showdisplay.setActive(False) self.bagText = self.node.bag.textObject.getText() self.node.bag.textObject.setText("") self.node.bag.textObject.setWordwrap(0) self.bagState = not self.bagState props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.gameState = '' self.node.state = '' self.node.initTask() base.accept('escape', self.pauseGame) # threading.currentThread().join('gameThread') def initCollision(self): """ create the collision system """ base.cTrav = CollisionTraverser() base.pusher = CollisionHandlerPusher() base.cTrav.setRespectPrevTransform(True) def loadScene(self): """ load the self.sceneModel must have <Group> *something* { <Collide> { Polyset keep descend } in the egg file """ self.goodmanager = GoodsManager() # AddGoods(self,Node,CollisionName,Name,Interactive) # self.goodmanager.AddGoods(loader.loadModel('res/models/Scene3/Scene3_Ver3.0.egg'), ["Wall1", "Wall2", "floor"], # # "wall", False) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver7.0_wall.egg'), ["Wall1", "Wall2", "floor"], "wall", False) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_bed_2.egg'), ["bed_box"], "bed_box", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_bookshelf.egg'), ["bookshelf_box"], "bookshelf_box", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_box.egg'), ["box"], "box", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_light.egg'), ["light"], "light", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_chair1.egg'), ["chair1"], "chair1", False) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_chair2.egg'), ["chair2"], "chair2", False) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_chair3.egg'), ["chair3"], "chair3", False) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_chair4.egg'), ["chair4"], "chair4", False) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_desk2.egg'), ["desk2"], "desk2", False) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_desk3.egg'), ["desk3_2"], "desk3_2", False) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_matong.egg'), ["matong_box3"], "matong_box3", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_xishoupen.egg'), ["xishoupen"], "xishoupen", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Ver6.0_yaoshui.egg'), ["yaoshui"], "yaoshui", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_Exit.egg'), ["Scene1_Exit"], "Scene1_Exit", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_wallword_1.egg'), ["Scene1_wallword_1"], "Scene1_wallword_1", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_wallword_2.egg'), ["Scene1_wallword_2"], "Scene1_wallword_2", True) self.goodmanager.AddGoods( loader.loadModel('res/models/Scene1_MusicBox.egg'), ["MusicBox"], "MusicBox", True) self.goodmanager.GoodsIta["toilet_door"] = Door( Vec3(305, -762.5, 100), "toilet_door", 'res/models/Scene1_Ver6.0_toilet_door.egg', 0, Door.In) self.goodmanager.GoodsIta["yaoshui"].Node.setPos(0, -350, 0) self.goodmanager.GoodsIta['MusicBox'].Node.setPos(400, 200, 90) self.goodmanager.GoodsIta['MusicBox'].Node.setHpr(-90, 0, 0) self.goodmanager.GoodsIta['MusicBox'].Node.setScale(1.5) def itemCollision(self, model, name, radius): nodePath = NodePath(name) node = CollisionNode(name) node.addSolid(CollisionSphere(20, 0, radius, radius)) solid = model.attachNewNode(node) nodePath.reparentTo(model) solid.show() base.cTrav.addCollider(solid, base.pusher) base.pusher.addCollider(solid, nodePath, base.drive.node()) def initPlayer(self): """ loads the player and creates all the controls for him""" self.node = Player(self.goodmanager, self.menu, self) # self.enemy = Enemy(self.node) self.goodmanager.GoodsIta["enemy"] = Enemy(self.node) self.goodmanager.GoodsIta["enemy"].state = 1 def pauseGame(self): props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.menu.selectDialog.hide() self.gameState = 'pause' self.node.state = 'pause' self.node.endTask() self.node.erosionFrame.hide() self.node.currentItemFrame.hide() base.accept('escape', self.escapeEvent) base.accept('b', self.menu.nothing) self.menu.pauseFrame.show() def escapeEvent(self): self.menu.pauseFrame.hide() self.node.state = '' self.node.initTask() self.node.erosionFrame.show() self.node.currentItemFrame.show() base.accept('escape', self.pauseGame) base.accept('b', self.openBag) props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) def SetLight(self): render.setLightOff() alight = AmbientLight('alight') alnp = render.attachNewNode(alight) alight.setColor(LVector4(0.1, 0.1, 0.1, 1)) #render.setLight(alnp) plight = PointLight('plight') plight.setColor(VBase4(3, 3, 3, 1)) plight.setAttenuation(Point3(0.1, 0.1, 0)) plnp = render.attachNewNode(plight) plnp.setPos(0, 0, 200) render.setLight(plnp) plight = PointLight('plight') plight.setColor(VBase4(1, 1, 1, 1)) plight.setAttenuation(Point3(0.10, 0.1, 0)) plnp = render.attachNewNode(plight) plnp.setPos(333, -900, 217) render.setLight(plnp) plight = PointLight('plight') plight.setColor(VBase4(1, 1, 1, 1)) plight.setAttenuation(Point3(0.10, 0.1, 0)) plnp = render.attachNewNode(plight) plnp.setPos((-438.104, 377.736, 400)) render.setLight(plnp) def makeFilterBuffer(self, srcbuffer, name, sort, prog): blurBuffer = base.win.makeTextureBuffer(name, 512, 512) blurBuffer.setSort(sort) blurBuffer.setClearColor(LVector4(1, 0, 0, 1)) blurCamera = base.makeCamera2d(blurBuffer) blurScene = NodePath("new Scene") blurCamera.node().setScene(blurScene) shader = loader.loadShader(prog) card = srcbuffer.getTextureCard() card.reparentTo(blurScene) card.setShader(shader) return blurBuffer def glowFilter(self): glowShader = loader.loadShader("shaders/glowShader.sha") # dlight = DirectionalLight('dlight') # alight = AmbientLight('alight') # dlnp = render.attachNewNode(dlight) # alnp = render.attachNewNode(alight) # dlight.setColor(LVector4(0.3, 0.3, 0.3, 1)) # alight.setColor(LVector4(0.8, 0.8, 0.8, 1)) # dlnp.setHpr(0, -60, 0) # render.setLight(dlnp) # render.setLight(alnp) # create the glow buffer. This buffer renders like a normal scene, # except that only the glowing materials should show up nonblack. glowBuffer = base.win.makeTextureBuffer("Glow scene", 1024, 768) glowBuffer.setSort(-3) glowBuffer.setClearColor(LVector4(0, 0, 0, 1)) # We have to attach a camera to the glow buffer. The glow camera # must have the same frustum as the main camera. As long as the aspect # ratios match, the rest will take care of itself. self.glowCamera = base.makeCamera(glowBuffer, lens=base.cam.node().getLens()) # Tell the glow camera to use the glow shader tempnode = NodePath(PandaNode("temp node")) tempnode.setShader(glowShader) self.glowCamera.node().setInitialState(tempnode.getState()) self.glowCamera.node().setCameraMask(BitMask32.bit(0)) # set up the pipeline: from glow scene to blur x to blur y to main # window. blurXBuffer = self.makeFilterBuffer(glowBuffer, "Blur X", -2, "shaders/XBlurShader.sha") blurYBuffer = self.makeFilterBuffer(blurXBuffer, "Blur Y", -1, "shaders/YBlurShader.sha") self.finalcard = blurYBuffer.getTextureCard() self.finalcard.reparentTo(render2d) Attrib = ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_incoming_alpha) self.finalcard.setAttrib(Attrib) base.bufferViewer.setPosition("llcorner") base.bufferViewer.setLayout("hline") base.bufferViewer.setCardSize(0.652, 0) base.accept("tab", self.toggleGlow) self.glowOn = False def limitGlow(self, task): if task.time < 5: return task.cont else: self.glowOn = False self.finalcard.reparentTo(hidden) self.goodmanager.GoodsIta["box"].CloseHighLight() self.goodmanager.GoodsIta["yaoshui"].CloseHighLight() self.goodmanager.GoodsIta["MusicBox"].CloseHighLight() self.goodmanager.GoodsIta["matong_box3"].CloseHighLight() self.goodmanager.GoodsIta["Scene1_Exit"].CloseHighLight() self.goodmanager.GoodsIta["Scene1_wallword_1"].CloseHighLight() self.goodmanager.GoodsIta["Scene1_wallword_2"].CloseHighLight() self.goodmanager.GoodsIta["enemy"].CloseHighLight() self.goodmanager.GoodsIta["xishoupen"].CloseHighLight() return task.done def toggleGlow(self): self.showskillpattern("eyepattern") if self.glowOn: return self.glowOn = True taskMgr.add(self.limitGlow, "limitGlow") if self.node.EROSION + 10 > 100: self.node.EROSION = 100 else: self.node.EROSION += 10 self.toggleGlowSound = loader.loadSfx("res/sounds/Raise3.mp3") self.toggleGlowSound.play() self.finalcard.reparentTo(render2d) self.goodmanager.GoodsIta["box"].OpenHighLight() self.goodmanager.GoodsIta["yaoshui"].OpenHighLight() self.goodmanager.GoodsIta["MusicBox"].OpenHighLight() self.goodmanager.GoodsIta["matong_box3"].OpenHighLight() self.goodmanager.GoodsIta["Scene1_Exit"].OpenHighLight() self.goodmanager.GoodsIta["Scene1_wallword_1"].OpenHighLight() self.goodmanager.GoodsIta["Scene1_wallword_2"].OpenHighLight() self.goodmanager.GoodsIta["enemy"].OpenHighLight() self.goodmanager.GoodsIta["xishoupen"].OpenHighLight() # if not self.glowOn: # self.finalcard.reparentTo(hidden) # self.goodmanager.GoodsIta["box"].CloseHighLight() # self.goodmanager.GoodsIta["yaoshui"].CloseHighLight() # self.goodmanager.GoodsIta["MusicBox"].CloseHighLight() # self.goodmanager.GoodsIta["matong_box3"].CloseHighLight() # self.goodmanager.GoodsIta["Scene1_Exit"].CloseHighLight() # self.goodmanager.GoodsIta["Scene1_wallword_1"].CloseHighLight() # self.goodmanager.GoodsIta["Scene1_wallword_2"].CloseHighLight() # self.goodmanager.GoodsIta["enemy"].CloseHighLight() # self.goodmanager.GoodsIta["xishoupen"].CloseHighLight() # else: # self.finalcard.reparentTo(render2d) # self.goodmanager.GoodsIta["box"].OpenHighLight() # self.goodmanager.GoodsIta["yaoshui"].OpenHighLight() # self.goodmanager.GoodsIta["MusicBox"].OpenHighLight() # self.goodmanager.GoodsIta["matong_box3"].OpenHighLight() # self.goodmanager.GoodsIta["Scene1_Exit"].OpenHighLight() # self.goodmanager.GoodsIta["Scene1_wallword_1"].OpenHighLight() # self.goodmanager.GoodsIta["Scene1_wallword_2"].OpenHighLight() # self.goodmanager.GoodsIta["enemy"].OpenHighLight() # self.goodmanager.GoodsIta["xishoupen"].OpenHighLight() # self.node.EROSION += 10 # #print self.goodmanager.staticGoods['wall'].Node # # self.glowOn = not (self.glowOn) def initMania(self): base.accept("space", self.mania) self.maniaState = False def mania(self): self.showskillpattern("maniapattern") if not self.maniaState: self.node.speed *= 1.4 self.maniaState = True if self.node.EROSION + 10 > 100: self.node.EROSION = 100 else: self.node.EROSION += 10 taskMgr.remove("fadeSpeed") taskMgr.add(self.fadeSpeed, "fadeSpeed") def fadeSpeed(self, task): if task.time < 10: return task.cont else: self.node.speed /= 1.4 self.maniaState = False return task.done def setupskillpattern(self): self.eyepattern = OnscreenImage(image="res/skill_icon/eye-white.png", pos=(-1.2, 1, -0.8)) self.eyepattern.setTransparency(TransparencyAttrib.MAlpha) self.eyepattern.setScale(0.1) self.eyepattern.setSa(0.8) self.eyepattern.hide() self.maniapattern = OnscreenImage( image="res/skill_icon/mania-white.png", pos=(-1.2 + 0.3, 1, -0.8)) self.maniapattern.setTransparency(TransparencyAttrib.MAlpha) self.maniapattern.setScale(0.1) self.maniapattern.setSa(0.8) self.maniapattern.hide() self.screen_patternArray = {} self.screen_patternArray["eyepattern"] = [self.eyepattern, False, 5.0] self.screen_patternArray["maniapattern"] = [ self.maniapattern, False, 5.0 ] self.patterntask = False def showskillpattern(self, patternname): self.screen_patternArray[patternname][2] = 10. self.screen_patternArray[patternname][1] = True self.screen_patternArray[patternname][0].show() if self.patterntask == False: taskMgr.add(self.showskillpatterntask, "showskillpatterntask") def showskillpatterntask(self, task): num = 0 for key in self.screen_patternArray: if self.screen_patternArray[key][1] == True: self.screen_patternArray[key][2] -= globalClock.getDt() if self.screen_patternArray[key][2] < 5.: if sin(self.screen_patternArray[key][2] * pi * 5) > 0: self.screen_patternArray[key][0].setSa(0) else: self.screen_patternArray[key][0].setSa(0.8) self.screen_patternArray[key][0].setPos( -1.2 + num * 0.3, 1, -0.8) if self.screen_patternArray[key][2] < 0: self.screen_patternArray[key][1] = False self.screen_patternArray[key][0].hide() self.screen_patternArray[key][0].setSa(0.8) num += 1 if num > 0: return task.cont self.patterntask = False return
def __init__(self): self.points = 0 self.timersecs = 60 self.duration = 0 self.ncandy = 0 self.runralph = 0 self.gamepause = 0 self.picked = 0 self.bg = loader.loadSfx("./sounds/faster_than_all.ogg") self.bg.setLoop(True) self.bg.setVolume(0.3) self.bgcount = loader.loadSfx("./sounds/panic.ogg") self.bgcount.setLoop(False) self.bgcount.setVolume(1) self.playBG() butaicon = OnscreenImage(image = './GUI/smiley1.png', pos = (0.66, 0, 0.85)) butaicon.setScale(0.12,0,0.11) butaicon.setTransparency(TransparencyAttrib.MAlpha) tpButa = TextProperties() tpButa.setTextColor(1,1,1,1) butafont = loader.loadFont('./GUI/fonts/butafont.ttf') tpButa.setFont(butafont) tpButa.setShadow(0.05, 0.05) tpButa.setShadowColor(0,0,0,1) tpMgr = TextPropertiesManager.getGlobalPtr() tpMgr.setProperties("buta", tpButa) tpMenu = TextProperties() tpMenu.setTextColor(1,0.6,0.75,1) tpMenu.setFont(butafont) tpMenu.setShadow(0.05, 0.05) tpMenu.setShadowColor(1,0.8,0.9,1) tpMgr.setProperties("menu", tpMenu) #Add candy number self.candy = TextNode('Candy Number') self.candy.setText("\1buta\1x "+str(self.ncandy)+" \2") self.candynumNP = aspect2d.attachNewNode(self.candy) self.candynumNP.setScale(0.18) self.candynumNP.setPos(0.79, 0, 0.8) #Add points number self.ptnum = TextNode('Pt Number') self.ptnum.setText("\1buta\1Pt. "+str(self.points)+" \2") self.ptnumNP = aspect2d.attachNewNode(self.ptnum) self.ptnumNP.setScale(0.18) self.ptnumNP.setPos(-1.31, 0, 0.8) #Add record number recordfile = open("candyrecord.dat","r") self.record = int(recordfile.read()) recordfile.close() self.rcnum = TextNode('Record Number') self.rcnum.setText("\1buta\1Record \n"+str(self.record)+" \2") self.rcnumNP = aspect2d.attachNewNode(self.rcnum) self.rcnumNP.setScale(0.11) self.rcnumNP.setPos(-1.38, 0, 0.65) self.rcnum.setWordwrap(4.5) #Add timer self.timer = TextNode('Timer') self.timer.setText("\1buta\1 "+str(self.timersecs/60)+":00 \2") self.timerNP = aspect2d.attachNewNode(self.timer) self.timerNP.setScale(0.18) self.timerNP.setPos(0.9,0,-0.93) self.itemset = {"musicon":loader.loadTexture('./GUI/soundon.png'),"musicoff":loader.loadTexture('./GUI/soundoff.png'),} self.itembox = DirectButton(image=self.itemset["musicon"], scale=.10, pos=(-1.19,0,-0.82), relief=None, state=DGG.NORMAL, command=self.changemusic, clickSound=None) self.itembox.setScale(0.15) self.itembox.setTransparency(TransparencyAttrib.MAlpha)
class Myapp(ShowBase): def __init__(self): ShowBase.__init__(self) self.accept("escape", sys.exit) self.accept("mouse1", self.startShoot) self.accept("mouse1-up", self.endShoot) base.disableMouse() props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.heading = 0 self.pitch = 0 self.mousex = 0 self.mousey = 0 self.flight = [] self.cs_flight = [] self.explosion = [] self.score = 0 self.life = 20 self.m1down = 1 self.environ = self.loader.loadModel("models/terrain") self.environ.reparentTo(self.render) self.environ.setScale(0.8, 0.8, 0.8) self.environ.setPos(0, 0, -10) self.environ.setHpr(-90, 0, 0) for k in range(0, 5): self.flight.append(self.loader.loadModel("models/spitfire")) self.flight[k].reparentTo(self.render) self.flight[k].setScale(0.1, 0.1, 0.1) self.flight[k].setPos(randint(-40, 20), randint(300, 400), randint(10, 20)) self.cs_flight.append(self.flight[k].attachNewNode( CollisionNode(str(k)))) self.cs_flight[k].node().addSolid(CollisionSphere(0, 0, 5, 30)) #self.cs_flight[k].show() self.flight[k].setCollideMask(BitMask32.bit(1)) self.bullets = [] self.crosshair = OnscreenImage(image='models/crosshair.png', pos=(0, 0, 0)) self.crosshair.setScale(0.03, 0.03, 0.03) self.crosshair.setTransparency(TransparencyAttrib.MAlpha) self.title = OnscreenText(" ", style=1, fg=(1, 1, 1, 1), pos=(0, 0), scale=.07) self.taskMgr.add(self.mouse_control, "mouse_control") self.taskMgr.add(self.update_flight, "update_flight") self.picker = CollisionTraverser() self.pq = CollisionHandlerQueue() self.pickerNode = CollisionNode('mouseRay') self.pickerNP = camera.attachNewNode(self.pickerNode) self.pickerNode.setFromCollideMask(BitMask32.bit(1)) self.pickerRay = CollisionRay() self.pickerNode.addSolid(self.pickerRay) self.picker.addCollider(self.pickerNP, self.pq) self.gun = OnscreenImage(image='models/gun.png', pos=(0.24, 0, -0.54)) self.gun.setScale(1, 0.6, 0.6) self.gun.setTransparency(TransparencyAttrib.MAlpha) self.sound = base.loader.loadSfx("models/sound.ogg") base.setFrameRateMeter(True) def mouse_control(self, task): md = base.win.getPointer(0) x = md.getX() y = md.getY() if base.win.movePointer(0, 100, 100): self.heading = self.heading - (x - 100) * 0.1 self.pitch = self.pitch - (y - 100) * 0.1 if (self.pitch < -10): self.pitch = -10 if (self.pitch > 20): self.pitch = 20 if (self.heading < -40): self.heading = -40 if (self.heading > 30): self.heading = 30 base.camera.setHpr(self.heading, self.pitch, 0) return Task.cont def update_flight(self, task): i = 0 while (i < len(self.flight)): x = self.flight[i].getY() if x < -3: self.flight[i].setPos(randint(-40, 20), randint(200, 300), randint(10, 20)) if (self.life == 0): self.game_end() else: self.life -= 1 else: x -= 0.7 self.flight[i].setPos(self.flight[i].getX(), x, self.flight[i].getZ()) i += 1 self.title.destroy() self.title = OnscreenText(text='Life: ' + str(self.life) + ' Score: ' + str(self.score), style=1, fg=(1, 1, 1, 1), pos=(-1.5, 0.9), scale=.07) return Task.cont def removeBullet(self, task): if len(self.bullets) < 1: return self.bulletNP = self.bullets.pop(0) self.bulletNP.removeNode() return task.done def shootBullet(self, task): self.ball = self.loader.loadModel("models/bullet") self.ball.reparentTo(self.render) self.ball.setScale(0.02, 0.02, 0.02) self.ball.setPos(0, 0, 0) self.bullets.append(self.ball) self.bt = ProjectileInterval(self.ball, startPos=Point3(0, 0, -5), endPos=Point3(self.heading * -2, 100, self.pitch * 2), duration=0.3, gravityMult=-2) self.bt.start() self.taskMgr.doMethodLater(0.3, self.removeBullet, 'removeBullet') self.hit_flight() if (self.m1down): self.taskMgr.doMethodLater(0.2, self.shootBullet, 'shootbullet') def hit_flight(self): if base.mouseWatcherNode.hasMouse(): mpos = base.mouseWatcherNode.getMouse() self.pickerRay.setFromLens(base.camNode, 0, 0) self.picker.traverse(render) if self.pq.getNumEntries() > 0: self.pq.sortEntries() pickedObj = self.pq.getEntry(0).getIntoNodePath() if pickedObj.getName() != 'CINEMA4D_Mesh': k = int(pickedObj.getName()) self.score += 1 self.explode(self.flight[k].getX(), self.flight[k].getY(), self.flight[k].getZ()) self.flight[k].setPos(randint(-40, 20), randint(200, 300), randint(10, 20)) def game_end(self): self.crosshair.remove() self.gov = OnscreenText("Game Over", style=1, fg=(1, 1, 1, 1), pos=(0, 0), scale=0.07) self.taskMgr.remove("mouse_control") self.taskMgr.remove("update_flight") #self.explode(20,20,20) p = open('score.txt', 'r') score = p.readline() p.close() if (self.score > int(score)): p = open('score.txt', 'w') p.write(str(self.score)) p.close() def explode(self, x, y, z): k = len(self.explosion) self.explosion.append(loader.loadModel('explosion/flip.egg')) self.explosion[k].reparentTo(self.render) self.explosion[k].setPos(x, y, z) self.explosion[k].setScale(5, 5, 5) self.taskMgr.doMethodLater(0.6, self.removeExplosion, 'removeExp') def removeExplosion(self, task): if len(self.explosion) < 1: return self.explosion[0].removeNode() del self.explosion[0] return task.done def endShoot(self): self.m1down = 0 self.sound.stop() def startShoot(self): self.sound.play() self.m1down = 1 self.taskMgr.doMethodLater(0.1, self.shootBullet, 'shootbullet')
class World(ShowBase): def __init__(self): base.win.setClearColor(Vec4(0,0,0,1)) # Game state variables self.showHelp = False self.showMenu = True self.isLevel1 = False self.isLevel2 = False self.characterClass = 0 self.inst1 = addInstructions(0.95, "[ESC]: Quit") self.inst2 = addInstructions(0.90, "[Left Arrow]: Rotate Left") self.inst3 = addInstructions(0.85, "[Right Arrow]: Rotate Right") self.inst4 = addInstructions(0.80, "[Up Arrow]: Run Forward") self.inst5 = addInstructions(0.75, "[Down Arrow]: Run Backward") self.inst6 = addInstructions(0.70, "[Shift + Up Arrow]: Speed up Running Forward") self.inst7 = addInstructions(0.65, "[Shift + Down Arrow]: Speed up Running Backward") self.inst8 = addInstructions(0.60, "[CTRL]: Hit the Enemy") self.inst9 = addInstructions(0.55, "[Space]: Jump") self.inst10 = addInstructions(0.50, "[D]: Show / Hide Debug") self.inst11 = addInstructions(0.45, "[A]: Rotate Camera Left") self.inst12 = addInstructions(0.40, "[S]: Rotate Camera Right") self.inst13 = addInstructions(0.35, "[H]: Show/ Hide Help") self.inst14 = addInstructions(0.30, "[Enter]: Show/ Hide Menu") inputState.watchWithModifiers('forward', 'arrow_up') inputState.watchWithModifiers('reverse', 'arrow_down') inputState.watchWithModifiers('turnLeft', 'arrow_left') inputState.watchWithModifiers('turnRight', 'arrow_right') inputState.watchWithModifiers('rotateCamLeft', 'a') inputState.watchWithModifiers('rotateCamRight', 's') inputState.watchWithModifiers('jump', 'space') inputState.watchWithModifiers('speedUp', 'shift') inputState.watchWithModifiers('hit', 'control') inputState.watchWithModifiers('debug', 'd') inputState.watchWithModifiers('help', 'h') inputState.watchWithModifiers('menu', 'enter') self.accept("escape", sys.exit) #Background music self.mySound = base.loader.loadSfx("sound/Ancient Egyptian Music - Dark Pyramid.mp3") #Menu self.imageObject = OnscreenImage(image = 'models/menu.jpg', pos = (0, 0, 0)) self.imageObject.setScale(2,1,1) self.b1 = DirectButton(text = "Play Level 1", scale=.07, command=self.setLevel1, pos=(0,0,0.2),text_shadow =(0,0,0,0.9), text_bg=(0, 0, 0, 1),text_fg = (1,1,1,1)) self.b2 = DirectButton(text = "Play Level 2", scale=.07, command=self.setLevel2, pos=(0.0,0,0),text_shadow =(0,0,0,0.9), text_bg=(0, 0, 0, 1),text_fg = (1,1,1,1)) self.b3 = DirectButton(text = "Exit", scale=.07, command=sys.exit, pos=(0,0,-0.2),text_shadow =(0,0,0,0.9),text_bg=(0, 0, 0, 1),text_fg = (1,1,1,1)) taskMgr.add(self.update, 'updateMain') base.disableMouse() # Create some lighting ambientLight = AmbientLight("ambientLight") ambientLight.setColor(Vec4(.3, .3, .3, 1)) directionalLight = DirectionalLight("directionalLight") directionalLight.setDirection(Vec3(-5, -5, -5)) directionalLight.setColor(Vec4(1, 1, 1, 1)) directionalLight.setSpecularColor(Vec4(1, 1, 1, 1)) render.setLight(render.attachNewNode(ambientLight)) render.setLight(render.attachNewNode(directionalLight)) def setLevel1(self): if self.isLevel1 == True or self.isLevel2 == True: self.characterClass.removeAll() self.showMenu = False self.characterClass = Character() base.camera.setPos(self.characterClass.characterNP.getX(),self.characterClass.characterNP.getY()+15,5) base.camera.setHpr(self.characterClass.characterNP.getHpr()) base.camera.lookAt(self.characterClass.characterNP) self.isLevel1 = True self.isLevel2 = False def setLevel2(self): if self.isLevel1 == True or self.isLevel2 == True: self.characterClass.removeAll() self.showMenu = False self.characterClass = Character2() base.camera.setPos(self.characterClass.characterNP.getX(),self.characterClass.characterNP.getY()+15,5) base.camera.setHpr(self.characterClass.characterNP.getHpr()) base.camera.lookAt(self.characterClass.characterNP) self.isLevel2 = True self.isLevel1 = False def update(self, task): if self.isLevel1 == True and self.characterClass != 0: if self.characterClass.nextLevel == True: self.setLevel2() if self.isLevel2 == True and self.characterClass != 0: if self.characterClass.nextLevel == True: self.setLevel1() if inputState.isSet('help'): if self.showHelp == True: self.showHelp = False else: self.showHelp = True if inputState.isSet('menu'): if self.showMenu == True: self.showMenu = False else: self.showMenu = True if self.showHelp == True: self.inst1.show() self.inst2.show() self.inst3.show() self.inst4.show() self.inst5.show() self.inst6.show() self.inst7.show() self.inst8.show() self.inst9.show() self.inst10.show() self.inst11.show() self.inst12.show() self.inst13.show() self.inst14.show() else: self.inst1.hide() self.inst2.hide() self.inst3.hide() self.inst4.hide() self.inst5.hide() self.inst6.hide() self.inst7.hide() self.inst8.hide() self.inst9.hide() self.inst10.hide() self.inst11.hide() self.inst12.hide() self.inst13.hide() self.inst14.hide() if self.showMenu == True: self.imageObject.show() self.b1.show() self.b2.show() self.b3.show() if self.characterClass != 0: self.characterClass.bar.setPos(2,2,2) self.characterClass.frame.setPos(2,2,2) self.characterClass.item.setPos(2,2,2) else: self.imageObject.hide() self.b1.hide() self.b2.hide() self.b3.hide() if self.characterClass != 0: self.characterClass.bar.setPos(0.8,0.5,0.9) self.characterClass.frame.setPos(0.7,0.5,0.8) self.characterClass.item.setPos(0.9,0.5,0.8) if self.mySound.status() == self.mySound.READY: self.mySound.play() self.mySound.setVolume(0.9) if self.isLevel1 == True or self.isLevel2 == True: dt = globalClock.getDt() self.characterClass.processInput(dt) self.characterClass.models.world.doPhysics(dt, 100, 1./180.) # Create a floater object. We use the "floater" as a temporary # variable in a variety of calculations. self.characterClass.floater = NodePath(PandaNode("floater")) self.characterClass.floater.reparentTo(render) if self.characterClass.characterNP.getZ() != 0: base.camera.setZ(self.characterClass.characterNP.getZ()+3) # If the camera is too far from ralph, move it closer. # If the camera is too close to ralph, move it farther. camvec = self.characterClass.characterNP.getPos() - base.camera.getPos() camvec.setZ(0) camdist = camvec.length() camvec.normalize() if (camdist > 15.0): base.camera.setPos(base.camera.getPos() + camvec*(camdist-15)) camdist = 15.0 if (camdist < 5.0): base.camera.setPos(base.camera.getPos() - camvec*(5-camdist)) camdist = 5.0 self.characterClass.floater.setPos(self.characterClass.characterNP.getPos()) self.characterClass.floater.setZ(self.characterClass.characterNP.getZ() + 2.0) base.camera.lookAt(self.characterClass.floater) return task.cont
class World(DirectObject): def __init__(self): self.start = False self.mainScreen = OnscreenImage(image = 'mainScreen.png') #self.mainScreen.setScale(1.25) self.accept("mouse1", self.begin) def begin(self): if self.start == False: self.start = True self.mainScreen.destroy() self.__init__1() def __init__1(self): #load physics base.enableParticles() #create a traverser base.cTrav = CollisionTraverser() self.cevent = CollisionHandlerEvent() self.cevent.addInPattern('into-%in') self.cevent.addOutPattern('outof-%in') #load all the models self.w_terrain = Terrain() self.p_bike = PlayerBike(base.cTrav) #disable mouse base.disableMouse() self.dead = False self.deadCount = 0 taskMgr.add(self.gameOverDead, 'deadTask') self.win = False self.winCount = 0 taskMgr.add(self.gameOverWin, 'winTask') #load and play background sound backgroundSound = base.loader.loadSfx('Modern_Battlefield.mp3') backgroundSound.setLoop(True) backgroundSound.play() #parent the camera to the player bike and offset the initial location base.camera.reparentTo(self.p_bike.bike) base.camera.setZ(6) base.camera.setP(-8) base.camera.setY(-32) #set up accept tasks #close the game self.accept("escape", sys.exit) #handle movement self.accept("arrow_up", self.p_bike.setDirection, ["forward", 1]) self.accept("arrow_right", self.p_bike.setDirection, ["right", 1]) self.accept("arrow_left", self.p_bike.setDirection, ["left", 1]) self.accept("arrow_up-up", self.p_bike.setDirection, ["forward", 0]) self.accept("arrow_right-up", self.p_bike.setDirection, ["right", 0]) self.accept("arrow_left-up", self.p_bike.setDirection, ["left", 0]) #handle shooting #self.accept("space", self.p_bike.setShoot, [1]) #self.accept("space-up", self.p_bike.setShoot, [0]) self.accept("z", self.p_bike.setShoot, [1]) self.accept("z-up", self.p_bike.setShoot, [0]) #powerup collisions self.accept("p_bike-powerup1", self.powerupCollision) self.accept("p_bike-powerup2", self.powerupCollision) self.accept("p_bike-powerup3", self.powerupCollision) self.accept("p_bike-powerup4", self.powerupCollision) self.accept("p_bike-powerup5", self.powerupCollision) #bullet collision with player self.accept("p_bike-bullet", self.bulletCollision) self.accept("e_bike-bullet", self.bulletCollision) #setup basic environment lighting self.ambientLight = AmbientLight("ambientLight") self.ambientLight.setColor((.25, .25, .25, 1)) self.ambientLightNP = render.attachNewNode(self.ambientLight) render.setLight(self.ambientLightNP) render.setShaderAuto() self.playerHealth = OnscreenImage(image = 'PlayerHealthBar.png') self.playerHealth.setX(-1) self.playerHealth.setZ(-1.95) #enemy health self.enemyHealth = OnscreenImage(image = 'EnemyHealthBar.png') self.enemyHealth.setX(1) self.enemyHealth.setZ(-1.95) self.initAI() self.e_bikes = [self.addEnemy()] base.cTrav.addCollider(self.p_bike.cNodePath1, self.e_bikes[0].cevent) def gameOverDead(self, task): if self.dead == True: self.deadCount += 1 if self.deadCount > 200: self.gameOver = OnscreenImage(image = 'gameOver.png') self.gameOver.setScale(1.35) return Task.cont def gameOverWin(self, task): if self.win == True: self.winCount += 1 if self.winCount > 200: self.gameOverWin = OnscreenImage(image = 'win.png') self.gameOverWin.setScale(1.35) return Task.cont def powerupCollision(self, cEntry): #check powerup1 if cEntry.getIntoNodePath() == self.w_terrain.cPowerNode1Path: self.w_terrain.powerUp1 = False self.p_bike.invin = True #print('I WIN') #check powerup2 elif cEntry.getIntoNodePath() == self.w_terrain.cPowerNode2Path: self.w_terrain.powerUp2 = False self.p_bike.shotgun = True self.p_bike.p_up_timer = 0 #check powerup3 elif cEntry.getIntoNodePath() == self.w_terrain.cPowerNode3Path: self.w_terrain.powerUp3 = False self.p_bike.shotgun = True self.p_bike.p_up_timer = 0 #check power4 elif cEntry.getIntoNodePath() == self.w_terrain.cPowerNode4Path: self.w_terrain.powerUp4 = False self.p_bike.health_up = True #check powerup5 elif cEntry.getIntoNodePath() == self.w_terrain.cPowerNode5Path: self.w_terrain.powerUp5 = False self.p_bike.health_up = True cEntry.getIntoNodePath().remove() def bulletCollision(self, cEntry): #check which bike is being hit if self.p_bike.invin == False and (cEntry.getFromNodePath() == self.p_bike.cNodePath1 or cEntry.getFromNodePath() == self.p_bike.cNodePath1 or cEntry.getFromNodePath() == self.p_bike.cNodePath3): #print('player bike!') self.p_bike.hp -= 1 self.playerHealth.setX(self.playerHealth.getX() - .1) #print('player hp:', self.p_bike.hp) if self.p_bike.hp <= 0: #kill player bike and reset camera taskMgr.remove("moveTask") taskMgr.remove("bulletTask") taskMgr.remove("shootTask") taskMgr.remove("powerupTask") x = base.camera.getX() + self.p_bike.bike.getX() y = base.camera.getY() + self.p_bike.bike.getY() h = self.p_bike.bike.getH() angle = deg2Rad(self.p_bike.bike.getH()) dy = -math.cos(angle) dx = math.sin(angle) dx = -dx * 32 dy = -dy * 32 base.camera.reparentTo(render) base.camera.setPos(0,0,0) base.camera.setPosHpr( self.p_bike.bike.getX() - dx, self.p_bike.bike.getY() - dy, 7, self.p_bike.bike.getH(), -8, 0) x = self.p_bike.bike.getX() y = self.p_bike.bike.getY() z = self.p_bike.bike.getZ() h = self.p_bike.bike.getH() self.p_bike.bike.delete() self.death_player = Actor("moto2_deadActor.egg", {"death":"moto2_deadAnim.egg"}) self.death_player.reparentTo(render) self.death_player.setPos(x,y,z) self.death_player.setH(h) self.animcontrol = self.death_player.getAnimControl('death') self.death_player.play("death") self.dead = True #UNCOMMENT WHEN ENEMY BIKES ARE FIXED else: for enemy in self.e_bikes: #print('in enemy list') #print(cEntry.getFromNodePath()) #print(cEntry.getFromNodePath().getParent()) #print(cEntry.getFromNodePath().getParent()) #print(enemy.cNodePath) #print(cEntry.getIntoNodePath()) #print(cEntry.getIntoNodePath().getParent()) if cEntry.getFromNodePath() == enemy.cNodePath1 or cEntry.getFromNodePath() == enemy.cNodePath2 or cEntry.getFromNodePath() == enemy.cNodePath3: #print('enemy hit') enemy.hp -= 1 self.enemyHealth.setX(self.enemyHealth.getX() + .1) #print('enemy hp:', enemy.hp) if enemy.hp <= 0: #print('Game Over. You Win!') #kill enemy bike x = enemy.cNodePath.getParent().getX() y = enemy.cNodePath.getParent().getY() z = enemy.cNodePath.getParent().getZ() h = enemy.cNodePath.getParent().getH() #print(x,y,z,h) enemy.cNodePath.getParent().remove() self.death_enemy = Actor("moto1_deadActor.egg", {"death":"moto1_deadAnim.egg"}) self.death_enemy.reparentTo(render) self.death_enemy.setPos(x,y,z) self.death_enemy.setH(h) self.death_enemy.play("death") self.win = True break #destroy the bullet for i in range(len(self.p_bike.bullet.bulletList)): if cEntry.getIntoNodePath().getParent() == self.p_bike.bullet.bulletList[i]: #print('erased') self.p_bike.bullet.bulletTime.remove(self.p_bike.bullet.bulletTime[i]) self.p_bike.bullet.bulletList.remove(self.p_bike.bullet.bulletList[i]) cEntry.getIntoNodePath().getParent().remove() break #UNCOMMENT WHEN ENEMY BIKES ARE FIXED #cycle through the enemy bullets for enemy in self.e_bikes: for i in range(len(enemy.bullet.bulletList)): if cEntry.getIntoNodePath().getParent() == enemy.bullet.bulletList[i]: #print('erased') enemy.bullet.bulletTime.remove(enemy.bullet.bulletTime[i]) enemy.bullet.bulletList.remove(enemy.bullet.bulletList[i]) cEntry.getIntoNodePath().getParent().remove() break def initAI(self): self.AIworld = AIWorld(render) #self.AIworld.addObstacle(self.w_terrain.wall_terrain) #self.AIworld.addObstacle(self.w_terrain.cNodePathWall1) #self.AIworld.addObstacle(self.w_terrain.cNodePathWall2) #self.AIworld.addObstacle(self.w_terrain.cNodePathWall3) #self.AIworld.addObstacle(self.w_terrain.cNodePathWall4) #self.AIworld.addObstacle(self.w_terrain.bounds) #AI World update taskMgr.add(self.AIUpdate,"AIUpdate") def AIUpdate(self, task): self.AIworld.update() for i in self.e_bikes: i.update() i.bike.setHpr(i.bike.getH(), 0, i.bike.getR()) #i.bike.setZ(max(0.0, i.bike.getZ())) #i.bike.setZ(0.0) #print i.bike.getHpr() return Task.cont def addEnemy(self): enemy = EnemyBike(base.cTrav, self.cevent) enemy.target = self.p_bike enemy.setMode('scan') self.AIworld.addAiChar(enemy.AIchar) base.cTrav.addCollider(self.p_bike.cNodePath1, enemy.cevent) return enemy
class CameraHandler(): def __init__(self, character): self.character = character # Setup mouse base.disableMouse() hideMouse(True) self.mouseSensitivity = 0.1 base.taskMgr.doMethodLater(0.1, self.prepareCameraTask, "prepare-camera") # Setup camera base.camera.reparentTo(self.character.node) base.camera.setPos(0, 0, 0) base.camera.lookAt(0, 1, 0) # Create target self.target = OnscreenImage(image="media/target.png", pos=(0, 0, 0)) self.target.setTransparency(TransparencyAttrib.MAlpha) self.target.setScale(0.1) self.target.setSa(0.5) # Create overlay self.overlayCard = CardMaker("overlayCard") self.overlayCard.setFrameFullscreenQuad() self.overlay = base.render2d.attachNewNode(self.overlayCard.generate()) self.overlay.setTransparency(TransparencyAttrib.MAlpha) self.overlay.setColor(0, 0, 0, 0) # Setup interval sequences self.shakeSequence = None self.flashSequence = None def shake(self, amplitude=(1, 0, 0), duration=1.0, swings=1): if self.shakeSequence != None: self.shakeSequence.finish() self.shakeSequence = Sequence() swings = int(swings) duration = float(duration) dt = duration / (swings * 4) ds = Point3(amplitude) for i in range(swings): self.shakeSequence.append(LerpPosInterval(base.camera, dt, ds * -1)) self.shakeSequence.append(LerpPosInterval(base.camera, dt * 2, ds)) self.shakeSequence.append( LerpPosInterval(base.camera, dt, Point3(0, 0, 0))) self.shakeSequence.start() def flash(self, color=(1, 1, 1, 1), duration=1.0, fadeIn=0.2): if self.flashSequence != None: self.flashSequence.finish() self.flashSequence = Sequence() dtIn = float(duration) * fadeIn dtOut = duration - dtIn if dtIn > 0: self.flashSequence.append( LerpColorInterval(self.overlay, dtIn, color)) if dtOut > 0: self.flashSequence.append( LerpColorInterval(self.overlay, dtOut, (0, 0, 0, 0), color)) self.flashSequence.start() def prepareCameraTask(self, task): base.win.movePointer(0, base.win.getXSize() / 2, base.win.getYSize() / 2) base.taskMgr.add(self.controlCameraTask, "camera-control") return task.done def controlCameraTask(self, task): char = self.character.node # Get current mouse location. md = base.win.getPointer(0) x = md.getX() y = md.getY() # Rotate character based on mouse coordinates. if base.win.movePointer(0, base.win.getXSize() / 2, base.win.getYSize() / 2): char.setP( (char.getP() - (y - base.win.getYSize() / 2) * self.mouseSensitivity) % 360) char.setH( (char.getH() - (x - base.win.getXSize() / 2) * self.mouseSensitivity) % 360) # Don't let the camera loop over. Allowed range is 0-90 (up) and 360-270 (down). if char.getP() > 90 and char.getP() < 180: char.setP(90) elif char.getP() < 270 and char.getP() >= 180: char.setP(270) return task.cont
class CameraHandler(): def __init__(self, character): self.character = character # Setup mouse base.disableMouse() hideMouse(True) self.mouseSensitivity = 0.1 base.taskMgr.doMethodLater(0.1, self.prepareCameraTask, "prepare-camera") # Setup camera base.camera.reparentTo(self.character.node) base.camera.setPos(0, 0, 0) base.camera.lookAt(0, 1, 0) # Create target self.target = OnscreenImage(image = "media/target.png", pos = (0, 0, 0)) self.target.setTransparency(TransparencyAttrib.MAlpha) self.target.setScale(0.1) self.target.setSa(0.5) # Create overlay self.overlayCard = CardMaker("overlayCard") self.overlayCard.setFrameFullscreenQuad() self.overlay = base.render2d.attachNewNode(self.overlayCard.generate()) self.overlay.setTransparency(TransparencyAttrib.MAlpha) self.overlay.setColor(0,0,0,0) # Setup interval sequences self.shakeSequence = None self.flashSequence = None def shake(self, amplitude = (1,0,0), duration = 1.0, swings = 1): if self.shakeSequence != None: self.shakeSequence.finish() self.shakeSequence = Sequence() swings = int(swings) duration = float(duration) dt = duration / (swings * 4) ds = Point3(amplitude) for i in range(swings): self.shakeSequence.append(LerpPosInterval(base.camera, dt, ds*-1)) self.shakeSequence.append(LerpPosInterval(base.camera, dt*2, ds)) self.shakeSequence.append(LerpPosInterval(base.camera, dt, Point3(0, 0, 0))) self.shakeSequence.start() def flash(self, color = (1,1,1,1), duration = 1.0, fadeIn = 0.2): if self.flashSequence != None: self.flashSequence.finish() self.flashSequence = Sequence() dtIn = float(duration) * fadeIn dtOut = duration - dtIn if dtIn > 0: self.flashSequence.append(LerpColorInterval(self.overlay, dtIn, color)) if dtOut > 0: self.flashSequence.append(LerpColorInterval(self.overlay, dtOut, (0,0,0,0), color)) self.flashSequence.start() def prepareCameraTask(self, task): base.win.movePointer(0, base.win.getXSize()/2, base.win.getYSize()/2) base.taskMgr.add(self.controlCameraTask, "camera-control") return task.done def controlCameraTask(self, task): char = self.character.node # Get current mouse location. md = base.win.getPointer(0) x = md.getX() y = md.getY() # Rotate character based on mouse coordinates. if base.win.movePointer(0, base.win.getXSize()/2, base.win.getYSize()/2): char.setP((char.getP() - (y - base.win.getYSize()/2)*self.mouseSensitivity) % 360) char.setH((char.getH() - (x - base.win.getXSize()/2)*self.mouseSensitivity) % 360) # Don't let the camera loop over. Allowed range is 0-90 (up) and 360-270 (down). if char.getP() > 90 and char.getP() < 180: char.setP(90) elif char.getP() < 270 and char.getP() >= 180: char.setP(270) return task.cont
class Menu (DirectObject): def __init__(self, cursor): #----------------------------------------------------------------------------------------------------------------------------------------------- #---------------------------------------------------VARIABLE DECLARATION------------------------------------------------------------------------ #----------------------------------------------------------------------------------------------------------------------------------------------- self.title = None self.play = None self.credits = None self.ins = None self.selected = "PLAY" self.pastTime = 0.0 self.oldX = 0.0 self.run = True self.moved = 0.0 #----------------------------------------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------MENU INIT---------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------------------------------------------------- self.title = OnscreenImage("./tex/menu/glooveth.png", (0, 0, -0.25), None, (1.0,1.0,0.25), None, None, 10) self.title.setTransparency(TransparencyAttrib.MAlpha) self.credits = OnscreenImage("./tex/menu/credits.png", (-1.0, 0, -0.75), None, (0.25,1.0,0.125), None, None, 10) self.credits.setTransparency(TransparencyAttrib.MAlpha) self.ins = OnscreenImage("./tex/menu/ins.png", (1.0, 0, -0.75), None, (0.25,1.0,0.125), None, None, 10) self.ins.setTransparency(TransparencyAttrib.MAlpha) self.play = OnscreenImage("./tex/menu/playOver.png", (0, 0, -0.75), None, (0.35,1.0,0.20), None, None, 10) self.play.setTransparency(TransparencyAttrib.MAlpha) # Cursor self.cursor = cursor # Start tasks taskMgr.add(self.taskMenuMovement, 'taskMenuMovement') #end __init__ #----------------------------------------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------FUNCTIONS---------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------------------------------------------------- # It hides the main menu of the game def hide(self): self.title.hide() self.play.hide() self.credits.hide() self.ins.hide() self.run = False #end hide # It shows the main menu of the game def show(self): self.title.show() self.play.show() self.credits.show() self.ins.show() taskMgr.add( self.taskMenuMovement, 'taskMenuMovement' ) self.run = True #end show #----------------------------------------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------TASKS,THREADS------------------------------------------------------------------ #----------------------------------------------------------------------------------------------------------------------------------------------- # Menu interaction def taskMenuMovement(self, task): if( self.run == True ): mpos = self.cursor.getCursorPos() if( (mpos.getX() < -0.33) and (self.oldX >= -0.33 ) ): self.selected = "CREDITS" elif( (mpos.getX() > -0.33) and (self.oldX <= -0.33) ): self.selected = "PLAY" elif( (mpos.getX() < 0.33) and (self.oldX >= 0.33) ): self.selected = "PLAY" elif( (mpos.getX() > 0.33) and (self.oldX <= 0.33) ): self.selected = "INS" # Making bigger the button selected depending on the region of the cursor if( self.selected == "PLAY" ): self.play.setImage("./tex/menu/playOver.png") self.play.setTransparency(TransparencyAttrib.MAlpha) self.play.setScale((0.35,1.0,0.20)) elif( self.selected == "CREDITS" ): self.credits.setImage("./tex/menu/creditsOver.png") self.credits.setTransparency(TransparencyAttrib.MAlpha) self.credits.setScale((0.35,1.0,0.20)) elif( self.selected == "INS" ): self.ins.setImage("./tex/menu/insOver.png") self.ins.setTransparency(TransparencyAttrib.MAlpha) self.ins.setScale((0.35,1.0,0.20)) self.oldX = mpos.getX() # Setting the others to a smaller size if( self.selected == "PLAY" ): self.credits.setImage("./tex/menu/credits.png") self.credits.setTransparency(TransparencyAttrib.MAlpha) self.credits.setScale((0.25,1.0,0.125)) self.ins.setImage("./tex/menu/ins.png") self.ins.setTransparency(TransparencyAttrib.MAlpha) self.ins.setScale((0.25,1.0,0.125)) elif( self.selected == "CREDITS" ): self.play.setImage("./tex/menu/play.png") self.play.setTransparency(TransparencyAttrib.MAlpha) self.play.setScale((0.25,1.0,0.125)) self.ins.setImage("./tex/menu/ins.png") self.ins.setTransparency(TransparencyAttrib.MAlpha) self.ins.setScale((0.25,1.0,0.125)) elif( self.selected == "INS" ): self.play.setImage("./tex/menu/play.png") self.play.setTransparency(TransparencyAttrib.MAlpha) self.play.setScale((0.25,1.0,0.125)) self.credits.setImage("./tex/menu/credits.png") self.credits.setTransparency(TransparencyAttrib.MAlpha) self.credits.setScale((0.25,1.0,0.125)) return task.cont else: return task.done #end taskMenuMovement #end class Menu
class Player(object): """ Player is the main actor in the fps game """ HP = 100 EROSION = 0 updateTime = 0 speed = 10 FORWARD = Vec3(0, 2, 0) BACK = Vec3(0, -1, 0) LEFT = Vec3(-1, 0, 0) RIGHT = Vec3(1, 0, 0) STOP = Vec3(0) walk = STOP strafe = STOP readyToJump = False jump = 0 state = '' cameraState = 1 visionState = 0 RightButton = 0 LeftButton = 0 goodmanager = None isInteractive = False SLOW = 1 End = 0 Begin = 1 TaskState = End def __init__(self, goodmanager, m, g): """ inits the player """ # 6/17 self.walksound = loader.loadSfx("res/sounds/footstep.mp3") self.goodmanager = goodmanager self.menu = m self.game = g self.loadModel() self.setUpCamera() self.setMouseIcon() self.createCollisions() self.attachControls() self.initSkill() self.shoot = Shoot() # init mouse update task self.initSave() self.initTask() self.initMission() def initMission(self): if self.game.levelName == "tutorial": self.mission = Mission(self, self.menu) elif self.game.levelName == "levelTwo": self.mission = MissionTwo(self, self.menu) elif self.game.levelName == "levelThree": self.mission = MissionThree(self, self.menu) def initSave(self): self.erosionFrame = DirectFrame(frameColor=(0, 0, 0, 0), frameSize=(-1, 1, -1, 1), pos=(-1.2, 0, 0)) self.erosionFrame.hide() self.erosionFrame.setScale(.02, 1, .4) self.background = OnscreenImage('res/erosion_bar.png', pos=(0, 0, 0), scale=(1, 1, 1)) self.background.setTransparency(TransparencyAttrib.MAlpha) self.background.reparentTo(self.erosionFrame) # self.erosionBar = DirectWaitBar(value=self.EROSION, pos=(0, 0, 0), barTexture='res/erosion_value.png', # relief=None) # self.erosionBar.setHpr(0, 0, -90) # self.erosionBar.setScale(0.98, 1, 10) # self.erosionBar.hide() # self.erosionBar.reparentTo(self.erosionFrame) self.erosionBar = OnscreenImage('res/erosion_value.png', pos=(0, 0, 0), scale=(1, 1, 1)) self.erosionBar.setScale(1) self.erosionBar.setTransparency(TransparencyAttrib.MAlpha) self.erosionBar.reparentTo(self.erosionFrame) self.currentItemFrame = DirectFrame( frameColor=(0, 0, 0, 0), frameSize=(-2, 2, -2, 2), pos=(-1.2, 0, .8), image='res/models/items/injection.png', scale=(.1)) self.currentItemFrame.setTransparency(TransparencyAttrib.MAlpha) self.currentItemFrame.hide() # self.currentItemFrame.show() def initTask(self): if self.TaskState == self.Begin: return self.TaskState = self.Begin self.state = '' self.game.gameState = '' self.mouseIconNormal.show() taskMgr.add(self.mouseUpdate, "mouse-task") taskMgr.add(self.moveUpdate, "move-task") taskMgr.add(self.jumpUpdate, 'jump-task') taskMgr.add(self.erosionUpdate, "erosion-task") def endTask(self): if self.TaskState == self.End: return self.TaskState = self.End self.state = 'pause' self.mouseIconWatch.hide() self.mouseIconNormal.hide() taskMgr.remove('mouse-task') taskMgr.remove('move-task') taskMgr.remove('jump-task') taskMgr.remove('erosion-task') # reset update time self.updateTime = 5 def loadModel(self): """ make the nodepath for player """ # self.playerModel = Actor("res/models/ralph", {"run": "res/models/ralph-run", "walk": "res/models/ralph-walk"}) self.playerModel = Actor("res/models/hitman-model5", { "walk": "res/models/hitman-walk5", "stand": "res/models/hitman-stand" }) # self.playerModel = Actor("res/models/hitman2-model", {"walk": "res/models/hitman2-walk", "stand":"res/models/hitman-stand"}) self.playerModel.setH(180) self.playerModel.setZ(0) self.playerModel.setScale(1.1) # self.playerModel.hide() self.node = NodePath("player") self.node.reparentTo(render) self.playerModel.reparentTo(self.node) # self.node.setPos(0, 0, 10) self.node.setPos(-250, 265, 0) self.node.setHpr(150, 0, 0) self.node.setScale(20) self.node.hide(BitMask32.bit(0)) self.node.hide(BitMask32.bit(1)) def setMouseIcon(self): self.mouseIconNormal = OnscreenImage(image="res/mouse/mouse1.png", pos=(0, 1.1, 0)) self.mouseIconNormal.setTransparency(TransparencyAttrib.MAlpha) self.mouseIconNormal.setScale(0.02) self.mouseIconNormal.setLightOff() self.mouseIconNormal.setSa(0.5) self.mouseIconWatch = OnscreenImage(image="res/mouse/mouse2.png", pos=(0, 1.1, 0)) self.mouseIconWatch.setTransparency(TransparencyAttrib.MAlpha) self.mouseIconWatch.setScale(0.05) self.mouseIconWatch.setSa(0.5) self.mouseIconWatch.setLightOff() self.mouseIconNormal.reparentTo(base.camera) self.mouseIconWatch.reparentTo(base.camera) self.mouseIconWatch.hide() def SetMouseModeNormal(self, mode): if mode == 'Watch': self.mouseIconWatch.show() self.mouseIconNormal.hide() elif mode == 'Normal': self.mouseIconNormal.show() self.mouseIconWatch.hide() def setUpCamera(self): """ puts camera at the players node """ pl = base.cam.node().getLens() pl.setFov(70) base.cam.node().setLens(pl) base.camera.reparentTo(self.node) base.cam.node().setCameraMask(BitMask32.bit(3)) self.oldcameraState = 0 self.cameranewPos = None self.cameranewH = None self.changeCamera() # 6/17 def createCollisions(self): """ create a collision solid and ray for the player """ cn = CollisionNode('PlayerCollideNode') cn.addSolid(CollisionSphere(0, 0, 4, 1)) solid = self.node.attachNewNode(cn) solid.setScale(1, 1, 1) solid.setPos(0, 0, 0) # solid.show() base.cTrav.addCollider(solid, base.pusher) base.pusher.addCollider(solid, self.node, base.drive.node()) # init players floor collisions ray = CollisionRay() ray.setOrigin(0, 0, 3) ray.setDirection(0, 0, -1) cn = CollisionNode('playerRay') cn.addSolid(ray) cn.setFromCollideMask(BitMask32.bit(0)) cn.setIntoCollideMask(BitMask32.allOff()) solid = self.node.attachNewNode(cn) # solid.show() base.cTrav.setRespectPrevTransform(True) self.nodeGroundHandler = CollisionHandlerQueue() base.cTrav.addCollider(solid, self.nodeGroundHandler) # init players Forward Ray ForwardSegment = CollisionSegment(0, 2, 0, 0, 20, 0) cn = CollisionNode('playerForwardSegment') cn.addSolid(ForwardSegment) cn.setFromCollideMask(BitMask32.bit(0)) cn.setIntoCollideMask(BitMask32.allOff()) solid = base.camera.attachNewNode(cn) # solid.show() base.cTrav.addCollider(solid, self.nodeGroundHandler) # repair cross wall ForwardSegment = CollisionSegment(0, -4, 3, 0, 4, 3) cn = CollisionNode('PlayerMoveForwardSegment') cn.addSolid(ForwardSegment) cn.setFromCollideMask(BitMask32.bit(0)) cn.setIntoCollideMask(BitMask32.allOff()) solid = self.node.attachNewNode(cn) # solid.show() base.cTrav.addCollider(solid, self.nodeGroundHandler) # init play Right Ray ForwardSegment = CollisionSegment(-2, 0, 3, 2, 0, 3) cn = CollisionNode('PlayerMoveRightSegment') cn.addSolid(ForwardSegment) cn.setFromCollideMask(BitMask32.bit(0)) cn.setIntoCollideMask(BitMask32.allOff()) solid = self.node.attachNewNode(cn) # solid.show() base.cTrav.addCollider(solid, self.nodeGroundHandler) def attachControls(self): """ attach key events """ # base.accept("space", self.__setattr__, ["readyToJump", True]) # base.accept("space-up", self.__setattr__, ["readyToJump", False]) self.keyEven = [ "s", "s-up", "w", "w-up", "a", "d", "a-up", "d-up", "c", "o", "mouse3", "mouse3-up", "mouse1", "mouse1-up" ] base.accept("s", self.__setattr__, ["walk", self.STOP]) base.accept("w", self.__setattr__, ["walk", self.FORWARD]) base.accept("s", self.__setattr__, ["walk", self.BACK]) base.accept("s-up", self.__setattr__, ["walk", self.STOP]) base.accept("w-up", self.__setattr__, ["walk", self.STOP]) base.accept("a", self.__setattr__, ["strafe", self.LEFT]) base.accept("d", self.__setattr__, ["strafe", self.RIGHT]) base.accept("a-up", self.__setattr__, ["strafe", self.STOP]) base.accept("d-up", self.__setattr__, ["strafe", self.STOP]) base.accept("c", self.changeCamera) base.accept("o", self.doubleVision) base.accept("mouse3", self.__setattr__, ["RightButton", 1]) base.accept("mouse3-up", self.__setattr__, ["RightButton", 0]) base.accept("mouse1", self.__setattr__, ["LeftButton", 1]) base.accept("mouse1-up", self.__setattr__, ["LeftButton", 0]) def IgnoreControls(self): for name in self.keyEven: base.ignore(name) print base.getAllAccepting() def initSkill(self): self.tex = Texture() self.tex.setMinfilter(Texture.FTLinear) base.win.addRenderTexture(self.tex, GraphicsOutput.RTMTriggeredCopyTexture) self.tex.setClearColor((0, 0, 0, 1)) self.tex.clearImage() # Create another 2D camera. Tell it to render before the main camera. self.backcam = base.makeCamera2d(base.win, sort=-10) self.background = NodePath("background") self.backcam.reparentTo(self.background) self.background.setDepthTest(0) self.background.setDepthWrite(0) self.backcam.node().getDisplayRegion(0).setClearDepthActive(0) self.bcard = base.win.getTextureCard() self.bcard.reparentTo(base.render2d) self.bcard.setTransparency(1) self.fcard = base.win.getTextureCard() self.fcard.reparentTo(base.render2d) self.fcard.setTransparency(1) # Add the task that initiates the screenshots. taskMgr.add(self.takeSnapShot, "takeSnapShot") if base.win.getGsg().getCopyTextureInverted(): # print("Copy texture is inverted.") self.bcard.setScale(1, 1, -1) self.fcard.setScale(1, 1, -1) self.bcard.hide() self.fcard.hide() self.nextclick = 0 self.clickrate = 10000 def takeSnapShot(self, task): if task.time > self.nextclick: self.nextclick += 1.0 / self.clickrate if self.nextclick < task.time: self.nextclick = task.time base.win.triggerCopy() return task.cont def doubleVision(self): self.visionState = 1 - self.visionState if self.visionState == 1: self.bcard.show() self.bcard.setColor(1, 1, 1, 0.60) self.bcard.setScale(1.0) self.bcard.setPos(-0.05, 0, 0) self.bcard.setR(0) self.fcard.show() self.fcard.setColor(1, 1, 1, 0.60) self.fcard.setScale(1.0) self.fcard.setPos(0.05, 0, 0) self.fcard.setR(0) self.clickrate = 10000 self.nextclick = 0 else: self.bcard.hide() self.fcard.hide() def changeCamera(self): if self.cameraState == 1: self.cameraState = 0 else: self.cameraState = 1 self.setCamera() def setCamera(self): self.cameraoldPos = base.camera.getPos() self.cameraoldNear = base.cam.node().getLens().getNear() if self.cameraState == 0: self.cameranewPos = Vec3(0, -5, 10) pl = base.cam.node().getLens() self.cameranewNear = 1 base.cam.node().setLens(pl) elif self.cameraState == 1: self.cameranewPos = Vec3(0, -1, 8) self.cameranewNear = 1 # self.playerModel.hide() self.playerModel.hide(BitMask32.bit(3)) elif self.cameraState == 2: self.cameranewPos = Vec3(0, -1.5, 8) self.cameranewNear = 1 taskMgr.add(self.updatecamera, "updatecamera") def updatecamera(self, task): if task.time < 0.2: camera.setPos( (self.cameraoldPos * (0.2 - task.time) + self.cameranewPos * (task.time)) / 0.2) return task.cont if self.cameraState == 1: self.playerModel.hide(BitMask32.bit(3)) else: self.playerModel.show(BitMask32.bit(3)) pl = base.cam.node().getLens() pl.setNear(self.cameraoldNear) base.cam.node().setLens(pl) return def erosionUpdate(self, task): if self.EROSION >= 100: self.mission.end("endA") return if self.EROSION >= 80: self.visionState = 0 self.doubleVision() else: self.visionState = 1 self.doubleVision() # self.erosionBar['value'] = self.EROSION self.erosionBar.setScale(1, 1, self.EROSION / 100) self.erosionBar.setPos(0, 0, -1 + self.EROSION / 100) if task.time > self.updateTime: self.EROSION = math.pow(2, (self.EROSION / 20 - 1)) / 6 + self.EROSION # print task.time, 'time' # print self.EROSION self.updateTime += 10 # print self.updateTime return task.cont def erosionUpdateTemp(self): if self.EROSION >= 100: if self.game.levelName == 'levelThree': self.mission.chessBoard.hide() self.mission.end("endA") return if self.EROSION >= 80: self.visionState = 0 self.doubleVision() else: self.visionState = 1 self.doubleVision() # self.erosionBar['value'] = self.EROSION self.erosionBar.setScale(1, 1, self.EROSION / 100) self.erosionBar.setPos(0, 0, -1 + self.EROSION / 100) def mouseUpdate(self, task): """ this task updates the mouse """ if self.state == '': md = base.win.getPointer(0) x = md.getX() y = md.getY() if base.win.movePointer(0, base.win.getXSize() / 2, base.win.getYSize() / 2): self.node.setH(self.node.getH() - (x - base.win.getXSize() / 2) * 0.1) base.camera.setP(base.camera.getP() - (y - base.win.getYSize() / 2) * 0.1) if (base.camera.getP() < -45.): base.camera.setP(-45) if (base.camera.getP() > 45.): base.camera.setP(45) if self.RightButton == 1: self.shoot.MouseDown(self.node) self.EROSION += 5 self.RightButton = 0 # check Interactive Goods nearest = 1000.0 goods = None for i in range(self.nodeGroundHandler.getNumEntries()): entry = self.nodeGroundHandler.getEntry(i) IntoName = entry.getIntoNode().getName() FromName = entry.getFromNode().getName() if FromName == 'playerForwardSegment': if entry.getSurfacePoint(base.camera).getY() < nearest: nearest = entry.getSurfacePoint(base.camera).getY() goods = self.goodmanager.GoodsIta.get(IntoName) if goods and goods.Interactive == True: # print goods.Name self.SetMouseModeNormal('Watch') self.isInteractive = True self.currentInteract = goods else: self.SetMouseModeNormal('Normal') self.isInteractive = False self.currentInteract = None if self.LeftButton == 1 and self.isInteractive: print 'trigger interactive event' print goods.Name self.mission.interactiveWith(goods) return task.cont def moveUpdate(self, task): """ this task makes the player move """ # move where the keys set it # print self.node.getPos() nearestForward = 1000.0 nearestRight = 1000.0 RightEntry = None ForwardEntry = None for i in range(self.nodeGroundHandler.getNumEntries()): entry = self.nodeGroundHandler.getEntry(i) IntoName = entry.getIntoNode().getName() FromName = entry.getFromNode().getName() if FromName == 'PlayerMoveForwardSegment' and ( IntoName != 'PlayerCollideNode'): if entry.getSurfacePoint(self.node).getY() < nearestForward: nearestForward = entry.getSurfacePoint(self.node).getY() ForwardEntry = entry if FromName == 'PlayerMoveRightSegment' and (IntoName != 'PlayerCollideNode'): if abs(entry.getSurfacePoint(self.node).getX()) < nearestRight: nearestRight = abs(entry.getSurfacePoint(self.node).getX()) RightEntry = entry if nearestForward < 2 and nearestForward > -2: self.SLOW = abs(nearestForward) * 0.2 self.node.setPos(self.node.getPos() + ForwardEntry.getSurfaceNormal(render)) else: self.SLOW = 1 if nearestRight < 2: self.node.setPos(self.node.getPos() + RightEntry.getSurfaceNormal(render)) if (nearestForward < 0 and nearestForward > -5.) or nearestRight < 5: if self.cameraState == 0: self.cameraState = 2 self.setCamera() else: if self.cameraState == 2: self.cameraState = 0 self.setCamera() if self.state == '': self.walksound.setLoop(False) #self.walksound.stop() if ((self.walk == self.FORWARD) and (self.playerModel.getAnimControl('walk').isPlaying() == False)): self.walksound.setLoop(True) self.walksound.setVolume(0.5) self.walksound.play() self.playerModel.getAnimControl('walk').play() elif self.walk == self.STOP and self.playerModel.getAnimControl( 'stand').isPlaying() == False: self.playerModel.getAnimControl('stand').play() self.playerModel.getAnimControl('walk').stop() self.walksound.setLoop(False) self.walksound.stop() if self.strafe == LVector3f( -1, 0, 0) or self.strafe == LVector3f(1, 0, 0): self.walksound.setLoop(True) # self.walksound.setVolume(0.5) self.walksound.play() elif self.strafe == LVector3f(0, 0, 0): self.walksound.setLoop(False) self.walksound.stop() #elif self.walk == self.BACK: #self.walksound.setLoop(True) #self.walksound.setVolume(0.5) #self.walksound.play() self.node.setFluidPos( self.node, self.walk * globalClock.getDt() * self.speed * self.SLOW) self.node.setFluidPos( self.node, self.strafe * globalClock.getDt() * self.speed * self.SLOW) return task.cont # 6/17 def jumpUpdate(self, task): """ this task simulates gravity and makes the player jump """ # get the highest Z from the down casting ray highestZ = -100 for i in range(self.nodeGroundHandler.getNumEntries()): entry = self.nodeGroundHandler.getEntry(i) # print entry z = entry.getSurfacePoint(render).getZ() # if z > highestZ and entry.getFromNode().getName() == 'playerRay' and entry.getIntoNode().getName() != "PlayerCollideNode": if z > highestZ and entry.getFromNode().getName( ) == 'playerRay' and entry.getIntoNode().getName() == "floor": highestZ = z # print highestZ # gravity effects and jumps self.node.setZ(self.node.getZ() + self.jump * globalClock.getDt() * 600) self.jump -= 1 * globalClock.getDt() if highestZ > self.node.getZ(): self.jump = 0 self.node.setZ(highestZ) if self.readyToJump: self.jump = 1 return task.cont
class FPS(object, DirectObject): def __init__(self): self.winXhalf = base.win.getXSize() / 2 self.winYhalf = base.win.getYSize() / 2 winprops = WindowProperties() winprops.setCursorHidden(True) base.win.requestProperties(winprops) self.model = loader.loadModel('models/Guns/45.x') self.model.reparentTo(base.camera) self.model.setPos(USP45_POS) self.model.setHpr(USP45_HPR) self.model.setScale(PISTOL_SCALE) self.gun = 1 self.initSound() self.initCollision() self.loadLevel() self.initPlayer() self.setupMouseCollision() self.loadCrosshairs() self.loadRalph() def initSound(self): self.deathSnd = base.loader.loadSfx("models/sounds/and.ogg") self.spawnSnd = base.loader.loadSfx("models/sounds/faster.ogg") self.fireSnd = base.loader.loadSfx("models/sounds/rifle.ogg") def loadCrosshairs(self): self.crosshairs = OnscreenImage(image='models/crosshair.png', pos=base.win.getPointer(0)) self.crosshairs.setTransparency(TransparencyAttrib.MAlpha) self.crosshairs.setScale(.04, .04, .04) def initCollision(self): #initialize traverser base.cTrav = CollisionTraverser() base.cTrav.setRespectPrevTransform(True) base.cTrav.showCollisions(render) self.mPicker = CollisionTraverser() self.mPicker.showCollisions(render) self.mCQue = CollisionHandlerQueue() # base.cTrav.showCollisions(render) #initialize pusher self.pusher = CollisionHandlerPusher() # collision bits self.groundCollBit = BitMask32.bit(0) self.collBitOff = BitMask32.allOff() self.zombieColBitFrom = BitMask32.bit(2) self.zombieColBitInto = BitMask32.bit(2) self.zombieColBitOff = BitMask32.allOff() def loadLevel(self): self.level = loader.loadModel('models/world') self.level.reparentTo(render) self.level.setPos(0, 0, 0) self.level.setColor(1, 1, 1, .5) self.level.setCollideMask(self.groundCollBit) self.box = loader.loadModel("models/box") self.box.reparentTo(render) self.box.setPos(-29.83, 0, 0) self.box.setScale(1) self.box.setCollideMask(self.groundCollBit) self.box1 = loader.loadModel("models/box") self.box1.reparentTo(render) self.box1.setPos(-51.14, -17.90, 0) self.box1.setScale(1) self.box1.setCollideMask(self.groundCollBit) def loadRalph(self): ralphStartPos = Vec3(-98.64, -20.60, 0) self.ralph = Actor("models/ralph", { "run": "models/ralph-run", "walk": "models/ralph-walk" }) self.ralph.reparentTo(render) self.ralph.setPos(ralphStartPos) self.ralph.setScale(.3) self.ralphLife = 10 ralphaiStartPos = Vec3(-50, 20, 0) self.ralphai = Actor("models/ralph", { "run": "models/ralph-run", "walk": "models/ralph-walk" }) self.cTrav = CollisionTraverser() self.ralphGroundRay = CollisionRay() self.ralphGroundRay.setOrigin(0, 0, 1000) self.ralphGroundRay.setDirection(0, 0, -1) self.ralphGroundCol = CollisionNode('ralphRay') self.ralphGroundCol.addSolid(self.ralphGroundRay) self.ralphGroundCol.setFromCollideMask(BitMask32.bit(0)) self.ralphGroundCol.setIntoCollideMask(BitMask32.allOff()) self.ralphGroundColNp = self.ralph.attachNewNode(self.ralphGroundCol) self.ralphGroundHandler = CollisionHandlerQueue() self.cTrav.addCollider(self.ralphGroundColNp, self.ralphGroundHandler) self.ralphHeadSphere = CollisionSphere(0, -.2, 4.5, .7) self.ralphHeadCol = CollisionNode('ralphHeadColSphere') self.ralphHeadCol.addSolid(self.ralphHeadSphere) self.ralphHeadCol.setFromCollideMask(self.zombieColBitFrom) self.ralphHeadCol.setIntoCollideMask(self.zombieColBitInto) self.ralphHeadColNp = self.ralph.attachNewNode(self.ralphHeadCol) self.mPicker.addCollider(self.ralphHeadColNp, self.mCQue) self.ralphBodySphere = CollisionSphere(0, -.2, 2, 1) self.ralphBodyCol = CollisionNode('ralphBodyColSphere') self.ralphBodyCol.addSolid(self.ralphBodySphere) self.ralphBodyCol.setFromCollideMask(self.zombieColBitFrom) self.ralphBodyCol.setIntoCollideMask(self.zombieColBitInto) self.ralphBodyColNp = self.ralph.attachNewNode(self.ralphBodyCol) self.mPicker.addCollider(self.ralphBodyColNp, self.mCQue) self.ralphHeadColNp.show() self.ralphBodyColNp.show() base.taskMgr.doMethodLater(.7, self.spawnSound, "spawnSound") self.isMoving = False self.setAI() def spawnSound(self, task): self.spawnSnd.play() return task.done def Scar(self): self.model.removeNode() self.model = loader.loadModel('models/Guns/SCAR.x') self.model.reparentTo(base.camera) self.model.setPos(SCAR_POS) self.model.setHpr(SCAR_HPR) self.model.setScale(RIFLE_SCALE) self.gun = 4 def M4(self): self.model.removeNode() self.model = loader.loadModel('models/Guns/M4.x') self.model.reparentTo(base.camera) self.model.setPos(M4_POS) self.model.setHpr(M4_HPR) self.model.setScale(RIFLE_SCALE) self.gun = 3 def Shotgun(self): self.model.removeNode() self.model = loader.loadModel('models/Guns/Shotgun.x') self.model.reparentTo(base.camera) self.model.setPos(SHOTGUN_POS) self.model.setHpr(SHOTGUN_HPR) self.model.setScale(RIFLE_SCALE) self.gun = 2 def Pistol(self): self.model.removeNode() self.model = loader.loadModel('models/Guns/45.x') self.model.reparentTo(base.camera) self.model.setPos(USP45_POS) self.model.setHpr(USP45_HPR) self.model.setScale(PISTOL_SCALE) self.gun = 1 def setupMouseCollision(self): self.mRay = CollisionRay() self.mRayNode = CollisionNode('pickRay') self.mRayNode.addSolid(self.mRay) self.mRayNode.setFromCollideMask(self.zombieColBitFrom) self.mRayNode.setIntoCollideMask(self.zombieColBitOff) self.mPickNp = base.camera.attachNewNode(self.mRayNode) self.mPicker.addCollider(self.mPickNp, self.mCQue) self.mPickNp.show() def initPlayer(self): #load man self.man = render.attachNewNode( 'man') # keep this node scaled to identity self.man.setPos(0, 0, 10) # camera base.camera.reparentTo(self.man) base.camera.setPos(0, 0, 1.7) base.camLens.setNearFar(.1, 1000) base.disableMouse() #create a collsion solid around the man manC = self.man.attachCollisionSphere('manSphere', 0, 0, 1, .4, self.groundCollBit, self.collBitOff) self.pusher.addCollider(manC, self.man) base.cTrav.addCollider(manC, self.pusher) speed = 4 Forward = Vec3(0, speed * 2, 0) Back = Vec3(0, -speed, 0) Left = Vec3(-speed, 0, 0) Right = Vec3(speed, 0, 0) Stop = Vec3(0) self.walk = Stop self.strife = Stop self.jump = 0 taskMgr.add(self.move, 'move-task') self.jumping = LerpFunc(Functor(self.__setattr__, "jump"), duration=.5, fromData=.4, toData=0) self.accept("escape", sys.exit) self.accept("space", self.startJump) self.accept("s", self.__setattr__, ["walk", Back]) self.accept("w", self.__setattr__, ["walk", Forward]) self.accept("s-up", self.__setattr__, ["walk", Stop]) self.accept("w-up", self.__setattr__, ["walk", Stop]) self.accept("a", self.__setattr__, ["strife", Left]) self.accept("d", self.__setattr__, ["strife", Right]) self.accept("a-up", self.__setattr__, ["strife", Stop]) self.accept("d-up", self.__setattr__, ["strife", Stop]) self.accept("wheel_up", self.nextWeapon) self.accept("wheel_down", self.prevWeapon) self.accept("1", self.Pistol) self.accept("2", self.Shotgun) self.accept("3", self.M4) self.accept("4", self.Scar) self.accept('mouse1', self.onMouseTask) #add mouse collision to our world self.setupMouseCollision() self.manGroundColNp = self.man.attachCollisionRay( 'manRay', 0, 0, .6, 0, 0, -1, self.groundCollBit, self.collBitOff) self.manGroundHandler = CollisionHandlerGravity() self.manGroundHandler.addCollider(self.manGroundColNp, self.man) base.cTrav.addCollider(self.manGroundColNp, self.manGroundHandler) def nextWeapon(self): if self.gun == 1: self.Shotgun() elif self.gun == 2: self.M4() elif self.gun == 3: self.Scar() elif self.gun == 4: self.Pistol() def prevWeapon(self): if self.gun == 1: self.Scar() elif self.gun == 2: self.Pistol() elif self.gun == 3: self.Shotgun() elif self.gun == 4: self.M4() def startJump(self): if self.manGroundHandler.isOnGround(): self.jumping.start() def move(self, task): dt = globalClock.getDt() # mouse md = base.win.getPointer(0) x = md.getX() y = md.getY() if base.win.movePointer(0, self.winXhalf, self.winYhalf): self.man.setH(self.man, (x - self.winXhalf) * -0.1) base.camera.setP( clampScalar(-90, 90, base.camera.getP() - (y - self.winYhalf) * 0.1)) # move where the keys set it moveVec = (self.walk + self.strife) * dt # horisontal moveVec.setZ(self.jump) # vertical self.man.setFluidPos(self.man, moveVec) # jump damping if self.jump > 0: self.jump = clampScalar(0, 1, self.jump * .9) return task.cont def onMouseTask(self): mpos = base.mouseWatcherNode.getMouse() self.mRay.setDirection(render.getRelativeVector(camera, Vec3(0, 1, 0))) self.mRay.setFromLens(base.camNode, mpos.getX(), mpos.getY()) self.mPicker.traverse(render) self.fireSnd.play() entries = [] for i in range(self.mCQue.getNumEntries()): entry = self.mCQue.getEntry(i) print entry entries.append(entry) if (len(entries) > 0) and (entries[0].getIntoNode().getName() == 'terrain'): print 'terrain' entries = [] for i in range(self.mCQue.getNumEntries()): entry = self.mCQue.getEntry(i) print entry entries.append(entry) if (len(entries) > 0) and (entries[0].getIntoNode().getName() == 'ralphHeadColSphere'): self.ralphLife -= 10 base.taskMgr.doMethodLater(.3, self.deathSound, "deathSound") entries = [] for i in range(self.mCQue.getNumEntries()): entry = self.mCQue.getEntry(i) print entry entries.append(entry) if (len(entries) > 0) and (entries[0].getIntoNode().getName() == 'ralphBodyColSphere'): self.ralphLife -= 5 if self.ralphLife < 5: base.taskMgr.doMethodLater(.3, self.deathSound, "deathSound") if self.ralphLife <= 0: self.ralph.cleanup() self.ralphai.cleanup() self.loadRalph() def deathSound(self, task): self.deathSnd.play() return task.done def setAI(self): #Creating AI World self.AIworld = AIWorld(render) self.AIchar = AICharacter("ralph", self.ralph, 130, 0.05, 25) self.AIworld.addAiChar(self.AIchar) self.AIbehaviors = self.AIchar.getAiBehaviors() self.AIbehaviors.initPathFind("models/navmesh.csv") self.setMove() #AI World update taskMgr.add(self.AIUpdate, "AIUpdate") def setMove(self): self.AIbehaviors.addStaticObstacle(self.box) self.AIbehaviors.addStaticObstacle(self.box1) self.AIbehaviors.pathFindTo(self.man) self.ralph.loop("run") #to update the AIWorld def AIUpdate(self, task): self.AIworld.update() self.ralphMove() return Task.cont def ralphMove(self): startpos = self.ralph.getPos() # Now check for collisions. self.cTrav.traverse(render) entries = [] for i in range(self.ralphGroundHandler.getNumEntries()): entry = self.ralphGroundHandler.getEntry(i) entries.append(entry) entries.sort(lambda x, y: cmp( y.getSurfacePoint(render).getZ(), x.getSurfacePoint(render).getZ())) if (len(entries) > 0) and (entries[0].getIntoNode().getName() == "terrain"): self.ralph.setZ(entries[0].getSurfacePoint(render).getZ()) else: self.ralph.setPos(startpos) self.ralph.setP(0) return Task.cont
class Myapp(ShowBase): def __init__(self): ShowBase.__init__(self) self.accept("escape",sys.exit) self.accept("mouse1", self.startShoot) self.accept("mouse1-up", self.endShoot) base.disableMouse() props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.heading = 0 self.pitch = 0 self.mousex = 0 self.mousey = 0 self.flight = [] self.cs_flight = [] self.explosion = [] self.score = 0 self.life = 20 self.m1down = 1 self.environ = self.loader.loadModel("models/terrain") self.environ.reparentTo(self.render) self.environ.setScale(0.8, 0.8, 0.8) self.environ.setPos(0,0,-10) self.environ.setHpr(-90,0,0) for k in range(0,5): self.flight.append(self.loader.loadModel("models/spitfire")) self.flight[k].reparentTo(self.render) self.flight[k].setScale(0.1, 0.1, 0.1) self.flight[k].setPos(randint(-40,20), randint(300,400),randint(10,20)) self.cs_flight.append( self.flight[k].attachNewNode(CollisionNode(str(k)))) self.cs_flight[k].node().addSolid(CollisionSphere(0,0,5,30)) #self.cs_flight[k].show() self.flight[k].setCollideMask(BitMask32.bit(1)) self.bullets = [] self.crosshair = OnscreenImage(image = 'models/crosshair.png', pos = (0,0,0)) self.crosshair.setScale(0.03,0.03,0.03) self.crosshair.setTransparency(TransparencyAttrib.MAlpha) self.title = OnscreenText(" ", style=1, fg=(1,1,1,1), pos=(0,0), scale = .07) self.taskMgr.add(self.mouse_control, "mouse_control") self.taskMgr.add(self.update_flight, "update_flight") self.picker = CollisionTraverser() self.pq = CollisionHandlerQueue() self.pickerNode = CollisionNode('mouseRay') self.pickerNP = camera.attachNewNode(self.pickerNode) self.pickerNode.setFromCollideMask(BitMask32.bit(1)) self.pickerRay = CollisionRay() self.pickerNode.addSolid(self.pickerRay) self.picker.addCollider(self.pickerNP,self.pq) self.gun = OnscreenImage(image = 'models/gun.png', pos = (0.24, 0, -0.54)) self.gun.setScale(1,0.6,0.6) self.gun.setTransparency(TransparencyAttrib.MAlpha) self.sound = base.loader.loadSfx("models/sound.ogg") base.setFrameRateMeter(True) def mouse_control(self,task): md = base.win.getPointer(0) x = md.getX() y = md.getY() if base.win.movePointer(0, 100, 100): self.heading = self.heading - (x - 100) * 0.1 self.pitch = self.pitch - (y - 100) * 0.1 if (self.pitch < -10): self.pitch = -10 if (self.pitch > 20): self.pitch = 20 if (self.heading < -40): self.heading = -40 if (self.heading > 30): self.heading = 30 base.camera.setHpr(self.heading,self.pitch,0) return Task.cont def update_flight(self,task): i = 0 while(i<len(self.flight)): x = self.flight[i].getY() if x<-3: self.flight[i].setPos(randint(-40,20), randint(200,300),randint(10,20)) if(self.life ==0): self.game_end() else: self.life -= 1 else: x -= 0.7 self.flight[i].setPos(self.flight[i].getX(), x, self.flight[i].getZ()) i+=1 self.title.destroy() self.title = OnscreenText(text='Life: ' + str(self.life)+' Score: '+str(self.score), style=1, fg=(1,1,1,1), pos=(-1.5,0.9), scale = .07) return Task.cont def removeBullet(self,task): if len(self.bullets) < 1: return self.bulletNP = self.bullets.pop(0) self.bulletNP.removeNode() return task.done def shootBullet(self,task): self.ball = self.loader.loadModel("models/bullet") self.ball.reparentTo(self.render) self.ball.setScale(0.02,0.02,0.02) self.ball.setPos(0,0,0) self.bullets.append(self.ball) self.bt = ProjectileInterval(self.ball, startPos = Point3(0,0,-5), endPos = Point3(self.heading * -2 , 100 , self.pitch*2), duration = 0.3 , gravityMult = -2 ) self.bt.start() self.taskMgr.doMethodLater(0.3, self.removeBullet, 'removeBullet') self.hit_flight() if(self.m1down): self.taskMgr.doMethodLater(0.2, self.shootBullet, 'shootbullet') def hit_flight(self): if base.mouseWatcherNode.hasMouse(): mpos = base.mouseWatcherNode.getMouse() self.pickerRay.setFromLens(base.camNode,0,0) self.picker.traverse(render) if self.pq.getNumEntries() > 0: self.pq.sortEntries() pickedObj = self.pq.getEntry(0).getIntoNodePath() if pickedObj.getName() != 'CINEMA4D_Mesh' : k = int(pickedObj.getName()) self.score += 1 self.explode(self.flight[k].getX(),self.flight[k].getY(),self.flight[k].getZ()) self.flight[k].setPos(randint(-40,20), randint(200,300),randint(10,20)) def game_end(self): self.crosshair.remove() self.gov = OnscreenText("Game Over", style=1, fg=(1,1,1,1), pos=(0,0), scale = 0.07) self.taskMgr.remove("mouse_control") self.taskMgr.remove("update_flight") #self.explode(20,20,20) p = open('score.txt','r') score = p.readline() p.close() if(self.score > int(score)): p = open('score.txt','w') p.write(str(self.score)) p.close() def explode(self,x,y,z): k = len(self.explosion) self.explosion.append(loader.loadModel('explosion/flip.egg')) self.explosion[k].reparentTo(self.render) self.explosion[k].setPos(x,y,z) self.explosion[k].setScale(5,5,5) self.taskMgr.doMethodLater(0.6, self.removeExplosion, 'removeExp') def removeExplosion(self,task): if len(self.explosion) < 1: return self.explosion[0].removeNode() del self.explosion[0] return task.done def endShoot(self): self.m1down = 0 self.sound.stop() def startShoot(self): self.sound.play() self.m1down = 1 self.taskMgr.doMethodLater(0.1, self.shootBullet, 'shootbullet')
class Player(DirectObject): #using this to be our player #define tehings like health in here #have to tie the camera to this #game manager ->player ->camera as far as instantiating goes def __init__(self): #Color values self.red = 0 self.green = 1 self.blue = 1 self.oRed = 0 self.oGreen = 1 self.oBlue = 1 #Limits use of weapons on menus self.canUseWeapons = True #Current overheat value self.overHeat = 0 #Amount of overheat reduced per cycle self.overHeatCount = .1 #Flag for overheated weapons self.isOverHeated = False #Flag for ccritical health self.down = True #Create player node self.playerNode = NodePath('player') self.playerNode.reparentTo(render) self.playerNode.setPos(0,-30,30) self.playerNode.setScale(1.0) #Create player model and reparent it to playerNode self.playerModel = loader.loadModel("./resources/player") self.playerModel.reparentTo(self.playerNode) self.playerModel.setPos(0,0,2) #Create weapons and store them in a map self.rRifle = RecursionRifle(base.camera, len(base.projectileList)) self.mhBlunder = MHB(base.camera, len(base.projectileList)) self.kvDuals = KeyValue(base.camera, len(base.projectileList)) self.weaponMap = {1:self.rRifle, 2:self.mhBlunder, 3:self.kvDuals} self.curWeapon = 1 #Names of weapons for switcching images self.weaponNameMap = {1:"./resources/rrName.png", 2:"./resources/mhbName.png", 3:"./resources/kvdName.png"} #Load all weaponName images in so it doesn't stutter on swap self.weaponName = OnscreenImage(self.weaponNameMap[3]) self.weaponName.setTransparency(True) self.weaponName.setImage(self.weaponNameMap[2]) self.weaponName.setTransparency(True) self.weaponName.setImage(self.weaponNameMap[1]) self.weaponName.setTransparency(True) self.weaponName.reparentTo(render2d) #Hide weapons currently not in use self.mhBlunder.hide() self.kvDuals.hide() #Weapon controls self.accept("mouse1", self.fireWeapon) self.accept("mouse3", self.swapWeapon) #Display HUD self.hud = OnscreenImage("resources/hud.png") self.hud.setTransparency(True) self.hud.reparentTo(render2d) # define player health here # try not to re-create the player object, will alter reset these values # alernatively, dump player stats off in save file before recreating print "Mod:",base.damageMod self.maxEnergy = 100/base.damageMod self.curEnergy = self.maxEnergy self.accept("cnode", self.hit) self.accept("pickuphealth", self.energyUpgrade) #Load font for text nodes font = loader.loadFont("./resources/ni7seg.ttf") #Text node for health bar self.healthLable = TextNode('health field name') self.healthLable.setFont(font) self.healthLable.setText("Abstraction") self.textNodePath = aspect2d.attachNewNode(self.healthLable) self.textNodePath.setScale(0.05) self.healthLable.setAlign(TextNode.ACenter) self.textNodePath.setPos(0, 0, .68) self.healthLable.setTextColor(self.red, self.green, self.blue, 1) #TextNode for enemy counter self.enemiesLeft = TextNode('monsters to kill') self.enemiesLeft.setFont(font) self.enemiesLeft.setText(str(len(base.enemyList))) self.texnp = aspect2d.attachNewNode(self.enemiesLeft) self.texnp.setScale(.1) self.texnp.setPos(-1.68, 0, -.75) self.enemiesLeft.setTextColor(1, 1, 0, 1) #Health bar self.bar = DirectWaitBar(text = "", value = self.curEnergy, range = self.maxEnergy, pos = (0,.4,.95), barColor = (self.red, self.green, self.blue, 1)) self.bar.setScale(0.5) #Usage bar self.usageBar = DirectWaitBar(text = "", value = self.overHeat, range = 100, pos = (1.25, -.4, -.95), barColor =(1, 0, 0,1)) self.usageBar.setScale(0.5) #Initailize player collision self.createColision() #Add player tasks base.taskMgr.add(self.updateUsage, "usagePaint", taskChain='Gametasks') base.taskMgr.add(self.hFlicker, "hflicker", taskChain='GameTasks') base.taskMgr.add(self.updateCount, "Ecount", taskChain='GameTasks') base.taskMgr.add(CameraMovement(self.playerModel).cameraControl, "cameraControl", taskChain='GameTasks') base.taskMgr.add(self.overHeatTask, "overHeatTask") base.taskMgr.add(self.killFloor, "Kill Floor") #Deducts health and updates health bar def hit(self, damage): self.curEnergy = self.curEnergy-damage self.bar['value'] = self.curEnergy #If the player dies if self.curEnergy <= 0: #Hide player HUD elements self.hide() #Player can't use weapons while dead self.canUseWeapons = False #Request game over menu from fsm base.fsm.request('GameOver', 1) #Hides all visable elements attached to the player def hide(self): self.weaponMap[self.curWeapon].reticle.setScale(0) self.weaponMap[self.curWeapon].curScale = 0 self.weaponMap[self.curWeapon].step = False self.textNodePath.hide() self.texnp.hide() self.hud.setScale(0) self.weaponName.setScale(0) self.usageBar.hide() self.bar.hide() #Display all visable elements attached to the player def show(self): self.textNodePath.show() self.texnp.show() self.hud.setScale(1) self.weaponName.setScale(1) self.usageBar.show() self.bar.show() #Reset the reticle for the current weapon if self.curWeapon == 1: self.weaponMap[1].reticle.setScale(.025) self.weaponMap[1].curScale = .025 elif self.curWeapon == 2: self.weaponMap[2].reticle.setScale(.075) self.weaponMap[2].curScale = .075 else: self.weaponMap[3].reticle.setScale(.025) self.weaponMap[3].curScale = .025 # set the player health to a specific value def adjustHealth(self, value): self.curEnergy = value self.bar['value'] = self.curEnergy #Update enemy counter def updateCount(self, task): self.enemiesLeft.setText(str(len(base.enemyList))) return task.cont #Update usage bar and color def updateUsage(self, task): if self.curEnergy > 0: if self.overHeat < 50: self.usageBar['barColor'] = (.2, 1, .5, 1) elif self.overHeat >=50 and self.overHeat <70: self.usageBar['barColor'] = (1, 1, .2, 1) elif self.overHeat >= 70: self.usageBar['barColor'] = (1, 0, 0, 1) self.usageBar['value'] = self.overHeat if self.isOverHeated: self.usageBar['barColor'] = (1, 0, 0, 1) return task.cont #Swaps to next weapon in the map def swapWeapon(self): #If you're not in a menu if self.canUseWeapons: #Reset weapon delay self.weaponMap[self.curWeapon].resetWeapon #Change to next weapon and hide reticles if self.curWeapon == 1: self.weaponName.setImage(self.weaponNameMap[2]) self.weaponName.setTransparency(True) self.weaponMap[1].reticle.setScale(0) self.weaponMap[1].curScale = 0 self.weaponMap[1].step = False self.rRifle.hide() self.mhBlunder.show() self.curWeapon = 2 self.weaponMap[2].reticle.setScale(.075) self.weaponMap[2].curScale = .075 elif self.curWeapon == 2: self.weaponName.setImage(self.weaponNameMap[3]) self.weaponName.setTransparency(True) self.weaponMap[2].reticle.setScale(0) self.weaponMap[2].curScale = 0 self.weaponMap[2].step = False self.mhBlunder.hide() self.kvDuals.show() self.curWeapon = 3 self.weaponMap[3].reticle.setScale(.025) self.weaponMap[3].curScale = .025 elif self.curWeapon == 3: self.weaponName.setImage(self.weaponNameMap[1]) self.weaponName.setTransparency(True) self.weaponMap[3].reticle.setScale(0) self.weaponMap[3].curScale = 0 self.weaponMap[3].step = False self.kvDuals.hide() self.rRifle.show() self.curWeapon = 1 self.weaponMap[1].reticle.setScale(.025) self.weaponMap[1].curScale = .025 base.taskMgr.remove("weaponDelay") #Fires current weapon def fireWeapon(self): #If the player is not in a menu if self.canUseWeapons: #If there isn't a weapon delay task add one if base.taskMgr.hasTaskNamed("weaponDelay") == False: #If your not overheated if not self.isOverHeated: base.taskMgr.add(self.weaponMap[self.curWeapon].fire, "fire") #If you can shoot as defined by weapon delay elif self.weaponMap[self.curWeapon].canShoot() == True: #and if your not overheated if not self.isOverHeated: base.taskMgr.remove("weaponDelay") base.taskMgr.add(self.weaponMap[self.curWeapon].fire, "fire") #Handles weapon overheat def overHeatTask(self, task): #Every cycle decrement your overheat by the specified amount self.overHeat -= self.overHeatCount #If you exceed the limit if self.overHeat >= 100: #Increase cooldown amount and set overheated flag self.overHeatCount = .5 self.isOverHeated = True #If your are not overheated anymore reset not default cooldown values elif self.overHeat < 0: self.overHeatCount = .1 self.overHeat = 0 self.isOverHeated = False return task.cont #Initialize player collision def createColision(self): #Set up floor collision handler base.floor = CollisionHandlerGravity() base.floor.setGravity(9.8) #Create player collision node and add to traverser self.playerCollNodePath = self.initCollisionSphere(self.playerNode.getChild(0)) base.cTrav.addCollider(self.playerCollNodePath, base.pusher) base.pusher.addCollider(self.playerCollNodePath, self.playerNode) # Create Floor Ray - for gravity / floor floorCollRayPath = self.initCollisionRay(1,-1) base.floor.addCollider(floorCollRayPath, self.playerNode) base.cTrav.addCollider(floorCollRayPath, base.floor) floorCollRayPath.reparentTo(self.playerModel) #Initialize player collision sphere def initCollisionSphere(self, obj): # Create sphere and attach to player cNode = CollisionNode('player') cs = CollisionSphere(0, 0, 4, 2) cNodePath = obj.attachNewNode(CollisionNode('cnode')) cNodePath.node().addSolid(cs) cNodePath.show() return cNodePath #Attach player to a collision ray def initCollisionRay(self, originZ, dirZ): ray = CollisionRay(0,0,originZ,0,0,dirZ) collNode = CollisionNode('playerRay') collNode.addSolid(ray) collNode.setFromCollideMask(BitMask32.bit(1)) collNode.setIntoCollideMask(BitMask32.allOff()) collRayNP = self.playerNode.attachNewNode(collNode) collRayNP.show() return collRayNP #call this method when collide with a health upgrade def energyUpgrade(self): self.maxEnergy +=(10/base.damageMod) self.curEnergy = self.curEnergy+(10/base.damageMod) self.bar['range'] = self.maxEnergy self.adjustHealth(self.curEnergy) #Hurts player and resets the to the levels origin upon falliong in a pit. def killFloor(self, task): z = int(self.playerNode.getPos()[2]) if(z < -7): self.playerNode.setPos(0, 0, 6) #resets height self.playerModel.setPos(base.xPos, base.yPos, base.zPos) #resets position self.hit(10) return task.cont #Makes the health bar flicker when your health is critical def hFlicker(self, task): if self.curEnergy <=30: if self.down: self.red = self.red+0.1 self.blue = self.blue-.01 self.green = self.green-.01 else: self.red = self.red-0.1 self.blue = self.green+0.1 self.green = self.green+0.1 else: self.red = self.oRed self.blue = self.oBlue self.green = self.oGreen if self.red >=1: self.down = False if self.red <=0: self.down = True self.healthLable.setTextColor(self.red, self.green, self.blue, 1) self.bar['barColor']=(self.red, self.green, self.blue, 1) return task.cont #Resets players health and signifies they have restarted level after death def resetEnergy(self): self.canUseWeapons = True self.curEnergy = self.maxEnergy self.adjustHealth(self.curEnergy)
class MyApp(ShowBase): def __init__(self): ShowBase.__init__(self) self.imageObject = OnscreenImage(image = 'earth.jpg', pos = (0, 1, 0)) self.imageObject.setScale(1.9,1,1) tpRed = TextProperties() tpRed.setTextColor(1, 1, 1, 1) tpSlant = TextProperties() tpSlant.setSlant(0.3) tpRoman = TextProperties() cmr12 = loader.loadFont('cmr12.egg') tpRoman.setFont(cmr12) tpMgr = TextPropertiesManager.getGlobalPtr() tpMgr.setProperties("red", tpRed) tpMgr.setProperties("slant", tpSlant) tpMgr.setProperties("roman", tpRoman) self.textObject = OnscreenText(text = '\1red\1\1roman\1\1slant\1Space Collector', pos = (-0.6, 0.4), scale = 0.2) self.textScore=0 self.b = DirectButton(text = ("Start", "Start", "Start", "disabled"),command=self.beginGame) self.b.setScale(0.1,0.1,0.1) self.b.setPos(0.7,0,-0.8) myMaterial = Material() myMaterial.setShininess(1000) myMaterial.setDiffuse(VBase4(0.5,0.5,0.5,1)) myMaterial.setAmbient(VBase4(5,5,5,1)) myMaterial.setSpecular(VBase4(10,10,10,1)) myTexture = loader.loadTexture("maps/grayjumpjetTexture.tif") self.ship = loader.loadModel("GrayJumpJet") self.ship.setScale(0.15, 0.3, 0.15) self.ship.setPos(0,0,0) self.ship.setTexture(myTexture,1) self.ship.reparentTo(render) self.slab = loader.loadModel("box") self.slab.find("**/Cube;+h").setCollideMask(BitMask32.bit(0)) self.slab.setScale(1.5,10,1) self.slab.setPos(0,0,-1) self.slab.setHpr(0,0,0) self.slab.setMaterial(myMaterial) self.slab.setTexGen(TextureStage.getDefault(), TexGenAttrib.MWorldPosition) self.slab.setTexProjector(TextureStage.getDefault(), render, self.slab) self.slab.setTexture(loader.loadTexture("maps/crate_Material_#11_CL.tif"),1) self.junk = [None]*100 self.loadJunk() self.createTrack() base.trackball.node().setPos(0, 20, -4) self.acceleration=0 self.velocity=0 self.yPos=0 render.setShaderAuto() self.cTrav = CollisionTraverser() self.shipGroundRay = CollisionRay() self.shipGroundRay.setOrigin(0,0,1000) self.shipGroundRay.setDirection(0,0,-1) self.shipGroundCol = CollisionNode('shipRay') self.shipGroundCol.addSolid(self.shipGroundRay) self.shipGroundCol.setFromCollideMask(BitMask32.bit(0)) self.shipGroundCol.setIntoCollideMask(BitMask32.allOff()) self.shipGroundColNp = self.ship.attachNewNode(self.shipGroundCol) self.shipGroundHandler = CollisionHandlerQueue() self.cTrav.addCollider(self.shipGroundColNp, self.shipGroundHandler) self.collHandEvent = CollisionHandlerEvent() # add the into pattern with fromObject-into-thisObject self.collHandEvent.addInPattern( 'into-%in' ) self.accept("into-Junk",self.cHandler) bkground = loader.loadModel("square") bkground.reparentTo(camera) bkground.setScale(300,170,50) tex = loader.loadTexture("earth2.jpg") bkground.setTexture(tex,1) bkground.setPos(0,299,0) bkground.setHpr(0,90,0) base.camLens.setFar(300) self.mySound = loader.loadMusic("coinslot1.wav") self.timer=60 self.textTimer=0 self.prevY=0 self.prevX=0 self.shipGroundColNp.show() #self.camGroundColNp.show() self.collided=1 self.jumpTime=0 self.jumpOn=0 self.curZ=0 self.interval=0 self.zPosition=0 self.isGameOver=0 self.score=0 # Uncomment this line to show a visual representation of the # collisions occuring #self.cTrav.showCollisions(render) if base.mouseWatcherNode.hasMouse(): self.prevX=base.mouseWatcherNode.getMouseX() self.prevY=base.mouseWatcherNode.getMouseY() def beginGame(self): self.textObject.destroy() self.imageObject.destroy() self.b.destroy() props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.taskMgr.add(self.moveForward, "MoveForward") self.accept("mouse1",self.jump) self.textScore = OnscreenText(text = '\1red\1\1slant\1Score : 0', pos = (-0.8, 0.8), scale = 0.1) self.textTimer = OnscreenText(text = '\1red\1\1slant\1Time Left : 2:00', pos = (-0.8, 0.7), scale = 0.1) print 'GameBegin' def cHandler(self,collEntry): print "collision" def loadJunk(self): f = open('junk1.txt','r') x=f.readline() y=f.readline() z=f.readline() i=0 while x!="": self.junk[i] = loader.loadModel("rubbishset/rubbish-set.lwo") self.junk[i].setScale(0.5,1,0.5) self.junk[i].reparentTo(render) colSphere=self.initCollisionSphere(self.junk[i],"Junk") self.junk[i].setPos(int(x),int(y),int(z)) x=f.readline() y=f.readline() z=f.readline() i=i+1 def initCollisionSphere(self,node,name): bounds = node.getBounds() center = bounds.getCenter() radius = bounds.getRadius()*0.6 cNode = CollisionNode(name) cNode.addSolid(CollisionSphere(center,radius)) cNP=node.attachNewNode(cNode) cNP.show() return cNP def createTrack(self): f = open('track.txt','r') a = f.read(1) i=0 j=0 while(a!=""): if a=="\n": a=f.read(1) if(a==""): break nSlab = int(a) #print nSlab while nSlab!=0: placeholder = render.attachNewNode("Slab") placeholder.setColor(j*0.92*0.4,nSlab*nSlab*0.51,0.23,1) placeholder.setPos(j*3-7,i*15,nSlab-3) self.slab.instanceTo(placeholder) nSlab=nSlab-1 j=j+1 if(j==5): i=i+1 j=0 print i a=f.read(1) def moveForward(self, task): curX=0 curY=0 shipCollided=0 c=self.timer-int(task.time) self.textTimer.setText('\1red\1\1slant\1Time Left : '+str(int(c/60))+':'+str(c%60)) if base.mouseWatcherNode.hasMouse(): curX=base.mouseWatcherNode.getMouseX() curY=base.mouseWatcherNode.getMouseY() #if(curY>self.prevY+0.01): self.acceleration = self.acceleration+1 #if(curY<self.prevY-0.01): # self.acceleration = self.acceleration-1 if(self.acceleration<45 and self.acceleration>=0): self.velocity=self.acceleration*task.time self.yPos=self.velocity * task.time self.ship.setY(self.yPos) if self.prevX<curX-0.001: self.ship.setHpr(0,0,5) #Sequence(self.ship.hprInterval(0.1,Point3(0,0,10),self.ship.getHpr())).start() self.ship.setX(curX*8) self.prevX=curX elif self.prevX>curX+0.001: self.ship.setHpr(0,0,-5) #Sequence(self.ship.hprInterval(0.1,Point3(0,0,-10),self.ship.getHpr())).start() self.ship.setX(curX*8) self.prevX=curX else: #self.ship.setHpr(0,0,0) Sequence(self.ship.hprInterval(0.1,Point3(0,0,0),self.ship.getHpr())).start() #print yPos self.camera.setPos(0,self.yPos-25,4) #self.slnp.setPos(0,self.yPos+20,4) self.cTrav.traverse(render) entries = [] for i in range(self.shipGroundHandler.getNumEntries()): entry = self.shipGroundHandler.getEntry(i) entries.append(entry) entries.sort(lambda x,y: cmp(y.getSurfacePoint(render).getZ(), x.getSurfacePoint(render).getZ())) if (len(entries)>0) and (entries[0].getIntoNode().getName() == "Cube"): self.zPosition=entries[0].getSurfacePoint(render).getZ() #self.ship.setZ(entries[0].getSurfacePoint(render).getZ()+1) print str(self.zPosition) + " "+str(self.ship.getZ()) if self.zPosition>=self.ship.getZ(): shipCollided=1 self.isGameOver=1 else: shipCollided=0 self.collided=1 print entries[0].getIntoNode().getName() + "collided" elif (len(entries)>0) and (entries[0].getIntoNode().getName() == "Junk"): pZ=entries[0].getSurfacePoint(render).getZ() if(self.ship.getZ()<=pZ and self.ship.getZ()>=pZ-2): entries[0].getIntoNode().getParent(0).removeAllChildren() self.score=self.score+1000 self.timer=self.timer+20 self.textScore.setText('\1red\1\1slant\1Score : '+str(self.score)) self.mySound.play() print self.score else: self.collided=0 if shipCollided!=1: val=0 if(self.jumpOn==1): val=10 if(self.interval==0): self.interval=task.time self.curZ=self.ship.getZ() self.jumpTime=0 else: self.jumpTime=self.jumpTime+task.time-self.interval self.interval=task.time zPos = self.curZ + val*self.jumpTime - 12*self.jumpTime*self.jumpTime if(zPos<self.zPosition+1 and self.collided==1): zPos=self.zPosition+1 self.ship.setZ(zPos) self.accept("mouse1",self.jump) self.jumpOn=0 self.interval=0 else: self.ship.setZ(zPos) if zPos<-40: self.isGameOver=1 self.prevX=curX self.prevY=curY self.score=self.score+1 self.textScore.setText('\1red\1\1slant\1Score : '+str(self.score)) if(self.isGameOver==1): props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.imageObject = OnscreenImage(image = 'earth.jpg', pos = (0, 1, 0)) self.imageObject.setScale(1.9,1,1) self.textObject = OnscreenText(text = '\1red\1\1roman\1\1slant\1Space Collector', pos = (-0.6, 0.4), scale = 0.2) self.b = DirectButton(text = ("Start", "Start", "Start", "disabled"),command=self.beginGame) self.b.setScale(0.1,0.1,0.1) self.b.setPos(0.7,0,-0.8) self.ship.setPos(0,0,0) self.zPosition=0 self.prevY=0 self.prevX=0 self.collided=1 self.jumpTime=0 self.jumpOn=0 self.curZ=0 self.interval=0 self.zPosition=0 self.isGameOver=0 self.score=0 self.acceleration=0 self.velocity=0 self.yPos=0 self.score=0 self.timer=120 self.textTimer.destroy() self.textScore.destroy() for x in self.junk: if(x!=None): x.detachNode() x=None print 'destroyed' self.loadJunk() else: return Task.cont def jump(self): self.jumpOn=1 self.ignore("mouse1")
class Unit: def __init__(self, unitID, position, mainClass): # self = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main['units'][unitID]]) self.model = mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].model self.fullName = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].fullName) self.HP = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].HP) self.info = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].info) self.moveType = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].moveType) self.model = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].model) self.radius = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].radius) self.mass = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].mass) self.startForce = copy.copy( mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].startForce ) self.maxForce = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].maxForce) self.dig = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].dig) self.reinforce = copy.copy( mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].reinforce ) self.shovel = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].shovel) self.hold = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].hold) self.modelHeight = copy.copy( mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].modelHeight ) self.selectScale = copy.copy( mainClass.unitHandler.unitDict[mainClass.unitHandler.main["units"][unitID]].selectScale ) self.job = False self.uID = mainClass.unitHandler.unitUniqueID print self.uID self.modelNode = loader.loadModel(self.model) self.modelNode.setName("unit " + str(self.uID).zfill(3)) self.modelNode.reparentTo(render) self.modelNode.setPos(position) self.modelNode.setCollideMask(BitMask32.bit(1)) self.select = OnscreenImage(image="data/models/game/selected.png") self.select.setScale(float(self.selectScale)) self.select.reparentTo(self.modelNode) self.select.setZ(float(self.modelHeight) / 2) self.select.setTransparency(TransparencyAttrib.MAlpha) self.select.setBillboardPointEye() self.select.hide() self.groundRay = CollisionRay() self.groundRay.setOrigin(0, 0, 100) self.groundRay.setDirection(0, 0, -1) self.groundCol = CollisionNode("unit Ray") self.groundCol.addSolid(self.groundRay) self.groundCol.setTag("units", "ray1") self.groundCol.setFromCollideMask(BitMask32.bit(0)) self.groundCol.setIntoCollideMask(BitMask32.allOff()) self.groundColNp = self.modelNode.attachNewNode(self.groundCol) self.groundColNp.setPos(0, 0, 0) self.groundHandler = CollisionHandlerFloor() self.groundHandler.setMaxVelocity(100) base.cTrav2.addCollider(self.groundColNp, self.groundHandler) self.groundHandler.addCollider(self.groundColNp, self.modelNode) self.AI = AICharacter(self.fullName, self.modelNode, self.mass * 2, self.startForce * 2, self.maxForce * 2) mainClass.unitHandler.AIWorld.addAiChar(self.AI) self.AIBehaviors = self.AI.getAiBehaviors() if self.moveType == "ground": self.aStar = astar.aStar(mainClass.unitHandler.meshes.landMesh, mainClass) elif self.moveType == "water": self.aStar = astar.aStar(mainClass.unitHandler.meshes.waterMesh, mainClass) elif self.moveType == "air": self.aStar = astar.aStar(mainClass.unitHandler.meshes.airMesh, mainClass) print self
class Engine(ShowBase): def __init__(self, mouse): ShowBase.__init__(self) self.mouse = mouse self.joy_x = None self.joy_y = None props = WindowProperties() props.setMouseMode(WindowProperties.MRelative) # keep mouse in screen self.disableMouse() self.win.requestProperties(props) self.setBackgroundColor(0, 0, 0) # Make missiles glow self.filters = CommonFilters(self.win, self.cam) self.filters.setBloom(blend=(0, 0, 0, 1), desat=-0.5, intensity=3.0, size="large") self.screen_width = self.win.getXSize() self.screen_height = self.win.getYSize() self.center_x = self.screen_width/2 self.center_y = self.screen_height/2 # self.win.movePointer(0, self.center_x, self.center_y) self.enableParticles() self.cTrav = CollisionTraverser() # self.cTrav.setRespectPrevTransform(True) self.pusher = PhysicsCollisionHandler() self.pusher.addInPattern('%fn-into-%in') self.target = None self.maxvel = 50 self.roll_time = 0 self.fuel = 1000 self.ship() self.sounds() self.hud() self.part = Spacedust(self) self.events() self.camLens.setFov(70) self.camLens.setNear(1) self.camLens.setFar(500) self.get_key = { "ACCEL": False, "DECEL": False, "FORWARD_THRUST": False, "REVERSE_THRUST": False, "ROLL_LEFT": False, "ROLL_RIGHT": False, "ROLL_LEFT_BEG": False, "ROLL_RIGHT_BEG": False, "FIRE": False, "FIRING": False, "LOCK": False, "LOCKING": False, } self.AIworld = AIWorld(self.render) self.taskMgr.add(self.update, "task-update") self.taskMgr.doMethodLater(1, self.fuel_usage, "task-fuel-usage") self.taskMgr.add(self.AI_update, "AI-update") self.gen_enemy() def gen_enemy(self): x = randint(-1000, 1000) y = randint(-1000, 1000) z = randint(-1000, 1000) Enemy(self, 0, x, y, z) def AI_update(self, task): self.AIworld.update() return task.cont def hud(self): self.font = self.loader.loadFont("./fnt/subatomic.tsoonami.ttf") self.aim = OnscreenImage(image="./png/ring.png", pos=Vec3(0), scale=0.02) self.aim.setTransparency(TransparencyAttrib.MAlpha) self.locker = OnscreenImage(image="./png/ring.png", pos=Vec3(0), scale=0.12) self.locker.setTransparency(TransparencyAttrib.MAlpha) self.locker.hide() self.txtFuel = OnscreenText(parent=self.render2d, align=TextNode.ALeft, pos=(-0.95, 0.8), text='FUEL', fg=(1, 1, 1, 0.5), scale=0.05, font=self.font, mayChange=True) self.txtSpeed = OnscreenText(parent=self.render2d, align=TextNode.ALeft, pos=(-0.95, 0.7), text='SPEED', fg=(1, 1, 1, 0.5), scale=0.05, font=self.font, mayChange=True) self.txtDist = OnscreenText(parent=self.render2d, align=TextNode.ALeft, pos=(-0.95, 0.6), text='DIST', fg=(1, 1, 1, 0.5), scale=0.05, font=self.font, mayChange=True) self.txtCoord = OnscreenText(parent=self.render2d, align=TextNode.ALeft, pos=(-0.95, 0.5), text='COORD', fg=(1, 1, 1, 0.5), scale=0.05, font=self.font, mayChange=True) self.taskMgr.doMethodLater(1, self.instruments, "task-instruments") def instruments(self, task): self.txtSpeed.setText("SPEED: %s" % str(int(self.mvel))) self.txtFuel.setText("FUEL: %s" % str(self.fuel)) if self.target is not None: self.txtDist.setText("DISTANCE: %s" % str(round(self.dist, 1))) else: self.txtDist.setText("DISTANCE: ---") self.txtCoord.setText("COORD: %s %s %s" % (str(round(self.fighter.getX(), 1)), str(round(self.fighter.getY(), 1)), str(round(self.fighter.getZ(), 1)))) return task.again def set_key(self, key, value): self.get_key[key] = value def toggle_key(self, key): self.set_key(key, not self.get_key[key]) def init_roll(self, a, task): if task.time <= 2: if self.roll_time <= task.time: self.roll_time = task.time else: self.roll_time += task.time if self.roll_time > 2: self.roll_time = 2 self.fighter.setR(self.fighter.getR() + a * self.roll_time) else: self.fighter.setR(self.fighter.getR() + a * 2) return task.cont def end_roll(self, a, b, task): if task.time < b: self.roll_time -= task.time if self.roll_time < 0: self.roll_time = 0 self.fighter.setR(self.fighter.getR() + a * (b - task.time)) return task.cont else: return task.done def roll(self, a): if a > 0: self.set_key("ROLL_RIGHT_BEG", True) else: self.set_key("ROLL_LEFT_BEG", True) self.taskMgr.add(self.init_roll, "task-init-roll", extraArgs=[a], appendTask=True) def unroll(self, a): if a > 0: self.set_key("ROLL_RIGHT_BEG", False) else: self.set_key("ROLL_LEFT_BEG", False) self.taskMgr.remove("task-init-roll") self.taskMgr.add(self.end_roll, "task-end-roll", extraArgs=[a, self.roll_time], appendTask=True) def to_roll(self): if self.get_key["ROLL_LEFT"]: if not self.get_key["ROLL_LEFT_BEG"]: if self.fuel > 5: self.roll(-1) self.snd_roller.play() else: if self.get_key["ROLL_LEFT_BEG"]: self.unroll(-1) self.snd_roller.stop() if self.get_key["ROLL_RIGHT"]: if not self.get_key["ROLL_RIGHT_BEG"]: if self.fuel > 5: self.roll(+1) self.snd_roller.play() else: if self.get_key["ROLL_RIGHT_BEG"]: self.unroll(+1) self.snd_roller.stop() def fuel_usage(self, task): if self.get_key["FORWARD_THRUST"] or self.get_key["REVERSE_THRUST"]: self.fuel -= 9 if self.get_key["ROLL_LEFT_BEG"] or self.get_key["ROLL_RIGHT_BEG"]: self.fuel -= 4 self.fuel -= 1 if self.fuel < 0: self.fuel = 0 return task.again def chk_speed(self, mvel): if mvel < 0.01: # stop fighter dead if self.prt.getActive(): self.set_key("DECEL", False) mvel = 0 if mvel > self.maxvel: # stop fighter accelerating if self.pft.getActive(): self.set_key("ACCEL", False) mvel = self.maxvel self.part.p.renderer.setLineScaleFactor(mvel*2) self.part.pn.setPos(self.fighter, 0, 10, 0) return mvel def thrust_shake(self, task): x = uniform(-1000, 1000) y = uniform(-1000, 1000) self.repos(x, y, 0.001) return task.cont def thrust_end(self, task): if task.time < 5: f = (5. - task.time) / 5. s = 1000.*f x = uniform(-s, s) y = uniform(-s, s) self.repos(x, y, 0.001) self.snd_thrust.setVolume(f) return task.cont self.snd_thrust.stop() return task.done def thrust(self, a): if a > 0: self.set_key("FORWARD_THRUST", True) else: self.set_key("REVERSE_THRUST", True) self.taskMgr.remove("task-thrust-end") self.snd_thrust.setVolume(1) self.snd_thrust.play() self.taskMgr.add(self.thrust_shake, "task-thrust-shake") def unthrust(self, a): if a > 0: self.set_key("FORWARD_THRUST", False) else: self.set_key("REVERSE_THRUST", False) self.taskMgr.remove("task-thrust-shake") self.taskMgr.add(self.thrust_end, "task-thrust-end") def to_thrust(self): if self.get_key["ACCEL"]: if self.mvel < self.maxvel - 1: if not self.get_key["FORWARD_THRUST"]: if self.fuel > 10: self.pft.setActive(True) self.thrust(+1) else: if self.get_key["FORWARD_THRUST"]: self.pft.setActive(False) self.unthrust(+1) if self.get_key["DECEL"]: if self.mvel > 0: if not self.get_key["REVERSE_THRUST"]: if self.fuel > 10: self.prt.setActive(True) self.thrust(-1) else: if self.get_key["REVERSE_THRUST"]: self.prt.setActive(False) self.unthrust(-1) def events(self): self.accept("escape", self.quit) self.accept('mouse1', self.set_key, ["FIRE", True]) self.accept('mouse1-up', self.set_key, ["FIRE", False]) self.accept('mouse3', self.set_key, ["LOCK", True]) self.accept('mouse3-up', self.set_key, ["LOCK", False]) self.accept("w", self.set_key, ["ACCEL", True]) self.accept("w-up", self.set_key, ["ACCEL", False]) self.accept("s", self.set_key, ["DECEL", True]) self.accept("s-up", self.set_key, ["DECEL", False]) self.accept("a", self.set_key, ["ROLL_LEFT", True]) self.accept("a-up", self.set_key, ["ROLL_LEFT", False]) self.accept("d", self.set_key, ["ROLL_RIGHT", True]) self.accept("d-up", self.set_key, ["ROLL_RIGHT", False]) def update(self, task): self.pos() self.speed() if self.fuel > 0: self.to_roll() self.to_thrust() self.to_fire() self.to_lock() self.rehud() return task.cont def rehud(self): if self.target is not None: c = self.target.np.getPos(self.fighter) self.dist = c.length() c.normalize() self.d2 = c - Vec3(0, 1, 0)*c.dot(Vec3(0, 1, 0)) self.target.radar.setPos(self.d2.getX(), 1, self.d2.getZ()) def sounds(self): self.audio3d = Audio3DManager.Audio3DManager(self.sfxManagerList[0], self.camera) self.audio3d.setListenerVelocityAuto() self.snd_space = self.loader.loadSfx("./snd/space.flac") self.snd_space.setLoop(True) self.snd_thrust = self.loader.loadSfx("./snd/thrust.flac") self.snd_thrust.setLoop(True) self.snd_roller = self.loader.loadSfx("./snd/roller.flac") self.snd_roller.setLoop(True) self.snd_launch = self.loader.loadSfx("./snd/launch.flac") self.snd_lock = self.loader.loadSfx("./snd/lock.flac") self.snd_space.play() def quit(self): self.taskMgr.running = False def repos(self, x, y, d): player_q = self.fighter.getQuat() up = player_q.getUp() right = player_q.getRight() up.normalize() right.normalize() up_q = copy(player_q) right_q = copy(player_q) up_q.setFromAxisAngle(-(x * d), up) right_q.setFromAxisAngle(y * d, right) self.fighter.setQuat(player_q.multiply(up_q.multiply(right_q))) def move_end(self, x, y, task): if task.time <= 1: d = 0.002*(1 - task.time) self.repos(x, y, d) return task.cont return task.done def pos(self): if self.mouse: md = self.win.getPointer(0) x = md.getX() y = md.getY() else: x = self.joy_x y = self.joy_y if self.win.movePointer(0, self.center_x, self.center_y): x -= self.center_x y -= self.center_y if x != 0 or y != 0: self.taskMgr.add(self.move_end, 'task-move-end', extraArgs=[x, y], appendTask=True) def speed(self): fwd = self.fighter.getQuat().getForward() fwd.normalize() self.mvel = self.anpo.getVelocity().length() # speed control self.mvel = self.chk_speed(self.mvel) self.anpo.setVelocity(fwd * self.mvel) def ship(self): an = ActorNode() an.getPhysicsObject().setMass(100) self.fighter = self.render.attachNewNode(an) self.physicsMgr.attachPhysicalNode(an) self.anpo = an.getPhysicsObject() fn = ForceNode("force-node-fighter") self.fighter.attachNewNode(fn) self.pft = LinearVectorForce(Vec3(0, +1, 0) * 500) # forward thrust self.prt = LinearVectorForce(Vec3(0, -1, 0) * 500) # reverse thrust self.pft.setMassDependent(1) self.prt.setMassDependent(1) self.pft.setActive(False) self.prt.setActive(False) fn.addForce(self.pft) fn.addForce(self.prt) an.getPhysical(0).addLinearForce(self.pft) an.getPhysical(0).addLinearForce(self.prt) self.camera.reparentTo(self.fighter) from_obj = self.fighter.attachNewNode(CollisionNode('fighter')) from_obj.node().setFromCollideMask(BitMask32(0x1)) from_obj.setCollideMask(BitMask32(0x1)) from_obj.node().addSolid(CollisionSphere(0, 0, 0, 1)) # from_obj.show() self.pusher.addCollider(from_obj, self.fighter) self.cTrav.addCollider(from_obj, self.pusher) def launch_bullet(self): speed = 500. scale = Vec3(0.05) color = Vec4(0, 1, 0, 1) mask = BitMask32(0x2) lookat = Vec3(0, 100, 0) Missile(self, "bullet", speed, scale, color, mask, self.fighter, Vec3(-0.5, 0, 0), self.fighter, lookat, 0.5) Missile(self, "bullet", speed, scale, color, mask, self.fighter, Vec3(+0.5, 0, 0), self.fighter, lookat, 0.5) self.snd_launch.play() def to_fire(self): if self.get_key["FIRE"]: if not self.get_key["FIRING"]: self.set_key("FIRING", True) self.taskMgr.doMethodLater(0.16, self.fire_bullet, "task-fire-bullet") else: if self.get_key["FIRING"]: self.set_key("FIRING", False) self.taskMgr.remove("task-fire-bullet") def fire_bullet(self, task): if self.fuel >= 5: self.fuel -= 5 self.launch_bullet() return task.again def launch_missile(self): speed = 100 scale = Vec3(0.2) color = Vec4(1, 0, 0, 1) mask = BitMask32(0x2) lookat = Vec3(0, 0, 0) self.missile = Missile(self, "missile", speed, scale, color, mask, self.fighter, Vec3(0, 0, -2), self.target.np, lookat, 3) self.snd_launch.play() self.taskMgr.add(self.guide_missile, "task-guide-missile") def guide_missile(self, task): try: quat = Quat() lookAt(quat, self.target.np.getPos() - self.missile.anp.getPos(), Vec3.up()) self.missile.anp.setQuat(quat) fwd = quat.getForward() fwd.normalize() mvel = self.missile.anpo.getVelocity().length() self.missile.anpo.setVelocity(fwd*mvel) except: return task.done return task.cont def can_lock(self): if self.dist >= 30 and self.dist <= 300 and abs(self.d2.getX()) <= 0.1 and abs(self.d2.getZ()) <= 0.1: return True else: return False def remove_lock(self): if self.get_key["LOCKING"]: self.set_key("LOCKING", False) self.locker.hide() self.snd_lock.stop() self.taskMgr.remove("task-fire-missile") def to_lock(self): if self.get_key["LOCK"]: if self.can_lock(): if self.fuel >= 100: if not self.get_key["LOCKING"]: self.set_key("LOCKING", True) self.locker.setScale(0.12) self.locker.setColor(1, 0, 0, 0.5) self.locker.show() self.snd_lock.play() self.taskMgr.add(self.fire_missile, "task-fire-missile") else: self.remove_lock() else: self.remove_lock() else: self.remove_lock() def fire_missile(self, task): if self.fuel >= 100: if task.time < 3.6: e = (3.6 - task.time)/3.6 f = 0.02 + e*0.1 self.locker.setScale(f) self.locker.setColor(e, 1-e, 0, 0.5) return task.cont else: self.fuel -= 100 self.launch_missile() return task.done
class LevelThree(object): def __init__(self, m): """ :param m: Menu """ self.levelName = "levelThree" self.gameState = '' m.game = self self.menu = m self.loadScene() if self.menu.tempPlayer is None: self.initCollision() self.initPlayer() else: print 'temp not none' self.node = self.menu.tempPlayer self.node.node.setPos(-250, 265, 20) self.node.game = self self.node.initMission() self.node.mission.memoryNum = self.menu.tempPlayer.mission.memoryNum # self.enmey = self.menu.tempPlayer.game.enemy self.enemy = Enemylevel2(self.node) self.node.node.setPos(200, 5, 20) base.accept("escape", self.pauseGame) base.disableMouse() props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.mutableMap = {} self.glowFilter() self.initMania() self.finalcard.reparentTo(hidden) self.initBag() self.menu.loadState = True self.menu.passFrame.show() self.node.erosionFrame.show() self.node.currentItemFrame.show() taskMgr.add(self.waitOne, "waitOne") self.setupskillpattern() self.setLight() def waitOne(self, task): if task.time < 1: self.menu.passFrame['frameColor'] = (0, 0, 0, 1 - task.time) return task.cont self.menu.passFrame['frameColor'] = (0, 0, 0, 0) self.menu.passFrame.hide() # self.beginPlot() return task.done def beginPlot(self): self.menu.tutorialDialog.show() props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.node.endTask() self.nextPlot(0) def nextPlot(self, index): if index == 1 or index == 0: self.menu.nextButton['text'] = self.node.mission.plotText[0][index] self.menu.nextButton['command'] = self.nextPlot self.menu.nextButton['extraArgs'] = [index + 1] elif index == 2: self.menu.ocanioButton['text'] = self.node.mission.plotText[0][index] self.menu.ocanioButton['command'] = self.nextPlot self.menu.ocanioButton['extraArgs'] = [index + 1] self.menu.tutorialDialog.hide() self.menu.ocanioDialog.show() elif index == 3: self.menu.nextButton['text'] = self.node.mission.plotText[0][index] self.menu.nextButton['command'] = self.node.mission.hideTutorial self.menu.nextButton['extraArgs'] = [] self.menu.tutorialDialog.show() self.menu.ocanioDialog.hide() def initBag(self): self.bagState = True self.bagText = "" if self.menu.tempPlayer is not None: self.node.bag = self.menu.tempPlayer.bag else: self.node.bag = Bag(self.node) base.accept("b", self.openBag) def openBag(self): # print 'b' if self.bagState: self.node.bag.bagframe.show() self.node.bag.showdisplay.setActive(True) self.node.bag.textObject.setText(self.bagText) self.bagState = not self.bagState props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.menu.selectDialog.hide() self.gameState = 'pause' self.node.state = 'pause' self.node.endTask() base.accept('escape', self.openBag) else: self.node.bag.bagframe.hide() self.node.bag.showdisplay.setActive(False) self.bagText = self.node.bag.textObject.getText() self.node.bag.textObject.setText("") self.node.bag.textObject.setWordwrap(0) self.bagState = not self.bagState props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) self.gameState = '' self.node.state = '' self.node.initTask() base.accept('escape', self.pauseGame) def initCollision(self): """ create the collision system """ base.cTrav = CollisionTraverser() base.pusher = CollisionHandlerPusher() base.cTrav.setRespectPrevTransform(True) def loadScene(self): """ load the self.sceneModel must have <Group> *something* { <Collide> { Polyset keep descend } in the egg file """ self.goodmanager = GoodsManager() # AddGoods(self,Node,CollisionName,Name,Interactive) self.goodmanager.AddGoods(loader.loadModel('res/models/Scene3/Scene3Cat/Scene3_Ver3.0_wall.egg'), ["Wall1", "Wall2", "floor"], "wall", False) self.goodmanager.AddGoods(loader.loadModel('res/models/Scene3/Scene3Cat/Scene3_light.egg'), ["light_box"], "light_box", False) ''' studyroom ''' prefix = 'res/models/Scene3/Scene3Cat/studyroom/Scene3_' self.loadIn(prefix + 'zhuozi.egg', "zhuozi_box", False) self.loadIn(prefix + 'biaoyu1.egg', "biaoyu1_box", True) self.loadIn(prefix + 'biaoyu2.egg', "biaoyu2_box", True) self.loadIn(prefix + 'biaoyu3.egg', "biaoyu3_box", True) self.loadIn(prefix + 'vaccine.egg', "vaccine_studyroom_box", True) self.loadIn(prefix + 'book_studyroom.egg', "book_studyroom_box", True) self.loadIn(prefix + 'bookshelf.egg', "bookshelf_box", True) ''' lab ''' prefix = 'res/models/Scene3/Scene3Cat/lab/Scene3_' self.loadIn(prefix + 'desk.egg', 'desk_box', False) # self.loadIn(prefix + 'bottle.egg', 'bottle_box', True) self.loadIn(prefix + 'emptybottle.egg', 'emptybottle_box', True) self.loadIn(prefix + 'biaoyu.egg', 'biaoyu_box', True) self.loadIn(prefix + 'labtable.egg', 'labtable_box', False) self.loadIn(prefix + 'notebook1.egg', 'notebook1_box', True) self.loadIn(prefix + 'notebook2.egg', 'notebook2_box', True) self.loadIn(prefix + 'notebook3.egg', 'notebook3_box', True) self.loadIn(prefix + 'pool.egg', 'pool_box', True) self.goodmanager.GoodsIta['pool_box'].Node.setTwoSided(True) ''' hall ''' prefix = 'res/models/Scene3/Scene3Cat/hall/Scene3_' self.loadIn(prefix + 'exit.egg', 'exit_box', True) self.loadIn(prefix + 'king.egg', 'king_box', False) self.loadIn(prefix + 'rook1.egg', 'rook1_box', False) self.loadIn(prefix + 'rook2.egg', 'rook2_box', False) self.loadIn(prefix + 'knight.egg', 'knight_box', False) self.loadIn(prefix + 'bishop.egg', 'bishop_box', False) self.loadIn(prefix + 'chessdesk.egg', 'chessdesk_box', True) self.goodmanager.GoodsIta["studydoor_box"] = Door(Vec3(-624.5253, -831.2924, 105.000), "studydoor_box", prefix + 'studydoor.egg', 90, Door.Out) self.goodmanager.GoodsIta["labdoor_box"] = Door(Vec3(-272.8592, 182.9539, 105.000), "labdoor_box", prefix + 'labdoor.egg', 90, Door.Out) self.goodmanager.GoodsIta["chessdoor_box"] = Door(Vec3(-837.2316, -684.3346, 105.000), "chessdoor_box", prefix + 'chessdoor.egg', 90, Door.Out) ''' chessroom ''' prefix = 'res/models/Scene3/Scene3Cat/chessroom/Scene3_' self.loadIn(prefix + 'key.egg', 'key_box', True) self.loadIn(prefix + 'zitiao.egg', 'zitiao_box', True) self.loadIn(prefix + 'paints.egg', 'paints_box', True) self.loadIn(prefix + 'pillar.egg', 'pillar_box', False) self.loadIn(prefix + 'midpillar.egg', 'midpillar_box', True) self.loadIn(prefix + 'vaccine1.egg', 'vaccine1_box', True) self.loadIn(prefix + 'vaccine2.egg', 'vaccine2_box', True) self.loadIn(prefix + 'book_chessroom.egg', 'book_chessroom_box', True) ''' elevator ''' prefix = 'res/models/Scene3/Scene3Cat/elevator/Scene3_' self.loadIn(prefix + 'leftdianti.egg', 'leftdianti_box', False) self.loadIn(prefix + 'rightdianti.egg', 'rightdianti_box', False) self.loadIn(prefix + 'diantikuang.egg', 'diantikuang_box', False) self.loadIn(prefix + 'elebutton.egg', 'elebutton_box', True) def loadIn(self, path, name, b): self.goodmanager.AddGoods(loader.loadModel(path), [name], name, b) def itemCollision(self, model, name, radius): nodePath = NodePath(name) node = CollisionNode(name) node.addSolid(CollisionSphere(20, 0, radius, radius)) solid = model.attachNewNode(node) nodePath.reparentTo(model) solid.show() base.cTrav.addCollider(solid, base.pusher) base.pusher.addCollider(solid, nodePath, base.drive.node()) def initPlayer(self): """ loads the player and creates all the controls for him""" self.node = Player(self.goodmanager, self.menu, self) # self.enemy = Enemy(self.node) # self.enemy = Enemylevel2(self.node) # self.goodmanager.GoodsIta["enemy"] = Enemy(self.node) # self.goodmanager.GoodsIta["enemy"].state = 1 def pauseGame(self): props = WindowProperties() props.setCursorHidden(False) base.win.requestProperties(props) self.menu.selectDialog.hide() self.gameState = 'pause' self.node.state = 'pause' self.node.endTask() self.node.erosionFrame.hide() self.node.currentItemFrame.hide() base.accept('escape', self.escapeEvent) base.accept('b', self.menu.nothing) self.menu.pauseFrame.show() def escapeEvent(self): self.menu.pauseFrame.hide() self.node.state = '' self.node.initTask() self.node.erosionFrame.show() self.node.currentItemFrame.show() base.accept('escape', self.pauseGame) base.accept('b', self.openBag) props = WindowProperties() props.setCursorHidden(True) base.win.requestProperties(props) def makeFilterBuffer(self, srcbuffer, name, sort, prog): blurBuffer = base.win.makeTextureBuffer(name, 512, 512) blurBuffer.setSort(sort) blurBuffer.setClearColor(LVector4(1, 0, 0, 1)) blurCamera = base.makeCamera2d(blurBuffer) blurScene = NodePath("new Scene") blurCamera.node().setScene(blurScene) shader = loader.loadShader(prog) card = srcbuffer.getTextureCard() card.reparentTo(blurScene) card.setShader(shader) return blurBuffer def glowFilter(self): glowShader = loader.loadShader("shaders/glowShader.sha") # dlight = DirectionalLight('dlight') # alight = AmbientLight('alight') # dlnp = render.attachNewNode(dlight) # alnp = render.attachNewNode(alight) # dlight.setColor(LVector4(0.3, 0.3, 0.3, 1)) # alight.setColor(LVector4(0.8, 0.8, 0.8, 1)) # dlnp.setHpr(0, -60, 0) # render.setLight(dlnp) # render.setLight(alnp) # create the glow buffer. This buffer renders like a normal scene, # except that only the glowing materials should show up nonblack. glowBuffer = base.win.makeTextureBuffer("Glow scene", 1024, 768) glowBuffer.setSort(-3) glowBuffer.setClearColor(LVector4(0, 0, 0, 1)) # We have to attach a camera to the glow buffer. The glow camera # must have the same frustum as the main camera. As long as the aspect # ratios match, the rest will take care of itself. self.glowCamera = base.makeCamera( glowBuffer, lens=base.cam.node().getLens()) # Tell the glow camera to use the glow shader tempnode = NodePath(PandaNode("temp node")) tempnode.setShader(glowShader) self.glowCamera.node().setInitialState(tempnode.getState()) self.glowCamera.node().setCameraMask(BitMask32.bit(0)) # set up the pipeline: from glow scene to blur x to blur y to main # window. blurXBuffer = self.makeFilterBuffer( glowBuffer, "Blur X", -2, "shaders/XBlurShader.sha") blurYBuffer = self.makeFilterBuffer( blurXBuffer, "Blur Y", -1, "shaders/YBlurShader.sha") self.finalcard = blurYBuffer.getTextureCard() self.finalcard.reparentTo(render2d) Attrib = ColorBlendAttrib.make(ColorBlendAttrib.MAdd, ColorBlendAttrib.O_incoming_alpha, ColorBlendAttrib.O_incoming_alpha) self.finalcard.setAttrib(Attrib) base.bufferViewer.setPosition("llcorner") base.bufferViewer.setLayout("hline") base.bufferViewer.setCardSize(0.652, 0) base.accept("tab", self.toggleGlow) self.glowOn = False def limitGlow(self, task): if task.time < 5: return task.cont else: self.glowOn = False self.finalcard.reparentTo(hidden) # self.goodmanager.GoodsIta["box"].CloseHighLight() return task.done def toggleGlow(self): self.showskillpattern("eyepattern") if self.glowOn: return self.glowOn = True taskMgr.add(self.limitGlow, "limitGlow") if self.node.EROSION + 10 > 100: self.node.EROSION = 100 else: self.node.EROSION += 10 self.finalcard.reparentTo(render2d) # self.goodmanager.GoodsIta["box"].OpenHighLight() def initMania(self): base.accept("space", self.mania) self.maniaState = False def mania(self): self.showskillpattern("maniapattern") if not self.maniaState: self.node.speed *= 1.4 self.maniaState = True if self.node.EROSION + 10 > 100: self.node.EROSION = 100 else: self.node.EROSION += 10 taskMgr.remove("fadeSpeed") taskMgr.add(self.fadeSpeed, "fadeSpeed") def fadeSpeed(self, task): if task.time < 10: return task.cont else: self.node.speed /= 1.4 self.maniaState = False return task.done def setupskillpattern(self): self.eyepattern = OnscreenImage(image="res/skill_icon/eye-white.png", pos=(-1.2, 1, -0.8)) self.eyepattern.setTransparency(TransparencyAttrib.MAlpha) self.eyepattern.setScale(0.1) self.eyepattern.setSa(0.8) self.eyepattern.hide() self.maniapattern = OnscreenImage(image="res/skill_icon/mania-white.png", pos=(-1.2 + 0.3, 1, -0.8)) self.maniapattern.setTransparency(TransparencyAttrib.MAlpha) self.maniapattern.setScale(0.1) self.maniapattern.setSa(0.8) self.maniapattern.hide() self.screen_patternArray = {} self.screen_patternArray["eyepattern"] = [self.eyepattern, False, 5.0, 5.0] self.screen_patternArray["maniapattern"] = [self.maniapattern, False, 10.0, 10.] self.patterntask = False self.patterntaskpretime = 0 # self.mouseIconNormal.setSa(0.5) def showskillpattern(self, patternname): self.screen_patternArray[patternname][2] = self.screen_patternArray[patternname][3] self.screen_patternArray[patternname][1] = True self.screen_patternArray[patternname][0].show() if self.patterntask == False: taskMgr.add(self.showskillpatterntask, "showskillpatterntask") self.patterntask = True def showskillpatterntask(self, task): num = 0 for key in self.screen_patternArray: if self.screen_patternArray[key][1] == True: self.screen_patternArray[key][2] -= globalClock.getDt() if self.screen_patternArray[key][2] < 5.: if sin(self.screen_patternArray[key][2] * pi * 5) > 0: self.screen_patternArray[key][0].setSa(0) else: self.screen_patternArray[key][0].setSa(0.8) self.screen_patternArray[key][0].setPos(-1.2 + num * 0.3, 1, -0.8) if self.screen_patternArray[key][2] < 0: self.screen_patternArray[key][1] = False self.screen_patternArray[key][0].hide() self.screen_patternArray[key][0].setSa(0.8) num += 1 if num > 0: return task.cont self.patterntask = False return def setLight(self): render.setLightOff() alight=AmbientLight("alight") alnp=render.attachNewNode(alight) alight.setColor(VBase4(0.1,0.1,0.1,1)) render.setLight(alnp) self.lightpivot1 = render.attachNewNode("lightpivot1") self.lightpivot1.setPos(-371, -94, 100) self.plight1 = PointLight('plight1') self.plight1.setColor(VBase4(1, 0.5, 0, 1)) self.temp = LVector3(0.6, 0.08, 0) self.plight1.setAttenuation(self.temp) plnp1 = self.lightpivot1.attachNewNode(self.plight1) # plnp1.setPos(0, 0, 50) render.setLight(plnp1) # render.setShaderAuto() self.lightpivot2 = render.attachNewNode("lightpivot2") self.lightpivot2.setPos(131, -22, 100) self.plight2 = PointLight('plight2') self.plight2.setColor(VBase4(1, 0.5, 0, 1)) self.temp = LVector3(0.6, 0.1, 0) self.plight2.setAttenuation(self.temp) plnp2 = self.lightpivot2.attachNewNode(self.plight2) # plnp1.setPos(0, 0, 50) render.setLight(plnp2) self.lightpivot3 = render.attachNewNode("lightpivot3") self.lightpivot3.setPos(-426, -937, 100) self.plight3 = PointLight('plight3') self.plight3.setColor(VBase4(1, 0.5, 0, 1)) self.temp = LVector3(0.6, 0.1, 0) self.plight3.setAttenuation(self.temp) plnp3 = self.lightpivot3.attachNewNode(self.plight3) # plnp1.setPos(0, 0, 50) render.setLight(plnp3) self.lightpivot4 = render.attachNewNode("lightpivot4") self.lightpivot4.setPos(-1313, -532, 100) self.plight4 = PointLight('plight3') self.plight4.setColor(VBase4(1, 0.5, 0, 1)) self.temp = LVector3(0.6, 0.1, 0) self.plight4.setAttenuation(self.temp) plnp4 = self.lightpivot4.attachNewNode(self.plight4) # plnp1.setPos(0, 0, 50) render.setLight(plnp4) slight = PointLight('slight') slight.setColor(VBase4(0.1, 0.5, 0.1, 1)) # # slight.setAttenuation(LVector3(0.5,0.08,0)) # lens = PerspectiveLens() # lens.setFov(10) # slight.setLens(lens) self.chessdesk=self.goodmanager.GoodsIta["chessdesk_box"].Node slnp = self.chessdesk.attachNewNode(slight) slnp.setPos(-486,-320,1000) # slnp.lookAt(self.goodmanager.GoodsIta["chessdesk_box"].Node) self.chessdesk.setLight(slnp)
class Proyecto(ShowBase): def __init__(self): ShowBase.__init__(self) self.disableMouse() #Instrucciones self.ralph_escape = addInstructions(.06, "[ESC]: Para Salir") self.ralph_run = addInstructions(.12, "[A]: Para Correr") self.ralph_saluda = addInstructions(.18, "[S]: Para Saludar") self.ralph_giraD = addInstructions(.24, "[E]: Girar a la derecha") self.ralph_giraI = addInstructions(.30, "[Q]: Girar a la izquierda") # Carga de Actor """self.Ralph = Actor("models/ralph", {"run": "models/ralph-run", "walk": "models/ralph-walk"}) self.Ralph.setScale(.5,.5,.5) self.Ralph.reparentTo(self.render) self.Ralph.setPos(0,10,-1) # X,Y,Z""" # Carga de imágenes self.Perro = OnscreenImage(image='src/images/Dog.png') self.Vaca = OnscreenImage(image='src/images/Cow.png') self.Leon = OnscreenImage(image='src/images/Lion.png') self.Perro.setScale(.2, .2, .2) self.Vaca.setScale(.2, .2, .2) self.Leon.setScale(.2, .2, .2) self.Perro.setPos(-1, 0, 0) self.Vaca.setPos(0, 0, 0) self.Leon.setPos(1, 0, 0) # Carga de audio self.audioPerro = loader.loadSfx("src/sounds/Dog.mp3") self.audioPerro.play() #self.audioPerro.play() # Definir articulaciones con Joint """self.BrazoDerecho = self.Ralph.controlJoint(None, 'modelRoot', 'RightShoulder') self.BrazoIzquierdo = self.Ralph.controlJoint(None, 'modelRoot', 'LeftShoulder') # Movimientos con el brazo derecho self.moverBrazoDerechoAbajo = self.BrazoDerecho.hprInterval(1.0, Point3(72.2059, 106.186,-45)) self.moverBrazoDerechoArriba = self.BrazoDerecho.hprInterval(1.0, Point3(72.2059, 76.186, 6.02231)) self.Secuencia1 = Sequence(self.moverBrazoDerechoAbajo, self.moverBrazoDerechoArriba) # Movimientos con el brazo izquierdo self.moverBrazoIzquierdoAbajo = self.BrazoIzquierdo.hprInterval(1.0, Point3(160.1401, -22.1706, 6.55722)) self.moverBrazoIzquierdoArriba = self.BrazoIzquierdo.hprInterval(1.0, Point3(80.1401, -52.1706, 6.55722)) self.Secuencia2 = Sequence(self.moverBrazoIzquierdoAbajo, self.moverBrazoIzquierdoArriba) # Movimientos paralelos self.Paralelo = Parallel(self.Secuencia1, self.Secuencia2)""" # Add Eventos self.accept("escape", sys.exit) self.accept("a", self.ralphRun) self.accept("s", self.ralphSaluda) self.accept("q", self.ralphGiraI) self.accept("e", self.ralphGiraD) def ralphRun(self): self.Ralph.loop("run") def ralphSaluda(self): if self.Paralelo.isPlaying(): self.Paralelo.finish() else: self.Paralelo.loop() def ralphGiraI(self): i = self.Ralph.getH() self.Ralph.setHpr(i - 10, 0, 0) def ralphGiraD(self): i = self.Ralph.getH() self.Ralph.setHpr(i + 10, 0, 0)
class DemoBase(ShowBase, ABC): def __init__(self): super().__init__() # Allow panda to synthesize shaders. Make sure hardware-animated-vertices is set # to true in panda config. render.setShaderAuto() # Show FPS self.setFrameRateMeter(True) # Load character self.character = Actor('data/character/character') self.character.reparentTo(self.render) self.joints = [] for name in JOINT_NAMES: j = self.character.controlJoint(None, 'modelRoot', name) j.reparentTo(self.render) self.joints.append(j) # Add lights dlight = core.DirectionalLight('DirectionalLight') dlight.setDirection(core.LVector3(2, 0, -1)) dlight.setColor(core.LColor(1, 1, 1, 1)) dlnp = self.render.attachNewNode(dlight) self.render.setLight(dlnp) alight = core.AmbientLight('AmbientLight') alight.setColor(core.LColor(0.6, 0.6, 0.6, 1)) alnp = self.render.attachNewNode(alight) self.render.setLight(alnp) # Camera angle in xy-plane (degrees) self.camera_angle = 0 # Camera control self.cam_left_pressed, self.cam_right_pressed = 0, 0 self.accept('a', self.set_cam_left_pressed, [1]) self.accept('a-up', self.set_cam_left_pressed, [0]) self.accept('d', self.set_cam_right_pressed, [1]) self.accept('d-up', self.set_cam_right_pressed, [0]) # Pad display self.pad_radius = 60 self.pad_outline = OnscreenImage('project/data/pad/pad_outline.png', (0, 0, 0)) self.pad_outline.setTransparency(core.TransparencyAttrib.MAlpha) self.pad_outline.hide() self.pad_response_circle = OnscreenImage( 'project/data/pad/pad_response_indicator.png', (0, 0, 0)) self.pad_response_circle.setTransparency( core.TransparencyAttrib.MAlpha) self.pad_response_circle.hide() self.accept('window-event', self.handle_window_event) # Pad control self.mouse1_pressed, self.controlling_pad = False, False self.accept('mouse1', self.set_mouse1_pressed, [True]) self.accept('mouse1-up', self.set_mouse1_pressed, [False]) # Load terrain self.heightmaps = {} self.set_heightmap('hmap2', 'project/data/heightmaps/hmap2.npy') # Heightmap choice self.accept('1', self.set_heightmap, ['hmap1', 'project/data/heightmaps/hmap1.npy']) self.accept('2', self.set_heightmap, ['hmap2', 'project/data/heightmaps/hmap2.npy']) self.accept('3', self.set_heightmap, ['hmap3', 'project/data/heightmaps/hmap3.npy']) self.accept('4', self.set_heightmap, ['hmap4', 'project/data/heightmaps/hmap4.npy']) self.accept('5', self.set_heightmap, ['hmap5', 'project/data/heightmaps/hmap5.npy']) # Tasks self.taskMgr.add(self.update_pad, 'UpdatePadTask', sort=1) self.last_update_char_time = 0 self.taskMgr.add(self.update_character, 'UpdateCharacterTask', sort=2) self.last_update_cam_time = 0 self.taskMgr.add(self.update_camera, 'UpdateCameraTask', sort=3) def set_cam_left_pressed(self, val): self.cam_left_pressed = val def set_cam_right_pressed(self, val): self.cam_right_pressed = val def set_mouse1_pressed(self, val): self.mouse1_pressed = val if self.mouse1_pressed and self.mouseWatcherNode.hasMouse(): mpos = self.screen_coords_to_pixels( self.mouseWatcherNode.getMouse()) diff = mpos - self.pad_center self.controlling_pad = diff.lengthSquared() <= self.pad_radius**2 else: self.controlling_pad = False def handle_window_event(self, window): self.window_w, self.window_h = window.getSize() min_dim = min(self.window_w, self.window_h) self.pad_radius = min_dim * 0.1 if self.window_w < 1300: self.pad_center = core.LVector2(min_dim * 0.15, min_dim * 0.15) else: self.pad_center = core.LVector2(self.window_w * 0.75, self.window_h * 0.5) self.pad_outline.setPos(self.pixels_to_im_coords(self.pad_center)) self.pad_outline.setScale(2 * self.pad_radius / min_dim) self.pad_outline.show() self.pad_response_circle.setScale(0.2 * self.pad_radius / min_dim) # Propagate event self.windowEvent(window) # Converts from screen coords in the [-1, 1] range to pixel coords def screen_coords_to_pixels(self, point): x_frac, y_frac = (point + 1.0) / 2.0 return core.LVector2(x_frac * self.window_w, (1 - y_frac) * self.window_h) # Converts from pixel coords to coords that can be passed in to OnscreenImage.setPos() def pixels_to_im_coords(self, point): px, py = point px, py = px - self.window_w / 2, py - self.window_h / 2 return core.LVector3(px, 0, -py) * (2.0 / min(self.window_w, self.window_h)) def update_pad(self, task): if self.controlling_pad and self.mouseWatcherNode.hasMouse(): mpos = self.screen_coords_to_pixels( self.mouseWatcherNode.getMouse()) pad_input = (mpos - self.pad_center) * PAD_SENSITIVITY if pad_input.lengthSquared() > 1: pad_input.normalize() resp_circle_pos = self.pad_center + pad_input * (self.pad_radius * 0.9) self.pad_response_circle.setPos( self.pixels_to_im_coords(resp_circle_pos)) self.pad_response_circle.show() else: pad_input = core.LVector2() self.pad_response_circle.hide() pad_input.setY(-pad_input.getY()) # flip y self.pad_input = pad_input return Task.cont def set_joint_global_xforms(self, global_xforms): # Invert global transforms inverse_global_xforms = [None] * NUM_JOINTS for i in PARENT_JOINTS: inverse_global_xforms[i] = core.LMatrix4() inverse_global_xforms[i].invertAffineFrom(global_xforms[i]) # Use each joint's global xform and the inverse of its parent's global xform to # compute and apply its local xform self.joints[0].setMat(global_xforms[0]) for i in range(1, NUM_JOINTS): local_xform = global_xforms[i] * inverse_global_xforms[ JOINT_PARENTS[i]] self.joints[i].setMat(local_xform) def update_character(self, task): dt = task.time - self.last_update_char_time self._update_character(task.time, dt) self.character.setPos(self.char_pos) self.set_joint_global_xforms([ core.LMatrix4(*m) for m in self.joint_global_xforms.reshape(31, 16) ]) self.last_update_char_time = task.time return Task.cont @abstractmethod def _update_character(self, t, dt): '''Should set self.char_pos and self.joint_global_xforms.''' raise NotImplementedError() def update_camera(self, task): dt = task.time - self.last_update_cam_time # Update camera angle self.camera_angle += 90 * (self.cam_right_pressed - self.cam_left_pressed) * dt # Reposition camera ang_rads = self.camera_angle * pi / 180 cam_offset = core.LVector3(300 * cos(ang_rads), 300 * sin(ang_rads), 320) self.camera.setPos(self.char_pos + cam_offset) self.camera.lookAt(self.char_pos + core.LVector3(0, 0, 80), core.LVector3(0, 0, 1)) self.last_update_cam_time = task.time return Task.cont def set_heightmap(self, name, fname): if name not in self.heightmaps: self.heightmaps[name] = Heightmap(name, fname, self.render) reset = False if hasattr(self, 'heightmap'): self.heightmap.model_np.stash() reset = True self.heightmap = self.heightmaps[name] self.heightmap.model_np.unstash() if reset: self.reset_level() def reset_level(self): self.camera_angle = 0 self.char_pos = core.LVector3()
class initGame(): def __init__(self, windowProps, user, connection): self.user = user self.connection = connection render.setShaderAuto() self.wp = windowProps # keeps the game running the same on all systems (kinda sorta barely)# FPS = 60 globalClock = ClockObject.getGlobalClock() globalClock.setMode(ClockObject.MLimited) globalClock.setFrameRate(FPS) globalClock.setMaxDt(1) self.world = BulletWorld() self.fakeNode = render.attachNewNode("fakeNode") self.initFakeGui() self.playIntroLevelMusic() self.initBullet() self.initScore() self.initCollisions() self.loadPlayer() self.createCamera(self.player.np) self.parseLevelFile("Home") self.getLevelBounds() self.startTime() self.createLight() self.loadSkyBox() self.loadControls() #self.parseStory() colour = (0.5,0.8,0.8) expfog = Fog("Scene-wide exponential Fog object") expfog.setColor(*colour) expfog.setExpDensity(0.0005) render.setFog(expfog) base.setBackgroundColor(*colour) base.camLens.setFar(1000) def playIntroLevelMusic(self): self.music = Music("play","./sounds/batfeet.mp3", .1, True) def getLevelBounds(self): self.levelNodeBounds = render.find("renderDummy").getBounds() def parseStory(self): self.story = StoryParser("./stories/Story.txt") def searchDirectories(self): for root, dirs, files in os.walk("./"): for name in files: if name.endswith((".txt")): print(name) for name in dirs: if name == "textures": for root, dirs, files in os.walk(name): for name in files: if name.endswith(".jpg"): print(name) def initFakeGui(self): self.menuBar = OnscreenImage(image = './graphics/MenuBar.png', pos = (0,0,-.94)) self.userText = OnscreenText(text = self.user, pos = (-1.05, -.9625), scale = 0.1) self.menuBar.setScale(1.625, 1, .0625) def initScore(self): self.scoreHandler = ScoreHandler() def initCollisions(self): self.collisions = pCollisions(self.scoreHandler, self.music) def parseLevelFile(self, arg): if arg == "Home": self.parsedLevel = LevelParser("./levels/HomeLevel.txt", self.collisions, self.player.np, self.world, self.scoreHandler) def startTime(self): self.time = KeepTime() def initBullet(self): self.world.setGravity(Vec3(0, 0, -9.81)) self.debugNode = BulletDebugNode('Debug') self.debugNode.showWireframe(True) self.debugNode.showConstraints(True) self.debugNode.showBoundingBoxes(False) self.debugNode.showNormals(False) self.debugNP = render.attachNewNode(self.debugNode) self.world.setDebugNode(self.debugNP.node()) def loadSkyBox(self): self.skyBox = SkyBox("Box") def createCamera(self, nodePath): self.camera = gameCamera(nodePath, self.world, self.collisions) def loadControls(self): #args order = bullet update loop, bullet debug node, camera, windowProps, player class, spotLightNode, windowProps, timerTask, bulletWorld, collisions# self.controlHandler = ControlHandler(self.update, self.debugNP, self.camera, self.wp, self.player, self.time.timerTask, self.world, self.collisions, self.music) def loadPlayer(self): self.player = Player(self.collisions, "sphere", self.world, self.music, self.scoreHandler) #self.player = Player("sphere", self.world, 0, 0, 16) def createLight(self): self.lightSource = GameLight(self.player.np) def update(self, task): ############################################## # #BULLET UPDATE# # ############################################## dt = globalClock.getDt() #self.dtTimer() self.world.doPhysics(dt*2, 7) ############################################# # #CAMERA UPDATE# # ############################################# self.camera.cn.setPos(self.player.np.getPos()) #self.fakeNode.setPos(self.player.np.getPos()) self.camera.hNode.setPos(self.player.np.getPos()) self.camera.pNode.setPos(self.player.np.getPos()) self.camera.cn.setP(self.camera.pNode.getP()) self.camera.cn.setH(self.camera.hNode.getH()) pointer = base.win.getPointer(0) pointerX = pointer.getX() pointerY = pointer.getY() if base.win.movePointer(0, base.win.getXSize()/2, base.win.getYSize ()/2): if self.camera.inverted == "yes": Pitch = -((pointerY - base.win.getYSize()/2)*.1) else: Pitch = ((pointerY - base.win.getYSize()/2)*.1) Heading = -((pointerX - base.win.getXSize()/2)*.1) #endValue = 0 #endValue += Pitch self.camera.pNode.setP(self.camera.pNode, Pitch) self.camera.hNode.setH(self.camera.hNode, Heading) #self.fakeNode.setH(self.fakeNode, Heading) ############################################# # #PLAYER UPDATE# # ############################################# force = Vec3(0, 0, 0) if inputState.isSet('up'): force.setY(10.0) if inputState.isSet('down'): force.setY(-10.0) if inputState.isSet('left'): force.setX(-10.0) if inputState.isSet('right'): force.setX(10.0) #force *= 10 force = render.getRelativeVector(self.camera.cn, force) self.player.np.node().setActive(True) self.player.np.node().applyCentralForce(force) #self.player.np.setColor(random.random(), random.random(), random.random(), random.random()) if self.player.np.getZ() < 0 - (self.levelNodeBounds.getRadius() * 6): self.player.np.setPos(self.collisions.level.spawn) self.player.np.node().setLinearVelocity(Vec3(0,0,0)) return task.cont
class RightMenu: """ Add comment. """ def __init__(self): self.visible_x_np = None self.visible_y_np = None self.visible_z_np = None self.filter_label_np = None self.dims_parent_np = None # Dictionary for the tagset/dims self.dimensionCards = {} # Member variable for dimension/filter context menu. self.selected_tagset_id = None self.selected_hierarchy_id = None self.selected_filter_id = None # Create nodepath for the menu. self.right_menu_node_path = camera.attachNewNode( 'right_menu_node_path') self.right_menu_node_path.setY(3) # Flag for right menu visability. self.is_visable = True # Create background for the menu. self.bg = OnscreenImage(image='static/images/box.tif') self.bg.setTransparency(TransparencyAttrib.MAlpha) self.bg.setAlphaScale(0.24) self.bg.setScale(1, 2, 2) # start the placement task for menu placement. base.taskMgr.add(self.__placement, 'menuplacement_left_panel') # Collections of cards. Used for card highlighting. self.cards = dict() # How many dimensions should we show in the dimension list? self.max_dimension_visable_in_menu = 10 # Member variable for the dimensions scrollbar if needed. self.dimension_scrollbar = None # Create all the objects for this menu. self.__initalize_objects() self.__createTagsetAndHierarchyLabels() self.__register_view_menu_messages() # Create instance of filter menu. self.filter_menu = FilterMenu(np=self.right_menu_node_path, begin_pos=self.last_dim_pos) # Events that we are interested in. base.accept(CUBE_MENU_RELOAD_FILTERS, self.reload_filter2) base.accept(TAGSET_BTN_CLICK, self.btn_dimensions) base.accept(HIERARCHY_BTN_CLICK, self.btn_hierarchy) base.accept(SEARCH_BTN_CLICK, self.btn_search) base.accept(FILTER_BTN_CLICK, self.btn_filters) base.accept(CUBE_MENU_OVERVIEW_X_BUTTON_CLICK, self.btn_x_view) base.accept(CUBE_MENU_OVERVIEW_Y_BUTTON_CLICK, self.btn_y_view) base.accept(CUBE_MENU_OVERVIEW_Z_BUTTON_CLICK, self.btn_z_view) base.accept(CUBE_MENU_RELOAD_DIMENSIONS, self.reloadDimensionLabels) def reloadDimensionLabels(self): """ Function for reloading the tagset/hir list. This function is called when tagset/hir is changed or new are added. """ self.__createTagsetAndHierarchyLabels() #self.reload() def __createTagsetAndHierarchyLabels(self): if self.dims_parent_np is not None: self.dims_parent_np.remove() if self.dimension_scrollbar is not None: self.dimension_scrollbar.remove() # Create labels for each tagset and hirs. card_pos = -1.1 index = 0 # List that contains the dimension cards. Used for scrolling the cards. self.dimension_list = [] #self.cards = dict() self.dims_parent_np = self.right_menu_node_path.attachNewNode( 'parent_dim_np') for tagset in photocube.objectcube.objectCubeService.getAllTagsets(): if (tagset.typeId == 1 or tagset.typeId == 5) and ( tagset.name[:5] != 'Rank:' and tagset.name[:5] != 'Dist:' ): #FOR MASTER PRESENTATION, NOT SHOWING SEARCH DIMENSION #print 'tagset.name: ' + tagset.name + 'tagset.typeId: ' + str(tagset.typeId) dim_np = self.dims_parent_np.attachNewNode('dim;tagset;' + str(tagset.id)) # Create a card to make the dimension clickable card_np = dim_np.attachNewNode('card-tagset-' + tagset.name) card_np = card_np.attachNewNode('card-x-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card') card = card_np.attachNewNode(cm.generate()) card.setScale(0.50, 1, 0.050) card.setPos(-2.045, -1.3, card_pos) card.setTwoSided(True) card.setColor(0, 0, 0) # Make the tagset cards clickable. base.accept( photocube.devices.mouse_handler.makeNPPickableRight( dim_np), self.on_tagset_right_click) base.accept( photocube.devices.mouse_handler.makeNPPickableLeft(dim_np), self.on_tagset_right_click) # Create a new node for the text label. t_node = card.attachNewNode('card-label' + tagset.name) t_node.setY(-0.001) t_node.setZ(1.35) t_node.setX(0.03) t = OnscreenText(text=tagset.name[0:43] + ' (tagset)', fg=(1, 1, 1, 1), parent=t_node, pos=(0, -1, -4), scale=(0.075, 0.73), align=TextNode.ALeft) # Make the dim button mouse over enabled. if dim_np.__str__() not in self.cards.keys(): self.cards[dim_np.__str__()] = card self.dimension_list.append(dim_np) messageHover, messageLeave = photocube.devices.mouse_handler.makeNPMouseHoverable( dim_np) # When created, the menu is hided. dim_np.hide() # Accept the hover messages. base.accept(messageLeave, self.mouse_leave) base.accept(messageHover, self.mouse_over) """ dim_np = self.dims_parent_np.attachNewNode('dim;tagset;' + str(tagset.id)) # Create a card to make the dimension clickable card_np = dim_np.attachNewNode('card-tagset-'+ tagset.name) card_np = card_np.attachNewNode('card-x-label-np') card_np.setPos(1,1.5,1.5) cm = CardMaker('card') card = card_np.attachNewNode(cm.generate()) card.setScale(0.50, 1, 0.050) card.setPos(-2.045, -1.3, card_pos) card.setTwoSided(True) card.setColor(0,0,0) # Make the tagset cards clickable. base.accept(photocube.devices.mouse_handler.makeNPPickableRight(dim_np), self.on_tagset_right_click) base.accept(photocube.devices.mouse_handler.makeNPPickableLeft(dim_np), self.on_tagset_right_click) # Create a new node for the text label. t_node = card.attachNewNode( 'card-label' + tagset.name ) t_node.setY(-0.001) t_node.setZ(1.35) t_node.setX(0.03) t = OnscreenText(text=tagset.name[0:43] + ' (tagset)', fg=(1,1,1,1), parent=t_node, pos=(0, -1, -4), scale=(0.075, 0.73), align=TextNode.ALeft) # Make the dim button mouse over enabled. if dim_np.__str__() not in self.cards.keys(): self.cards[ dim_np.__str__() ] = card self.dimension_list.append( dim_np ) messageHover,messageLeave = photocube.devices.mouse_handler.makeNPMouseHoverable( dim_np ) # When created, the menu is hided. dim_np.hide() # Accept the hover messages. base.accept(messageLeave, self.mouse_leave) base.accept(messageHover, self.mouse_over) """ # show the hir if tagset.name[:5] != 'Rank:' and tagset.name[:5] != 'Dist:': #FOR MASTER PRESENTATION, NOT SHOWING SEARCH DIMENSION for hir in tagset.getPersistentDimensions(): hir_np = self.dims_parent_np.attachNewNode('dim;hir;' + tagset.name + ';' + str(hir.id) + ';' + str(tagset.id)) # Create a card to make the dimension clickable card_np = hir_np.attachNewNode('card-tagset-' + tagset.name) card_np = card_np.attachNewNode('card-x-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card-hir') card = card_np.attachNewNode(cm.generate()) card.setScale(0.50, 1, 0.050) card.setPos(-2.045, -1.3, card_pos) card.setTwoSided(True) card.setColor(0, 0, 0) # Make the hierachy card clickable. base.accept( photocube.devices.mouse_handler.makeNPPickableRight( hir_np), self.on_hierarchy_right_click) base.accept( photocube.devices.mouse_handler.makeNPPickableLeft( hir_np), self.on_hierarchy_right_click) # Make the hierachy card hoverable. messageHover, messageLeave = photocube.devices.mouse_handler.makeNPMouseHoverable( hir_np) base.accept(messageHover, self.mouse_over) base.accept(messageLeave, self.mouse_leave) # Create a new node for the text label. t_node = card.attachNewNode('card-label' + tagset.name) t_node.setY(-0.001) t_node.setZ(1.35) t_node.setX(0.03) t = OnscreenText(text=hir.getRoot().name + ' (hierarchy)', fg=(1, 1, 1, 1), parent=t_node, pos=(0, -1, -4), scale=(0.075, 0.73), align=TextNode.ALeft) # Make the dim button mouse over enabled. if hir_np.__str__() not in self.cards.keys(): self.cards[hir_np.__str__()] = card self.dimension_list.append(hir_np) photocube.devices.mouse_handler.makeNPMouseHoverable( hir_np) # Create label for filters if len(self.dimension_list) < self.max_dimension_visable_in_menu: self.last_dim_pos = -0.025 * len(self.dimension_list) else: self.last_dim_pos = -0.25 self.dimension_scrollbar = DirectScrollBar( range=(0, math.ceil(len(self.dimension_list))), orientation=DGG.VERTICAL, command=self.on_dimension_scroll_change, scrollSize=5, pageSize=len(self.dimension_list) / 5, value=0) self.dimension_scrollbar.setScale(0.5, 1, 0.69) self.dimension_scrollbar['frameColor'] = (0.6, 0.6, 0.6, 0.8) # disable the click sound for the scrollbar. self.dimension_scrollbar[ 'incButton_clickSound'] = button_mouseclick_sound self.dimension_scrollbar['incButton_rolloverSound'] = None self.dimension_scrollbar[ 'decButton_clickSound'] = button_mouseclick_sound self.dimension_scrollbar['decButton_rolloverSound'] = None self.dimension_scrollbar['thumb_clickSound'] = None self.dimension_scrollbar['thumb_rolloverSound'] = None self.dimension_scrollbar['incButton_relief'] = None self.dimension_scrollbar['decButton_relief'] = None self.dimension_scrollbar['decButton_text'] = '-' self.dimension_scrollbar['decButton_text_scale'] = 0.07 self.dimension_scrollbar['incButton_text'] = '+' self.dimension_scrollbar['incButton_text_scale'] = (0.07, 0.05) self.dimension_scrollbar['incButton_text_pos'] = (-0.005, -0.02) self.dimension_scrollbar['decButton_text_pos'] = (-0.005, -0.02) self.dimension_scrollbar['thumb_frameColor'] = (0, 0, 0, 0.2) self.dimenion_scroll_value = self.dimension_scrollbar['value'] self.text_dims = OnscreenText(mayChange=True, text='Filters:', fg=(1, 1, 1, 1), parent=self.right_menu_node_path, pos=(-1.10, self.last_dim_pos, -10), scale=(0.040), align=TextNode.ALeft) # create nodepath for the filter labels self.filter_label_np = self.right_menu_node_path.attachNewNode( 'filter-label-np') self.current_dimension_index_left = 0 self.current_dimension_index_right = self.max_dimension_visable_in_menu - 1 self.show_dimension_tabs() def __initalize_objects(self): # refactored from the function for dims labels reload self.text_dims = OnscreenText(text='Dimensions:', fg=(1, 1, 1, 1), parent=self.right_menu_node_path, pos=(-1.10, 0.45, -10), scale=0.040, align=TextNode.ALeft) # Create a label for the menu. self.text_dims = OnscreenText(mayChange=True, text='Visible:', fg=(1, 1, 1, 1), parent=self.right_menu_node_path, pos=(-1.10, 0.74, -10), scale=(0.040), align=TextNode.ALeft) self.visible_x_np = self.right_menu_node_path.attachNewNode( 'np_visiable_x') self.visible_x_np.setPos(-0.50, 0, 0.85) self.visible_x_np.setScale(0.6) self.text_x = OnscreenText(mayChange=True, text=EMPTY_ON_FRONT, fg=(1, 1, 1, 1), parent=self.visible_x_np, align=TextNode.ALeft, pos=(-0.95, -0.29, -0.21), scale=0.075) # Create clicable card for x. card_np = self.visible_x_np.attachNewNode( 'card-x-label-np').attachNewNode('card-x-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card-x') card = card_np.attachNewNode(cm.generate()) card.setScale(0.8, 1, 0.1) card.setPos(-1.93, -1.3, -1.78) card.setTwoSided(True) card.setColor(0, 0, 0) # Make the x view nodepath clickable. self.curXDimRightClickMessage = mouse_handler.makeNPPickableRight( self.visible_x_np) self.curXDimLeftClickMessage = mouse_handler.makeNPPickableLeft( self.visible_x_np) # Make the x view nodepath mouseoverable and save the nodepath for making it glow. self.cards[self.visible_x_np.__str__()] = card leavemessage, hoverMessage = photocube.devices.mouse_handler.makeNPMouseHoverable( self.visible_x_np) base.accept(hoverMessage, self.mouse_leave) base.accept(leavemessage, self.mouse_over) # Create notepath for y self.visible_y_np = self.right_menu_node_path.attachNewNode( 'np_visiable_y') self.visible_y_np.setPos(-0.50, 0, 0.78) self.visible_y_np.setScale(0.6) self.text_y = OnscreenText(mayChange=True, text=EMPTY_ON_IN, fg=(1, 1, 1, 1), parent=self.visible_y_np, align=TextNode.ALeft, pos=(-0.95, -0.29, 0.21), scale=0.075) # Create clicable card for y. card_np = self.visible_y_np.attachNewNode( 'card-y-label-np').attachNewNode('card-y-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card-y') card = card_np.attachNewNode(cm.generate()) card.setScale(0.8, 1, 0.1) card.setPos(-1.93, -1.3, -1.78) card.setTwoSided(True) card.setColor(0, 0, 0) card.setTransparency(TransparencyAttrib.MAlpha) self.curYDimRightClickMessage = mouse_handler.makeNPPickableRight( self.visible_y_np) self.curYDimLeftClickMessage = mouse_handler.makeNPPickableLeft( self.visible_y_np) # Make the y view nodepath mouseoverable. self.cards[self.visible_y_np.__str__()] = card #TODO: Here is a good place to refactor. photocube.devices.mouse_handler.makeNPMouseHoverable(self.visible_y_np) base.accept('zoomout_render/camera/right_menu_node_path/np_visiable_y', self.mouse_leave) base.accept('zoomin_render/camera/right_menu_node_path/np_visiable_y', self.mouse_over) # Create notepath for z self.visible_z_np = self.right_menu_node_path.attachNewNode( 'np_visiable_z') self.visible_z_np.setPos(-0.50, 0, 0.71) self.visible_z_np.setScale(0.6) self.text_z = OnscreenText(mayChange=True, text=EMPTY_ON_UP, fg=(1, 1, 1, 1), parent=self.visible_z_np, align=TextNode.ALeft, pos=(-0.95, -0.28, 0.21), scale=0.075) # Create clicable card for y. card_np = self.visible_z_np.attachNewNode( 'card-z-label-np').attachNewNode('card-z-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card-z') card = card_np.attachNewNode(cm.generate()) card.setScale(0.8, 1, 0.1) card.setPos(-1.93, -1.3, -1.78) card.setTwoSided(True) card.setColor(0, 0, 0) card.setTransparency(TransparencyAttrib.MAlpha) self.curZDimRightClickMessage = mouse_handler.makeNPPickableRight( self.visible_z_np) self.curZDimLeftClickMessage = mouse_handler.makeNPPickableLeft( self.visible_z_np) # Make the z view nodepath mouseoverable. self.cards[self.visible_z_np.__str__()] = card photocube.devices.mouse_handler.makeNPMouseHoverable(self.visible_z_np) base.accept('zoomout_render/camera/right_menu_node_path/np_visiable_z', self.mouse_leave) base.accept('zoomin_render/camera/right_menu_node_path/np_visiable_z', self.mouse_over) def on_dimension_scroll_change(self): val = int(self.dimension_scrollbar['value']) #print 'val', val if val == self.dimenion_scroll_value: return elif val < self.dimenion_scroll_value: for n in range(self.dimenion_scroll_value - val): self.dim_menu_move_up() else: for n in range(val - self.dimenion_scroll_value): self.dim_menu_move_down() #self.dimenion_scroll_value = self.dimension_scrollbar['value'] self.dimenion_scroll_value = val def show_dimension_tabs(self): card_pos = 0 i = 0 for card in self.dimension_list: card.hide() card.setX(100) for r in range(self.current_dimension_index_left, len(self.dimension_list)): self.dimension_list[r].show() self.dimension_list[r].setZ(card_pos) self.dimension_list[r].setX(0) card_pos -= 0.06 i += 1 if i is self.max_dimension_visable_in_menu: break def dim_menu_move_down(self): r = len(self.dimension_list) - self.current_dimension_index_right if r > 1: self.current_dimension_index_left += 1 self.current_dimension_index_right += 1 self.show_dimension_tabs() def dim_menu_move_up(self): if self.current_dimension_index_left > 0: self.current_dimension_index_left -= 1 self.current_dimension_index_right -= 1 self.show_dimension_tabs() def btn_filters(self, index): self.filter_menu.btn_filters(index) def mouse_over(self, p): if not photocube.ui.coremenu.context_menu_handler.has_open_context(): #print 'here', p c = self.cards[p.__str__()] #print c self.current_glowing_card = c c.setColor(0.15, 0.15, 0.15) def mouse_leave(self, p): if not photocube.ui.coremenu.context_menu_handler.has_open_context(): c = self.cards[p.__str__()] c.setColor(0, 0, 0) self.current_glowing_card = None def clear_glow(self, f=None): if not photocube.ui.coremenu.context_menu_handler.has_open_context(): #print 'clear' self.clear_all_glowings() def clear_all_glowings(self): for key in self.cards.keys(): card = self.cards[key] card.setColor(0, 0, 0) self.current_glowing_card = None def btn_x_view(self, index): self.clear_glow() if index == 'view up': x = photocube.cube.cubeService.coordinate.get_x() if x is not None: messenger.send('dim_move_to_axis', [X_AXIS, Z_AXIS]) action = ActionAxis(ACTION_MOVE, X_AXIS, Z_AXIS) actionManager.addAction(action) if index == 'view in': x = photocube.cube.cubeService.coordinate.get_x() if x is not None: messenger.send('dim_move_to_axis', [X_AXIS, Y_AXIS]) action = ActionAxis(ACTION_MOVE, X_AXIS, Y_AXIS) actionManager.addAction(action) if index == "swap with up": messenger.send('x_dim_action_swap', [Z_AXIS]) # create action for the swap. action = ActionAxis(ACTION_SWAP, X_AXIS, Z_AXIS) actionManager.addAction(action) if index == "swap with in": messenger.send('x_dim_action_swap', [Y_AXIS]) # create action for the swap. action = ActionAxis(ACTION_SWAP, X_AXIS, Y_AXIS) actionManager.addAction(action) if index is 'clear': messenger.send('dim_action_clear', [X_AXIS]) action = ActionAxis(ACTION_CLEAR, X_AXIS) actionManager.addAction(action) def btn_y_view(self, index): """ This function is called when we select buttons in the view y context menu. """ self.clear_glow() if index == 'clear': messenger.send('dim_action_clear', [Y_AXIS]) action = ActionAxis(ACTION_CLEAR, Y_AXIS) actionManager.addAction(action) if index == 'view front': y = photocube.cube.cubeService.coordinate.get_y() if y is not None: messenger.send('dim_move_to_axis', [Y_AXIS, X_AXIS]) action = ActionAxis(ACTION_MOVE, Y_AXIS, X_AXIS) actionManager.addAction(action) if index == 'view up': y = photocube.cube.cubeService.coordinate.get_y() if y is not None: messenger.send('dim_move_to_axis', [Y_AXIS, Z_AXIS]) action = ActionAxis(ACTION_MOVE, Y_AXIS, Z_AXIS) actionManager.addAction(action) if index == "swap with front": messenger.send('y_dim_action_swap', [X_AXIS]) action = ActionAxis(ACTION_SWAP, Y_AXIS, X_AXIS) actionManager.addAction(action) if index == "swap with up": messenger.send('y_dim_action_swap', [Z_AXIS]) action = ActionAxis(ACTION_SWAP, Y_AXIS, Z_AXIS) actionManager.addAction(action) def btn_z_view(self, index): self.clear_glow() if index == 'clear': messenger.send('dim_action_clear', [Z_AXIS]) action = ActionAxis(ACTION_CLEAR, Z_AXIS) actionManager.addAction(action) if index == 'view front': z = photocube.cube.cubeService.coordinate.get_z() if z is not None: messenger.send('dim_move_to_axis', [Z_AXIS, X_AXIS]) action = ActionAxis(ACTION_MOVE, Z_AXIS, X_AXIS) actionManager.addAction(action) if index == 'view in': z = photocube.cube.cubeService.coordinate.get_z() if z is not None: messenger.send('dim_move_to_axis', [Z_AXIS, Y_AXIS]) action = ActionAxis(ACTION_MOVE, Z_AXIS, Y_AXIS) actionManager.addAction(action) if index == "swap with front": messenger.send('z_dim_action_swap', [X_AXIS]) action = ActionAxis(ACTION_SWAP, Z_AXIS, X_AXIS) actionManager.addAction(action) if index == "swap with in": messenger.send('z_dim_action_swap', [Y_AXIS]) action = ActionAxis(ACTION_SWAP, Z_AXIS, Y_AXIS) actionManager.addAction(action) def btn_dimensions(self, index): self.clear_glow() tagset = photocube.objectcube.objectCubeService.get_tagset_by_id( self.selected_tagset_id) if index == 'view front': action = ActionTagset(ACTION_SET, tagset.id, X_AXIS) actionManager.addAction(action) messenger.send('dim_view_tagset', [X_AXIS, tagset]) if index == 'view in': action = ActionTagset(ACTION_SET, tagset.id, Y_AXIS) actionManager.addAction(action) messenger.send('dim_view_tagset', [Y_AXIS, tagset]) if index == 'view up': action = ActionTagset(ACTION_SET, tagset.id, Z_AXIS) actionManager.addAction(action) messenger.send('dim_view_tagset', [Z_AXIS, tagset]) if index == 'add dimension filter': dim_filter = ObjectCubePython.DimensionFilter( tagset.getDefaultDimension().getRoot(), tagset.id) filterManager.add_filter(dim_filter, True) # add action action = ActionFilter(ACTION_DIMENSIONFILTER, ACTION_ADD, tagsetId=tagset.id) actionManager.addAction(action) # reload filters menu. self.reload_filter2() if index == 'add tag filter': photocube.dialogs.dialogService.open_add_tagfilter(tagset) if index == 'add range filter': if tagset.typeId == 3: photocube.dialogs.dialogService.open_add_date_range(tagset) elif tagset.typeId == 4: photocube.dialogs.dialogService.open_add_time_range(tagset) else: photocube.dialogs.dialogService.open_add_numerical_range( tagset) if index == 'edit': photocube.dialogs.dialogService.openCreateNewTagsetDialog(tagset) def btn_hierarchy(self, index): # Get the tagset that the hir belongs to. tagset = photocube.objectcube.objectCubeService.get_tagset_by_id( self.selected_tagset_id) print 'selected_hierarchy_id: ' + str(self.selected_hierarchy_id) # Get the hirarchy from the tagset. dim = tagset.getDimension(int(self.selected_hierarchy_id)) print 'Dimension click' if index == 'view front': print 'DimId: ' + str(dim.id) print 'TagSetId: ' + str(tagset.id) print index + ': Begin' print 'ACTION_SET' print ACTION_SET print 'X_AXIS' print X_AXIS action = ActionHierachy(ACTION_SET, tagset.id, dim.id, X_AXIS) actionManager.addAction(action) print 'action' print action messenger.send('dim_view_hierarchy', [X_AXIS, dim]) print index + ': End' elif index == 'view in': action = ActionHierachy(ACTION_SET, tagset.id, dim.id, Y_AXIS) actionManager.addAction(action) messenger.send('dim_view_hierarchy', [Y_AXIS, dim]) elif index == 'view up': action = ActionHierachy(ACTION_SET, tagset.id, dim.id, Z_AXIS) actionManager.addAction(action) messenger.send('dim_view_hierarchy', [Z_AXIS, dim]) elif index == 'add dimension filter': dim_filter = ObjectCubePython.DimensionFilter( dim.getRoot(), tagset.id) filterManager.add_filter(dim_filter, True) # add action action = ActionFilter(ACTION_DIMENSIONFILTER, ACTION_ADD, tagsetId=tagset.id, hirarchyId=int(self.selected_hierarchy_id)) actionManager.addAction(action) self.reload_filter2() else: raise Exception('btn_hierarchy: unknown index: ' + index) def btn_search(self, index): tagset = photocube.objectcube.objectCubeService.get_tagset_by_id( self.selected_tagset_id) if index == 'search': print 'Vuubidu' photocube.dialogs.dialogService.openSearchDialogWithTagSet(tagset) def reload_filter2(self): self.filter_menu.reload() def on_x_view_right_click(self, f): photocube.ui.coremenu.context_menu_handler.open_x_view_context() def open_context_view_y(self, f): photocube.ui.coremenu.context_menu_handler.open_y_view_context() def open_context_view_z(self, f): photocube.ui.coremenu.context_menu_handler.open_z_view_context() def on_hierarchy_right_click(self, f): split_list = f.__str__().split(';') self.selected_hierarchy_id = int(split_list[3]) self.selected_tagset_id = int(split_list[4]) photocube.ui.coremenu.context_menu_handler.open_context_hierarchy() def on_tagset_right_click(self, f): """ Function for opening dimension context. """ split_list = f.__str__().split(';') self.selected_tagset_id = int(split_list[len(split_list) - 1]) t_id = photocube.objectcube.objectCubeService.get_tagset_by_id( self.selected_tagset_id).typeId print 't_id' + str(t_id) if t_id == photocube.objectcube.framework.TagSet.TYPE.ALPHANUMERICAL: print 'ALPHANUMERICAL' photocube.ui.coremenu.context_menu_handler.open_context_tagset_search_alphanumerical( ) elif t_id == photocube.objectcube.framework.TagSet.TYPE.RGB: print 'RGB' photocube.ui.coremenu.context_menu_handler.open_context_tagset_search_rgb( ) ''' if t_id == photocube.objectcube.framework.TagSet.TYPE.ALPHANUMERICAL: photocube.ui.coremenu.context_menu_handler.open_context_tagset_alphanumerical() else: photocube.ui.coremenu.context_menu_handler.open_context_tagset_numerical() ''' def hide(self): #self.right_menu_node_path.hide() if self.dimension_scrollbar is not None: self.dimension_scrollbar.hide() self.filter_menu.hide() # hide the background image self.bg.hide() self.is_visable = False def show(self): #self.right_menu_node_path.show() if self.dimension_scrollbar is not None: self.dimension_scrollbar.show() #self.filter_menu.show() # hide the background image #self.bg.show() self.is_visable = True def setXViewText(self, text): self.text_x.setText('front: ' + text) def setYViewText(self, text): self.text_y.setText('in: ' + text) def setZViewText(self, text): self.text_z.setText('up: ' + text) def __register_view_menu_messages(self): # Click messages for dimensions. base.accept(self.curXDimRightClickMessage, self.on_x_view_right_click) base.accept(self.curXDimLeftClickMessage, self.on_x_view_right_click) base.accept(self.curYDimRightClickMessage, self.open_context_view_y) base.accept(self.curYDimLeftClickMessage, self.open_context_view_y) base.accept(self.curZDimRightClickMessage, self.open_context_view_z) base.accept(self.curZDimLeftClickMessage, self.open_context_view_z) base.accept('clear_glow', self.clear_glow) base.accept('zoomout_none', self.clear_glow) def __placement(self, task): """ Called to fix the size, location of object when the aspect changes. """ if self.is_visable: base.camLens.setAspectRatio(base.getAspectRatio()) wp = base.win.getProperties() base.camLens.setAspectRatio( (wp.getXSize() + 0.0) / (wp.getYSize() + 0.0)) self.right_menu_node_path.show() self.right_menu_node_path.setX( (base.getAspectRatio() + (0.40 / base.getAspectRatio()))) # Fix the position of the menu background image. self.bg.setX(0.32 + base.getAspectRatio()) if self.dimension_scrollbar is not None: self.dimension_scrollbar.setX(base.getAspectRatio() - 0.04) self.dimension_scrollbar.setZ(0.18) else: # set the position for the dimensino buttons base.camLens.setAspectRatio(base.getAspectRatio()) wp = base.win.getProperties() base.camLens.setAspectRatio( (wp.getXSize() + 0.0) / (wp.getYSize() + 0.0)) #self.right_menu_node_path.setX( (base.getAspectRatio()+(0.3/base.getAspectRatio())) ) self.right_menu_node_path.hide() self.right_menu_node_path.setX(500) #THIS IS NOT ALLOWD, CLOSES CLUSTER MENUS AS WELL! #messenger.send('CLOSE_ALL_CONTEXT') # Fix the position of the menu background image. self.bg.setX(0.95 + base.getAspectRatio()) self.bg.show() return task.cont
class MainMenu(DirectObject): def __init__(self, skipIntro=False): render.show() engine.Mouse.showCursor() # In case we just got back from the tutorial, which hides everything # sometimes. engine.renderLit.show() self.backgroundSound = audio.FlatSound("menu/background.ogg", volume=0.3) self.backgroundSound.setVolume(0) self.backgroundSound.setLoop(True) self.clickSound = audio.FlatSound("menu/click.ogg", volume=0.3) self.active = True self.accept("escape", self.escape) self.accept("mouse1", self.click) self.cameraDistance = 20 self.globe = engine.loadModel("menu/Globe") self.globe.reparentTo(render) self.globe.setTransparency(TransparencyAttrib.MAlpha) self.globe.setColor(Vec4(1, 1, 1, 0.6)) self.globe.setTwoSided(True) self.globe.setRenderModeWireframe() self.overlay = camera.attachNewNode("overlay") self.overlay.setTransparency(TransparencyAttrib.MAlpha) self.overlay.setColor(Vec4(1, 1, 1, 0)) self.overlay.setPos(0, 0, 0) self.overlay.setPos(0, self.cameraDistance, 0) self.overlay1 = engine.loadModel("menu/overlay1") self.overlay1.setScale(4) self.overlay1.setTwoSided(True) self.overlay1.setRenderModeWireframe() self.overlay1.reparentTo(self.overlay) self.overlay2 = engine.loadModel("menu/overlay2") self.overlay2.setScale(4) self.overlay2.setTwoSided(True) self.overlay2.setRenderModeWireframe() self.overlay2.reparentTo(self.overlay) self.overlay3 = engine.loadModel("menu/overlay3") self.overlay3.setScale(4) self.overlay3.setTwoSided(True) self.overlay3.setRenderModeWireframe() self.overlay3.setR(uniform(0, 360)) self.overlay3.setP(uniform(0, 360)) self.overlay3.setH(uniform(0, 360)) self.overlay3.reparentTo(self.overlay) self.overlay4 = engine.loadModel("menu/overlay3") self.overlay4.setScale(4) self.overlay4.setTwoSided(True) self.overlay4.setRenderModeWireframe() self.overlay4.setH(uniform(0, 360)) self.overlay4.setR(uniform(0, 360)) self.overlay4.setP(uniform(0, 360)) self.overlay4.reparentTo(self.overlay) self.text = engine.loadModel("menu/text") self.text.setScale(4) self.text.setTwoSided(True) self.text.reparentTo(self.overlay) self.selector = engine.loadModel("menu/selector") self.selector.setScale(4) self.selector.setTwoSided(True) self.selector.reparentTo(self.overlay) self.selectedItem = 0 self.skyBox = engine.loadModel("menu/skybox") self.skyBox.setScale(self.cameraDistance * 5) self.skyBox.setRenderModeWireframe() self.skyBox.setTwoSided(True) self.skyBox.reparentTo(render) self.skyBox.setTransparency(TransparencyAttrib.MAlpha) self.skyBox.setColor(Vec4(1, 1, 1, 0)) cmbg = CardMaker("background") size = 10 cmbg.setFrame(-size * engine.aspectRatio, size * engine.aspectRatio, -size, size) self.background = camera.attachNewNode(cmbg.generate()) self.background.setTexture(loader.loadTexture("menu/background.jpg"), 1) self.background.setPos(0, size * 1.25, 0) self.background.setDepthWrite(False) self.belt = JunkBelt(5) self.angle = uniform(0, 360) self.period = 60 self.uiAngle = 0 self.logo = OnscreenImage(image="menu/logo.png", pos=(0, 0, 0), scale=((512.0 / 175.0) * 0.075, 0, 0.075)) self.logo.setTransparency(TransparencyAttrib.MAlpha) self.logo.setColor(1, 1, 1, 0) self.logo.setBin("transparent", 0) self.loadingScreen = OnscreenImage(image="menu/loading.jpg", pos=(0, 0, 0)) self.loadingScreen.setScale(render2d, VBase3(1)) self.loadingScreen.setSx(2) self.loadingScreen.hide() self.skipToEndOfTutorial = skipIntro global firstBoot firstBoot = False self.introTime = 2 if firstBoot and not skipIntro: self.introTime = 4 self.showLogin = firstBoot self.hostList = ui.HostList(self.startClient) self.mapList = ui.MapList(self.startServer) self.loginDialog = ui.LoginDialog(self.setUsername) self.loginDialogShown = False self.introSound = audio.FlatSound("menu/intro.ogg", volume=0.15) self.introSound.play() self.clientConnectAddress = None self.serverMapName = None self.serverMode = 0 # 0 for normal, 1 for tutorial self.serverGameType = 0 # 0 for deathmatch, 1 for survival self.username = "******" self.startTime = -1 self.goTime = -1 if base.appRunner is not None: token = base.appRunner.getToken("username") if token != "" and token != "Unnamed": self.setUsername(token) self.loginDialogShown = True def escape(self): if self.hostList.visible: self.hostList.hide() elif self.mapList.visible: self.mapList.hide() def startClient(self, host): self.clickSound.play() self.hostList.hide() self.loadingScreen.show() self.clientConnectAddress = host self.goTime = engine.clock.time def startServer(self, map, gametype): # Tutorial works on Point Control maps. if not (self.serverMode == 1 and gametype == 1): self.clickSound.play() self.mapList.hide() self.loadingScreen.show() self.serverMapName = map self.serverGameType = gametype self.goTime = engine.clock.time def setUsername(self, username): self.clickSound.play() self.username = username engine.savedUsername = self.username engine.saveConfigFile() self.loginDialog.hide() def update(self): if not self.active: return net.context.readTick() if self.startTime == -1: self.startTime = engine.clock.time elapsedTime = engine.clock.time - self.startTime if elapsedTime < self.introTime: blend = elapsedTime / self.introTime self.angle += engine.clock.timeStep * (1 - blend) self.cameraDistance = 20 + (1 - blend)**2 * 200 elif elapsedTime < self.introTime + 2: self.cameraDistance = 20 blend = (elapsedTime - self.introTime) / 2 self.overlay.setColor(Vec4(1, 1, 1, blend)) self.logo.setColor(1, 1, 1, blend) self.skyBox.setColor(Vec4(1, 1, 1, blend)) if not self.backgroundSound.isPlaying(): self.backgroundSound.play() self.backgroundSound.setVolume(blend * 0.5) else: self.cameraDistance = 20 self.overlay.setColor(Vec4(1, 1, 1, 1)) self.logo.setColor(1, 1, 1, 1) self.skyBox.setColor(Vec4(1, 1, 1, 1)) self.backgroundSound.setVolume(0.5) if elapsedTime > self.introTime: if not self.loginDialogShown and self.showLogin: self.loginDialog.show() self.loginDialogShown = True self.uiAngle -= engine.clock.timeStep * 2 self.text.setR(self.uiAngle) self.hostList.update() self.mapList.update() self.loginDialog.update() mouse = base.win.getPointer(0) props = base.win.getProperties() vector = Vec3((mouse.getX() / float(props.getXSize())) - 0.5, (mouse.getY() / float(props.getYSize())) - 0.5, 0) vector.normalize() angle = math.degrees(math.atan2(-vector.getX(), vector.getY())) + 180 angle -= self.uiAngle if not self.hostList.visible and not self.mapList.visible and not self.loginDialog.visible: self.selectedItem = int(round(angle / 90.0)) while self.selectedItem > 3: self.selectedItem -= 4 while self.selectedItem < 0: self.selectedItem += 4 self.selector.setR(self.uiAngle + self.selectedItem * 90) self.overlay1.setR(self.overlay1.getR() - engine.clock.timeStep * 2) self.overlay2.setR(self.overlay2.getR() + engine.clock.timeStep * 2) self.overlay3.setH(self.overlay3.getH() + engine.clock.timeStep * 10) self.overlay4.setP(self.overlay4.getP() - engine.clock.timeStep * 10) self.belt.update() self.angle += engine.clock.timeStep * 0.025 camera.setPos( math.cos(self.angle) * self.cameraDistance, math.sin(self.angle) * self.cameraDistance, math.cos(elapsedTime / 45 + 2) * 2) camera.lookAt(Point3(0, 0, 0)) backend = None game = None if self.goTime != -1 and engine.clock.time - self.goTime > 0.25: if self.clientConnectAddress is not None: self.delete() online.connectTo(self.clientConnectAddress) backend = ClientBackend(self.clientConnectAddress, self.username) game = Game(backend) elif self.serverMapName is not None: if self.serverMode == 0: # Normal server mode self.delete() if self.serverGameType == 0: backend = PointControlBackend( True, self.username) # Deathmatch else: backend = SurvivalBackend(True, self.username) # Survival game = Game(backend) game.localStart(self.serverMapName) elif self.serverMode == 1: # Tutorial mode self.delete() backend = PointControlBackend(False, self.username) game = Tutorial(backend, 2 if self.skipToEndOfTutorial else 0) game.localStart(self.serverMapName) net.context.writeTick() return backend, game def click(self): if self.mapList.visible or self.hostList.visible or self.loginDialog.visible or engine.clock.time - \ self.startTime < self.introTime + 0.5: return self.clickSound.play() if self.selectedItem == 0: # Join self.hostList.show() elif self.selectedItem == 1: # Tutorial self.mapList.show() self.serverMode = 1 elif self.selectedItem == 2: # Exit engine.exit() elif self.selectedItem == 3: # Host self.mapList.show() self.serverMode = 0 def delete(self): self.loadingScreen.destroy() self.hostList.delete() self.mapList.delete() self.loginDialog.delete() self.active = False self.overlay.removeNode() self.belt.delete() self.background.removeNode() self.globe.removeNode() self.skyBox.removeNode() self.ignoreAll() self.logo.destroy() self.introSound.stop() self.backgroundSound.stop()
def _createItem(self, entry, ignore_fadein = False): '''Create an item(not including adding this to itemEntries)''' imagepathes = runtime_data.game_settings['imagepathes'] imagetypes = runtime_data.game_settings['imagetypes'] modelpathes = runtime_data.game_settings['modelpathes'] modeltypes = runtime_data.game_settings['modeltypes'] if self._sceneItems.has_key(entry.key): self._sceneItems[entry.key].removeNode() self._sceneItems.pop(entry.key) item = None if entry.category == SVIC.FG or entry.category == SVIC.BG or entry.category == SVIC.O2D: texture = None for ft in ((folder,type) for folder in imagepathes for type in imagetypes): if exists(ft[0] + entry.fileName + ft[1]): texture = loader.loadTexture(ft[0] + entry.fileName + ft[1]) break '''Alternative item = loader.loadModel(r"models/plain.egg") item.setTexture(texture, 1) ''' item = OnscreenImage(texture) item.setPos(entry.pos[0],entry.pos[1],entry.pos[2]) item.setScale(entry.scale[0]*texture.getOrigFileXSize()/float(texture.getOrigFileYSize()),entry.scale[1],entry.scale[2]) #Always make its height fill the screen normally color = (entry.color[0],entry.color[1],entry.color[2],entry.color[3]) if entry.fadein: lv = LerpColorInterval(item, entry.fadein, color, (color[0],color[1],color[2],0) ) self._intervals.append(lv) lv.start() else: item.setColor(color) item.setName(entry.key) if entry.category == SVIC.FG: item.reparentTo(self.fgNodePath) elif entry.category == SVIC.BG: item.reparentTo(self.bgNodePath) elif entry.category == SVIC.O2D: item.reparentTo(self.vNodePath) elif entry.category == SVIC.AFG: item = None for ft in ((folder,type) for folder in imagepathes for type in modeltypes): if exists(ft[0] + entry.fileName + ft[1]): item = loader.loadModel(ft[0] + entry.fileName + ft[1]) break if not item: item = loader.loadModel(entry.fileName) item.setPos(entry.pos[0],entry.pos[1],entry.pos[2]) item.setScale(entry.scale) #For generated egg animation with "egg-texture-cards" is a 1x1 rectangle by default color = (entry.color[0],entry.color[1],entry.color[2],entry.color[3]) if entry.fadein: lv = LerpColorInterval(item, entry.fadein, color, (color[0],color[1],color[2],0) ) self._intervals.append(lv) lv.start() else: item.setColor(color) item.setTransparency(1) item.setName(entry.key) item.reparentTo(self.fgNodePath) #item.setBin("unsorted", 0) elif entry.category == SVIC.O3D: item = None for ft in ((folder,type) for folder in modelpathes for type in modeltypes): if exists(ft[0] + entry.fileName + ft[1]): item = loader.loadModel(ft[0] + entry.fileName + ft[1]) break if not item: item = loader.loadModel(entry.fileName) item.setPos(entry.pos[0],entry.pos[1],entry.pos[2]) item.setScale(entry.scale) #For generated egg animation with "egg-texture-cards" is a 1x1 rectangle by default color = (entry.color[0],entry.color[1],entry.color[2],entry.color[3]) if entry.fadein: lv = LerpColorInterval(item, entry.fadein, color, (color[0],color[1],color[2],0) ) self._intervals.append(lv) lv.start() else: item.setColor(color) item.setTransparency(1) item.setName(entry.key) item.reparentTo(self.vNodePath) if item: self._sceneItems[entry.key] = item if entry.quickitem: self._quickitems.append(entry.key)
class MHB(object): weaponOverHeat = 33 time = 0 step = False curScale = 0 hbcount = 0 delayShot = 0 def __init__(self, camera, id): self.audio3d = Audio3DManager(base.sfxManagerList[0], base.camera) #Set model and projectile paths self.gunPath = NodePath("gun2") self.gunPath.reparentTo(base.camera) self.gunPath.setPos(1.5,10.5,-3.8) self.gunModel = loader.loadModel("./resources/mhb") self.gunModel.reparentTo(self.gunPath) self.gunModel.setPos(camera, .7,3,-1.4) self.gunModel.setHpr(-90,0,0) self.reticle = OnscreenImage("./resources/mhbReticle.png") self.reticle.setTransparency(True) self.reticle.setScale(0) base.taskMgr.add(self.animate, "mhbReticle") self.gunModel.setColor(0, 0, 0) def hide(self): self.reticle.setScale(0) self.gunModel.hide() self.gunPath.hide() def show(self): self.gunModel.show() self.gunPath.show() def fire(self, task): #Spawn 20 projectiles, add them to taskMgr and play sfx for i in range(1,20): proj = MHBProjectile(self.gunPath, base.camera, len(base.projectileList)+self.hbcount, i) base.taskMgr.add(proj.moveTask, "move projectile") base.projectileList.append(proj) self.hbcount+=1 shotSfx = self.audio3d.loadSfx("./resources/sounds/blunderbuss.wav") self.audio3d.attachSoundToObject(shotSfx, base.camera) shotSfx.play() base.player.overHeat += self.weaponOverHeat self.delayShot = task.time + 1.2 base.taskMgr.add(self.contTask, "weaponDelay") def contTask(self, task): return task.cont def animate(self, task): if task.time - self.time > .025: if self.curScale < .08 and self.step: self.curScale += .001 self.reticle.setScale(self.curScale) self.time = task.time if self.curScale == .08: self.step = False elif self.curScale > .04: self.curScale -= .001 self.reticle.setScale(self.curScale) self.time = task.time if self.curScale <= .04: self.step = True return task.cont def canShoot(self): taskList = base.taskMgr.getTasksNamed("weaponDelay") if taskList[0].time >= self.delayShot: return True else: return False def getOverHeat(self): return self.overheat def resetWeapon(self): time = 0 step = False hbcount = 0 delayShot = 0
class Crosshair(DirectObject): def __init__(self): self.crosshair = OnscreenImage('../assets/gui/crosshair3.png', (0, 0, 0) ) self.crosshair.setScale(0.03) self.crosshair.setTransparency(TransparencyAttrib.MAlpha, 0)
class RecursionRifle(object): #Amout overheat increases by weaponOverHeat = 10 #For calculating delta time time = 0 #Flag for animation step = False #Current animation scale curScale = .025 #Delta for shot delay delayShot = 0 def __init__(self, camera, id): self.audio3d = Audio3DManager(base.sfxManagerList[0], base.camera) #Get projectile path and gun model self.gunPath = NodePath("gun") self.gunPath.reparentTo(base.camera) self.gunPath.setPos(1,10,-3.5) self.gunModel = loader.loadModel("./resources/rr") self.gunModel.reparentTo(self.gunPath) self.gunModel.setPos(camera,.7,4,-2) self.gunModel.setHpr(90,0,0) self.gunModel.setColor(0, 255, 0) #Set gun reticle self.reticle = OnscreenImage("./resources/reticle.png") self.reticle.setTransparency(True) self.reticle.setScale(self.curScale) base.taskMgr.add(self.animate, "rrReticle") #Hides all visable enlements of the gun def hide(self): self.reticle.setScale(0) self.gunModel.hide() self.gunPath.hide() #Hides all visable elements of the gun def show(self): self.gunModel.show() self.gunPath.show() #Fires recursion rifle def fire(self, task): #Spawn projectile, add it to taskMgr and play sfx proj = RRProjectile(self.gunPath, base.camera, len(base.projectileList)) base.taskMgr.add(proj.moveTask, "move projectile") base.projectileList.append(proj) shotSfx = self.audio3d.loadSfx("./resources/sounds/recursion_rifle.wav") self.audio3d.attachSoundToObject(shotSfx, base.camera) shotSfx.play() base.player.overHeat += self.weaponOverHeat self.delayShot = task.time + .5 base.taskMgr.add(self.contTask, "weaponDelay") #Handles animation of recursion rifle reticle def animate(self, task): #If delta has been long enough if task.time - self.time > .05: #Update scale self.reticle.setScale(self.curScale) if self.curScale < .03 and self.step: self.curScale += .001 self.reticle.setScale(self.curScale) self.time = task.time if self.curScale >= .03: self.step = False elif self.curScale > .01: self.curScale -= .001 self.reticle.setScale(self.curScale) self.time = task.time if self.curScale <= .01: self.step = True return task.cont #Used to calculate delta for shot delay def contTask(self, task): return task.cont #You can shoot if the delay has been met def canShoot(self): taskList = base.taskMgr.getTasksNamed("weaponDelay") if taskList[0].time >= self.delayShot: return True else: return False #Resets delay def resetWeapon(self): delayShot = 0
class MainMenu(DirectObject): """This class represents the main menu as seen directly after the application has been started""" def __init__(self): # loading music self.menuMusic = loader.loadMusic("music/01Menu.mp3") self.menuMusic.setLoop(True) # create a main frame as big as the window self.frameMain = DirectFrame( # set framesize the same size as the window frameSize = (base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom), # position center pos = (0, 0, 0), # set tramsparent background color frameColor = (0.15, 0.15, 0.15, 1)) #self.frameMain.reparentTo(render2d) self.menuBackground = OnscreenImage( image = 'gui/Background.png', scale = (1.66, 1, 1), pos = (0, 0, 0)) self.menuBackground.reparentTo(self.frameMain) self.defaultBtnMap = base.loader.loadModel("gui/button_map") self.buttonGeom = ( self.defaultBtnMap.find("**/button_ready"), self.defaultBtnMap.find("**/button_click"), self.defaultBtnMap.find("**/button_rollover"), self.defaultBtnMap.find("**/button_disabled")) self.defaultTxtMap = base.loader.loadModel("gui/textbox_map") self.textboxGeom = self.defaultTxtMap.find("**/textbox") monospace = loader.loadFont('gui/DejaVuSansMono.ttf') defaultFont = loader.loadFont('gui/eufm10.ttf') # create the title self.textscale = 0.25 self.title = DirectLabel( # scale and position scale = self.textscale, pos = (0.0, 0.0, base.a2dTop - self.textscale), # frame frameColor = (0, 0, 0, 0), # Text text = "Dungeon Crawler", text_align = TextNode.ACenter, text_fg = (0.82,0.85,0.87,1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (-0.02, -0.02), text_font = defaultFont) self.title.setTransparency(1) self.title.reparentTo(self.frameMain) # create a host button self.btnHostPos = Vec3(0, 0, .45) self.btnHostScale = 0.25 self.btnHost = DirectButton( # Scale and position scale = self.btnHostScale, pos = self.btnHostPos, # Text text = "Host", text_scale = 0.8, text_pos = (0, -0.2), text_fg = (0.82,0.85,0.87,1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (-0.02, -0.02), text_font = defaultFont, # Frame geom = self.buttonGeom, frameColor = (0, 0, 0, 0), relief = 0, pressEffect = False, # Functionality command = self.host, rolloverSound = None, clickSound = None) self.btnHost.setTransparency(1) self.btnHost.reparentTo(self.frameMain) # create a join button self.btnJoinPos = Vec3(0, 0, 0) self.btnJoinScale = 0.25 self.btnJoin = DirectButton( scale = self.btnJoinScale, pos = self.btnJoinPos, text = "Join", text_scale = 0.8, text_pos = (0, -0.2), text_fg = (0.82,0.85,0.87,1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (-0.02, -0.02), text_font = defaultFont, geom = self.buttonGeom, frameColor = (0, 0, 0, 0), relief = 0, pressEffect = False, command = self.join, rolloverSound = None, clickSound = None) self.btnJoin.setTransparency(1) self.btnJoin.reparentTo(self.frameMain) # create the IP input field self.txtIPPos = Vec3(0, 0, -.30) self.txtIPScale = 0.25 self.txtIPWidth = 9 self.txtIP = DirectEntry( # scale and position pos = self.txtIPPos, scale = self.txtIPScale, width = self.txtIPWidth, # Text entryFont = monospace, text_align = TextNode.ACenter, text = "", text_scale = 0.5, text_pos = (0, -0.2), text_fg = (0.82,0.85,0.87,1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.04, 0.04), initialText = "127.0.0.1", numLines = 1, # Frame geom = self.textboxGeom, frameColor = (0, 0, 0, 0), relief = 0, # Functionality command = self.join, focusInCommand = self.clearText) self.txtIP.reparentTo(self.frameMain) # create an exit button self.btnExitPos = Vec3(0, 0, -.75) self.btnExitScale = 0.25 self.btnExit = DirectButton( scale = self.btnExitScale, pos = self.btnExitPos, text = "Exit", text_scale = 0.8, text_pos = (0, -0.2), text_fg = (0.82,0.85,0.87,1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (-0.02, -0.02), text_font = defaultFont, geom = self.buttonGeom, frameColor = (0, 0, 0, 0), relief = 0, pressEffect = False, command = lambda: base.messenger.send("escape"), rolloverSound = None, clickSound = None) self.btnExit.setTransparency(1) self.btnExit.reparentTo(self.frameMain) # create a mute checkbox self.cbVolumeMute = DirectCheckBox( # set size scale = (0.1, 0.1, 0.1), frameSize = (-1, 1, 1, -1), # functionality and visuals command = self.cbVolumeMute_CheckedChanged, isChecked = True, checkedImage = "gui/SoundSwitch_off.png", uncheckedImage = "gui/SoundSwitch_on.png", # mouse behaviour relief = 0, pressEffect = False, rolloverSound = None, clickSound = None ) self.cbVolumeMute.setTransparency(1) self.cbVolumeMute.reparentTo(self.frameMain) self.cbVolumeMute.commandFunc(None) # catch window resizes and recalculate the aspectration self.accept("window-event", self.recalcAspectRatio) self.accept("showerror", self.showError) # show the menu right away self.show() def host(self): """Function which will be called by pressing the host button""" self.hide() base.messenger.send("start_server") def join(self, ip=None): """Function which will be called by pressing the join button""" if ip == None: ip = self.txtIP.get(True) if ip == "": return self.hide() base.messenger.send("start_client", [ip]) def showError(self, msg): self.show() self.dialog = OkDialog( dialogName="ErrorDialog", text="Error: {}".format(msg), command=self.closeDialog) def closeDialog(self, args): self.dialog.hide() def show(self): """Show the GUI""" self.frameMain.show() self.menuMusic.play() def hide(self): """Hide the GUI""" self.frameMain.hide() self.menuMusic.stop() def clearText(self): """Function to clear the text that was previously entered in the IP input field""" self.txtIP.enterText("") def cbVolumeMute_CheckedChanged(self, checked): if bool(checked): base.disableAllAudio() else: base.enableAllAudio() def recalcAspectRatio(self, window): """get the new aspect ratio to resize the mainframe""" # set the mainframe size to the window borders again self.frameMain["frameSize"] = ( base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom) # calculate new aspec tratio wp = window.getProperties() aspX = 1.0 aspY = 1.0 wpXSize = wp.getXSize() wpYSize = wp.getYSize() if wpXSize > wpYSize: aspX = wpXSize / float(wpYSize) else: aspY = wpYSize / float(wpXSize) # calculate new position/size/whatever of the gui items self.title.setPos(0.0, 0.0, base.a2dTop - self.textscale) self.menuBackground.setScale(1.0 * aspX, 1.0, 1.0 * aspY) self.cbVolumeMute.setPos(base.a2dRight - 0.15, 0, base.a2dBottom + 0.15)
class Jugador(DirectObject): # Les variables que tinguin un # son canviables, i les que tinguin ## depenen de la nau WIN_WIDTH = 800 # H_WIDTH = WIN_WIDTH / 2 WIN_HEIGHT = 600 # H_HEIGHT = WIN_HEIGHT / 2 CAM_FOV = 51.0 CAM_FOV_RAD = radians(CAM_FOV) / 2 CAM_FOV_RAD_TAN = tan(CAM_FOV_RAD) VEL_MAX_AVIO = 100 ## VEL_MIN_AVIO = 30 ## VEL_AVIO_RECTE = 40.0 ## VEL_TOMBA_AVIO = 90.0 ## VEL_COSTAT = 30.0 ## ACCELERACIO = 35 ## CAMERA_Y = -9 ## BALA_VEL_BASE = 500 ## QUIT_KEY = "escape" # ACCELERATE_KEY = "w" # DECELERATE_KEY = "s" # RIGHT_KEY = "d" # LEFT_KEY = "a" # CENTRA_RATA_KEY = "c" # SHOOT_KEYS = ["mouse1", "e"] # SHOOT_TIME = 0.15 ## def __init__(self, base, ini_pos=Point3(0, 100, 100), tipus="kamikaze", wwidth=None, wheight=None): DirectObject.__init__(self) if wwidth and wheight: self.WIN_WIDTH = wwidth self.H_WIDTH = self.WIN_WIDTH / 2 self.WIN_HEIGHT = wheight self.H_HEIGHT = self.WIN_HEIGHT / 2 self.keyMap = {"shoot": 0, "centerPointer": 0, "turn": 0} self.bulletClock = 0.0 self.overheatClock = 0.0 self.BALA_VEL = self.BALA_VEL_BASE + self.VEL_MIN_AVIO ambient = AmbientLight("alight") ambientNp = render.attachNewNode(ambient) ambient.setColor(VBase4(0.3, 0.3, 0.3, 1.0)) self.avio = render.attachNewNode("avio") self.avio.setHpr(randint(0, 359), randint(0, 359), randint(0, 359)) self.avio.setPos(ini_pos) self.avioR = self.avio.attachNewNode("avioDum2") if tipus == "kamikaze": self.modelAvio = base.loader.loadModel("prova/avio1blend") else: self.modelAvio = base.loader.loadModel("prova/avio1blend") self.modelAvio.reparentTo(self.avioR) self.avioVel = self.VEL_MIN_AVIO self.balaDreta = self.modelAvio.find("**/BalaDreta") self.balaEsquerra = self.modelAvio.find("**/BalaEsquerra") self.avio.setLight(ambientNp) self.avio.setAntialias(AntialiasAttrib.MMultisample) self.modelAvio.setColor(1, 1, 0, 1) self.modelAvio.setScale(0.51) lightBales = AmbientLight("dlight") self.lightBalesNp = base.camera.attachNewNode(lightBales) self.lightBalesNp.setHpr(0, 0, 0) # -#-#-#-configuracio de camara base.disableMouse() # ~ self.oobe() base.camera.reparentTo(self.avio) base.camera.setHpr(self.avio, 0, 0, 0) base.camera.setPos(self.avio, 0, self.CAMERA_Y, 1.5) base.camLens.setFov(self.CAM_FOV * (4.0 / 3.0), self.CAM_FOV) self.mirilla2 = OnscreenImage(image="prova/textures/areatir2.png", parent=pixel2d) self.mirilla2.setScale(128) self.mirilla2.setTransparency(1) self.mirilla2.setPos(self.H_WIDTH, 0, -self.H_HEIGHT) self.mirilla = base.loader.loadModel("prova/textures/fixador.egg") self.mirilla.reparentTo(pixel2d) self.mirilla.setScale(64.0) self.mirilla.setPos(0, 0, 0) self.mirilla.find("**/+SequenceNode").node().pose(0) self.cursorGirar = pixel2d.attachNewNode("cursorGirar") self.cursorGirarImage = OnscreenImage(image="prova/textures/fletxa.png", parent=self.cursorGirar) self.cursorGirarImage.setScale(16.0 / 2, 1.0, 32.0 / 2) self.cursorGirarImage.setPos(0, 0, 0) self.cursorGirarImage.setHpr(-90, 0, -90) self.cursorGirarImage.setTransparency(1) cursorGirarEffect = BillboardEffect.make( up_vector=Vec3(0, 0, 1), eye_relative=False, axial_rotate=False, offset=0.0, look_at=self.mirilla2, look_at_point=Point3(0, 0, 0), ) self.cursorGirar.setEffect(cursorGirarEffect) self.overheats = [] for i in range(8): if i % 2 == 0: self.overheats.append(OnscreenImage(image="prova/textures/overheat1.png", parent=pixel2d)) else: self.overheats.append(OnscreenImage(image="prova/textures/overheat2.png", parent=pixel2d)) self.overheats[i].setScale(32.0, 1.0, 32.0) self.overheats[i].setTransparency(1) self.overheats[i].hide() self.overheats[0].setPos(self.H_WIDTH + 36, 0, -self.H_HEIGHT + 36) self.overheats[0].setHpr(0, 0, 0) self.overheats[1].setPos(self.H_WIDTH + 36, 0, -self.H_HEIGHT + 36) self.overheats[1].setHpr(0, 0, 0) self.overheats[2].setPos(self.H_WIDTH + 36, 0, -self.H_HEIGHT - 36) self.overheats[2].setHpr(0, 0, 90) self.overheats[3].setPos(self.H_WIDTH + 36, 0, -self.H_HEIGHT - 36) self.overheats[3].setHpr(0, 0, 90) self.overheats[4].setPos(self.H_WIDTH - 36, 0, -self.H_HEIGHT - 36) self.overheats[4].setHpr(0, 0, 180) self.overheats[5].setPos(self.H_WIDTH - 36, 0, -self.H_HEIGHT - 36) self.overheats[5].setHpr(0, 0, 180) self.overheats[6].setPos(self.H_WIDTH - 36, 0, -self.H_HEIGHT + 36) self.overheats[6].setHpr(0, 0, -90) self.overheats[7].setPos(self.H_WIDTH - 36, 0, -self.H_HEIGHT + 36) self.overheats[7].setHpr(0, 0, -90) # PARTICLE SYSTEM SETUP self.particlesDummy = render.attachNewNode("particlesDummy") self.particlesDummy.setPosHprScale(0, 0, 0, 0, 0, 0, 1, 1, 1) self.particlesDummy.clearLight(render.find("dlight")) self.particlesDummy.setLight(self.lightBalesNp) base.enableParticles() # COLLISIONS base.cTrav = CollisionTraverser() base.cTrav.setRespectPrevTransform(True) self.balaCol = CollisionNode("balaCol") self.balaCol.setIntoCollideMask(BitMask32.allOff()) self.balaCol.setFromCollideMask(BitMask32(0x00000001)) balaColSolid = CollisionSphere(0.0, 0.0, 0.0, 0.2) self.balaCol.addSolid(balaColSolid) self.pickRay = CollisionNode("pickRay") self.pickRayNp = base.camera.attachNewNode(self.pickRay) self.pickRay.setIntoCollideMask(BitMask32.allOff()) self.pickRay.setFromCollideMask(BitMask32(0x00000002)) self.pickRayCHandler = CollisionHandlerQueue() self.mouseRay = CollisionRay() self.pickRay.addSolid(self.mouseRay) self.mouseRay.setOrigin(0, 0, 0) base.cTrav.addCollider(self.pickRayNp, self.pickRayCHandler) # ~ self.nearPlane = CollisionNode("nearPlane") # ~ self.nearPlaneNp = base.camera.attachNewNode(self.nearPlane) # ~ base.camRays.setIntoCollideMask(BitMask32(0x00000001)) # ~ self.nearPlaneNp.setPos(0, 1, 0) # ~ self.nearPlaneColSolid = CollisionPlane(Plane(Vec3(0, -1, 0), Point3(0, 1, 0))) # ~ self.nearPlane.addSolid(self.nearPlaneColSolid) def giraAvio(task): timeVar = globalClock.getDt() point = base.win.getPointer(0) pointerx = point.getX() pointery = point.getY() self.mouseRay.setFromLens(base.camNode, pointerx, pointery) # Cursors de la pantalla self.mirilla.setPos(pointerx, 0, -pointery) self.cursorGirar.setPos(pointerx, 0, -pointery) r = pow(abs(pointery - self.H_HEIGHT), 2) + pow(abs(pointerx - self.H_WIDTH), 2) if r > 8000: self.mirilla.hide() self.cursorGirar.show() else: self.mirilla.show() self.cursorGirar.hide() # 3D pointerx = pointerx - self.H_WIDTH pointery = pointery - self.H_HEIGHT self.avioR.setX(self.avio, -pointerx * 3.0 / float(self.WIN_WIDTH)) self.avioR.setZ(self.avio, pointery * 3.0 / (self.WIN_HEIGHT)) self.avio.setH(self.avio, -pointerx * 256.0 / self.WIN_WIDTH * timeVar) self.avio.setP(self.avio, -pointery * 256.0 / self.WIN_HEIGHT * timeVar) self.avioR.setR(self.avio, pointerx / 10.0) self.avioR.setP(self.avio, pointery / 70.0) self.avioR.setH(self.avio, -pointerx / 50.0) # ~ self.avioVel += self.avioAcc*timeVar # ~ self.avio.setPos(self.avio, self.avioVel*timeVar) return task.cont def propulsaAvio(acceleracio, task): self.avioVel += acceleracio * globalClock.getDt() if self.avioVel < self.VEL_MIN_AVIO: self.avioVel = self.VEL_MIN_AVIO elif self.avioVel > self.VEL_MAX_AVIO: self.avioVel = self.VEL_MAX_AVIO self.BALA_VEL = self.BALA_VEL_BASE + self.avioVel # MOSTRA LA VELOCITAT pos = float(self.avioVel - self.VEL_MIN_AVIO) / (self.VEL_MAX_AVIO - self.VEL_MIN_AVIO) base.camera.setY(self.CAMERA_Y - pos * 4) # ~ self.marcaVelocitat.setX(MARCAVEL_INI_X+pos*137.) return task.cont self.haCremat = False def mouAvio(task): timeVar = globalClock.getDt() self.avio.setPos(self.avio, 0, self.avioVel * timeVar, 0) if self.keyMap["shoot"] == 1: if self.bulletClock <= 0.0: self.bulletClock = self.SHOOT_TIME if not self.haCremat: if self.overheatClock > 16: self.haCremat = True self.overheatClock = 18 else: self.overheatClock += self.SHOOT_TIME shoot() else: self.bulletClock -= timeVar else: self.bulletClock = 0.0 self.overheatClock -= timeVar if self.overheatClock < 16: self.haCremat = False if self.haCremat: self.overheatClock -= timeVar if self.overheatClock < 0: self.overheatClock = 0 elif self.overheatClock < 2: self.overheats[0].hide() elif self.overheatClock < 4: self.overheats[1].hide() self.overheats[0].show() elif self.overheatClock < 6: self.overheats[2].hide() self.overheats[1].show() elif self.overheatClock < 8: self.overheats[3].hide() self.overheats[2].show() elif self.overheatClock < 10: self.overheats[4].hide() self.overheats[3].show() elif self.overheatClock < 12: self.overheats[5].hide() self.overheats[4].show() elif self.overheatClock < 14: self.overheats[6].hide() self.overheats[5].show() self.overheats[7].hide() elif self.overheatClock < 16: self.overheats[7].hide() self.overheats[6].show() else: self.overheats[7].show() if self.keyMap["turn"] == 1: self.avio.setX(self.avio, -self.VEL_COSTAT * timeVar) elif self.keyMap["turn"] == -1: self.avio.setX(self.avio, self.VEL_COSTAT * timeVar) return task.cont def avioRecte(task): p = self.avio.getP(render) if p > 170 or p < -170: return task.cont timeVar = globalClock.getDt() roll = self.avio.getR(render) if roll < -self.VEL_AVIO_RECTE * timeVar: self.avio.setR(render, roll + self.VEL_AVIO_RECTE * timeVar) elif roll <= self.VEL_AVIO_RECTE * timeVar: self.avio.setR(render, 0) else: self.avio.setR(render, roll - self.VEL_AVIO_RECTE * timeVar) return task.cont self.balaPositiu = True def shoot(): bala = self.particlesDummy.attachNewNode("balaDummy") balaImage = OnscreenImage(image="prova/textures/bala.png", parent=bala) balaImage.setTransparency(1) balaImage.setScale(0.1, 1.0, 0.2) balaImage.setBillboardPointEye() bala.setQuat(self.modelAvio.getQuat(render)) if self.balaPositiu: bala.setPos(self.balaDreta.getPos(render)) self.balaPositiu = False else: bala.setPos(self.balaEsquerra.getPos(render)) self.balaPositiu = True balaSphere = bala.attachNewNode(self.balaCol) balaColHandler = CollisionHandlerQueue() base.cTrav.addCollider(balaSphere, balaColHandler) # ~ if type(self.shootPoint) == 'libpanda.Point3': # ~ bala.lookAt(self.shootPoint) # ~ else: bala.setH(bala, 180.) taskMgr.add(mouBala, "moubala", extraArgs=[bala, balaImage, self.BALA_VEL, balaColHandler], appendTask=True) def mouBala(bala, balaImage, vel, queue, task): if task.time > 3: balaImage.detachNode() expbala = ParticleEffect() expbala.reparentTo(self.particlesDummy) expbala.loadConfig("explosio.ptf") expbala.start(bala) taskMgr.doMethodLater(0.25, suprimir, "suprimir", extraArgs=[bala, expbala]) return task.done if queue.getNumEntries() != 0: balaImage.detachNode() entry = queue.getEntry(0) bala.setPos(entry.getSurfacePoint(self.particlesDummy)) expbala = ParticleEffect() expbala.reparentTo(self.particlesDummy) expbala.loadConfig("explosio.ptf") expbala.start(bala) taskMgr.doMethodLater(0.25, suprimir, "suprimir", extraArgs=[bala, expbala]) return task.done bala.setFluidPos(bala, 0, vel * globalClock.getDt(), 0) balaImage.setR(balaImage, 1000 * globalClock.getDt()) return task.cont def suprimir(bala, expbala): bala.detachNode() expbala.cleanup() expbala.detachNode() def setKey(key, value): self.keyMap[key] = value def centraRatoli(): point = base.win.getPointer(0) x = point.getX() y = point.getY() x -= self.H_WIDTH y -= self.H_HEIGHT r = sqrt(pow(abs(y), 2) + pow(abs(x), 2)) def centra(t, x, y): base.win.movePointer(0, trunc(x * t) + self.H_WIDTH, trunc(y * t) + self.H_HEIGHT) i = LerpFunc( centra, fromData=1.0, toData=0.0, duration=r / 700.0, blendType="easeInOut", extraArgs=[x, y], name="centraRata", ) i.start() self.previousPos = 0 self.interval01 = LerpPosHprInterval( self.modelAvio, 0.5, Point3(3, 0, 0), VBase3(0, 0, 70), Point3(0, 0, 0), VBase3(0, 0, 0), blendType="easeInOut", ) self.interval10 = LerpPosHprInterval( self.modelAvio, 0.5, Point3(0, 0, 0), VBase3(0, 0, 0), Point3(-3, 0, 0), VBase3(0, 0, -70), blendType="easeInOut", ) self.interval02 = LerpPosHprInterval( self.modelAvio, 0.5, Point3(-3, 0, 0), VBase3(0, 0, -70), Point3(0, 0, 0), VBase3(0, 0, 0), blendType="easeInOut", ) self.interval20 = LerpPosHprInterval( self.modelAvio, 0.5, Point3(0, 0, 0), VBase3(0, 0, 0), Point3(3, 0, 0), VBase3(0, 0, 70), blendType="easeInOut", ) self.interval12 = LerpPosHprInterval( self.modelAvio, 1.0, Point3(-3, 0, 0), VBase3(0, 0, -70), Point3(3, 0, 0), VBase3(0, 0, 70), blendType="easeInOut", ) self.interval21 = LerpPosHprInterval( self.modelAvio, 1.0, Point3(3, 0, 0), VBase3(0, 0, 70), Point3(-3, 0, 0), VBase3(0, 0, -70), blendType="easeInOut", ) def allIntervalsStopped(): if ( self.interval01.isStopped() and self.interval10.isStopped() and self.interval02.isStopped() and self.interval20.isStopped() and self.interval12.isStopped() and self.interval21.isStopped() ): return True else: return False def tombaAvio(task): if self.keyMap["turn"] == 0 and self.previousPos != 0 and allIntervalsStopped(): if self.previousPos == 1: self.interval10.start() else: self.interval20.start() self.previousPos = 0 elif self.keyMap["turn"] == -1 and self.previousPos != -1 and allIntervalsStopped(): if self.previousPos == 0: self.interval01.start() else: self.interval21.start() self.previousPos = -1 elif self.keyMap["turn"] == 1 and self.previousPos != 1 and allIntervalsStopped(): if self.previousPos == 0: self.interval02.start() else: self.interval12.start() self.previousPos = 1 return task.cont def anim1(): self.mirilla.find("**/+SequenceNode").node().setPlayRate(1.0) self.mirilla.find("**/+SequenceNode").node().play(0, 3) def anim2(): self.mirilla.find("**/+SequenceNode").node().setPlayRate(1.0) self.mirilla.find("**/+SequenceNode").node().play(4, 8) def anim3(): self.mirilla.find("**/+SequenceNode").node().setPlayRate(-1.0) self.mirilla.find("**/+SequenceNode").node().play(0, 3) def anim4(): self.mirilla.find("**/+SequenceNode").node().setPlayRate(-1.0) self.mirilla.find("**/+SequenceNode").node().play(3, 8) # events self.accept(self.QUIT_KEY, sysExit, [0]) self.accept( self.ACCELERATE_KEY, taskMgr.add, [propulsaAvio, "propulsaAvio1", None, [self.ACCELERACIO], None, None, True], ) self.accept(self.ACCELERATE_KEY + "-up", taskMgr.remove, ["propulsaAvio1"]) self.accept( self.DECELERATE_KEY, taskMgr.add, [propulsaAvio, "propulsaAvio2", None, [-self.ACCELERACIO], None, None, True], ) self.accept(self.DECELERATE_KEY + "-up", taskMgr.remove, ["propulsaAvio2"]) for key in self.SHOOT_KEYS: self.accept(key, setKey, ["shoot", 1]) self.accept(key + "-up", setKey, ["shoot", 0]) self.accept(self.RIGHT_KEY, setKey, ["turn", -1]) self.accept(self.LEFT_KEY, setKey, ["turn", 1]) self.accept(self.RIGHT_KEY + "-up", setKey, ["turn", 0]) self.accept(self.LEFT_KEY + "-up", setKey, ["turn", 0]) self.accept(self.CENTRA_RATA_KEY, centraRatoli) self.accept("n", anim1) self.accept("m", anim2) self.accept("v", anim3) self.accept("b", anim4) taskMgr.add(giraAvio, "GiraAvio") taskMgr.add(mouAvio, "MouAvio") taskMgr.add(avioRecte, "avioRecte") taskMgr.add(tombaAvio, "tombaAvio")
class Unit: def __init__(self, unitID, position, mainClass): # self = copy.copy(mainClass.unitHandler.unitDict[mainClass.unitHandler.main['units'][unitID]]) self.model = mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].model self.fullName = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].fullName) self.HP = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].HP) self.info = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].info) self.moveType = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].moveType) self.model = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].model) self.radius = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].radius) self.mass = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].mass) self.startForce = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].startForce) self.maxForce = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].maxForce) self.dig = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].dig) self.reinforce = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].reinforce) self.shovel = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].shovel) self.hold = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].hold) self.modelHeight = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].modelHeight) self.selectScale = copy.copy(mainClass.unitHandler.unitDict[ mainClass.unitHandler.main['units'][unitID]].selectScale) self.job = False self.uID = mainClass.unitHandler.unitUniqueID print self.uID self.modelNode = loader.loadModel(self.model) self.modelNode.setName('unit ' + str(self.uID).zfill(3)) self.modelNode.reparentTo(render) self.modelNode.setPos(position) self.modelNode.setCollideMask(BitMask32.bit(1)) self.select = OnscreenImage(image='data/models/game/selected.png') self.select.setScale(float(self.selectScale)) self.select.reparentTo(self.modelNode) self.select.setZ(float(self.modelHeight) / 2) self.select.setTransparency(TransparencyAttrib.MAlpha) self.select.setBillboardPointEye() self.select.hide() self.groundRay = CollisionRay() self.groundRay.setOrigin(0, 0, 100) self.groundRay.setDirection(0, 0, -1) self.groundCol = CollisionNode('unit Ray') self.groundCol.addSolid(self.groundRay) self.groundCol.setTag('units', 'ray1') self.groundCol.setFromCollideMask(BitMask32.bit(0)) self.groundCol.setIntoCollideMask(BitMask32.allOff()) self.groundColNp = self.modelNode.attachNewNode(self.groundCol) self.groundColNp.setPos(0, 0, 0) self.groundHandler = CollisionHandlerFloor() self.groundHandler.setMaxVelocity(100) base.cTrav2.addCollider(self.groundColNp, self.groundHandler) self.groundHandler.addCollider(self.groundColNp, self.modelNode) self.AI = AICharacter(self.fullName, self.modelNode, self.mass * 2, self.startForce * 2, self.maxForce * 2) mainClass.unitHandler.AIWorld.addAiChar(self.AI) self.AIBehaviors = self.AI.getAiBehaviors() if (self.moveType == 'ground'): self.aStar = astar.aStar(mainClass.unitHandler.meshes.landMesh, mainClass) elif (self.moveType == 'water'): self.aStar = astar.aStar(mainClass.unitHandler.meshes.waterMesh, mainClass) elif (self.moveType == 'air'): self.aStar = astar.aStar(mainClass.unitHandler.meshes.airMesh, mainClass) print self # mainClass.unitHandler.unitUniqueID += 1
class Menu(DirectObject): def __init__(self, cursor): #----------------------------------------------------------------------------------------------------------------------------------------------- #---------------------------------------------------VARIABLE DECLARATION------------------------------------------------------------------------ #----------------------------------------------------------------------------------------------------------------------------------------------- self.title = None self.play = None self.credits = None self.ins = None self.selected = "PLAY" self.pastTime = 0.0 self.oldX = 0.0 self.run = True self.moved = 0.0 #----------------------------------------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------MENU INIT---------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------------------------------------------------- self.title = OnscreenImage("./tex/menu/glooveth.png", (0, 0, -0.25), None, (1.0, 1.0, 0.25), None, None, 10) self.title.setTransparency(TransparencyAttrib.MAlpha) self.credits = OnscreenImage("./tex/menu/credits.png", (-1.0, 0, -0.75), None, (0.25, 1.0, 0.125), None, None, 10) self.credits.setTransparency(TransparencyAttrib.MAlpha) self.ins = OnscreenImage("./tex/menu/ins.png", (1.0, 0, -0.75), None, (0.25, 1.0, 0.125), None, None, 10) self.ins.setTransparency(TransparencyAttrib.MAlpha) self.play = OnscreenImage("./tex/menu/playOver.png", (0, 0, -0.75), None, (0.35, 1.0, 0.20), None, None, 10) self.play.setTransparency(TransparencyAttrib.MAlpha) # Cursor self.cursor = cursor # Start tasks taskMgr.add(self.taskMenuMovement, 'taskMenuMovement') #end __init__ #----------------------------------------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------FUNCTIONS---------------------------------------------------------------------- #----------------------------------------------------------------------------------------------------------------------------------------------- # It hides the main menu of the game def hide(self): self.title.hide() self.play.hide() self.credits.hide() self.ins.hide() self.run = False #end hide # It shows the main menu of the game def show(self): self.title.show() self.play.show() self.credits.show() self.ins.show() taskMgr.add(self.taskMenuMovement, 'taskMenuMovement') self.run = True #end show #----------------------------------------------------------------------------------------------------------------------------------------------- #----------------------------------------------------------------TASKS,THREADS------------------------------------------------------------------ #----------------------------------------------------------------------------------------------------------------------------------------------- # Menu interaction def taskMenuMovement(self, task): if (self.run == True): mpos = self.cursor.getCursorPos() if ((mpos.getX() < -0.33) and (self.oldX >= -0.33)): self.selected = "CREDITS" elif ((mpos.getX() > -0.33) and (self.oldX <= -0.33)): self.selected = "PLAY" elif ((mpos.getX() < 0.33) and (self.oldX >= 0.33)): self.selected = "PLAY" elif ((mpos.getX() > 0.33) and (self.oldX <= 0.33)): self.selected = "INS" # Making bigger the button selected depending on the region of the cursor if (self.selected == "PLAY"): self.play.setImage("./tex/menu/playOver.png") self.play.setTransparency(TransparencyAttrib.MAlpha) self.play.setScale((0.35, 1.0, 0.20)) elif (self.selected == "CREDITS"): self.credits.setImage("./tex/menu/creditsOver.png") self.credits.setTransparency(TransparencyAttrib.MAlpha) self.credits.setScale((0.35, 1.0, 0.20)) elif (self.selected == "INS"): self.ins.setImage("./tex/menu/insOver.png") self.ins.setTransparency(TransparencyAttrib.MAlpha) self.ins.setScale((0.35, 1.0, 0.20)) self.oldX = mpos.getX() # Setting the others to a smaller size if (self.selected == "PLAY"): self.credits.setImage("./tex/menu/credits.png") self.credits.setTransparency(TransparencyAttrib.MAlpha) self.credits.setScale((0.25, 1.0, 0.125)) self.ins.setImage("./tex/menu/ins.png") self.ins.setTransparency(TransparencyAttrib.MAlpha) self.ins.setScale((0.25, 1.0, 0.125)) elif (self.selected == "CREDITS"): self.play.setImage("./tex/menu/play.png") self.play.setTransparency(TransparencyAttrib.MAlpha) self.play.setScale((0.25, 1.0, 0.125)) self.ins.setImage("./tex/menu/ins.png") self.ins.setTransparency(TransparencyAttrib.MAlpha) self.ins.setScale((0.25, 1.0, 0.125)) elif (self.selected == "INS"): self.play.setImage("./tex/menu/play.png") self.play.setTransparency(TransparencyAttrib.MAlpha) self.play.setScale((0.25, 1.0, 0.125)) self.credits.setImage("./tex/menu/credits.png") self.credits.setTransparency(TransparencyAttrib.MAlpha) self.credits.setScale((0.25, 1.0, 0.125)) return task.cont else: return task.done #end taskMenuMovement #end class Menu
class Jugador(DirectObject): #Les variables que tinguin un # son canviables, i les que tinguin ## depenen de la nau WIN_WIDTH = 800 # H_WIDTH = WIN_WIDTH / 2 WIN_HEIGHT = 600 # H_HEIGHT = WIN_HEIGHT / 2 CAM_FOV = 51. CAM_FOV_RAD = radians(CAM_FOV) / 2 CAM_FOV_RAD_TAN = tan(CAM_FOV_RAD) VEL_MAX_AVIO = 100 ## VEL_MIN_AVIO = 30 ## VEL_AVIO_RECTE = 40. ## VEL_TOMBA_AVIO = 90. ## VEL_COSTAT = 30. ## ACCELERACIO = 35 ## CAMERA_Y = -9 ## BALA_VEL_BASE = 500 ## QUIT_KEY = "escape" # ACCELERATE_KEY = "w" # DECELERATE_KEY = "s" # RIGHT_KEY = "d" # LEFT_KEY = "a" # CENTRA_RATA_KEY = "c" # SHOOT_KEYS = ["mouse1", "e"] # SHOOT_TIME = .15 ## def __init__(self, base, ini_pos=Point3(0, 100, 100), tipus="kamikaze", wwidth=None, wheight=None): DirectObject.__init__(self) if wwidth and wheight: self.WIN_WIDTH = wwidth self.H_WIDTH = self.WIN_WIDTH / 2 self.WIN_HEIGHT = wheight self.H_HEIGHT = self.WIN_HEIGHT / 2 self.keyMap = {"shoot": 0, "centerPointer": 0, "turn": 0} self.bulletClock = 0. self.overheatClock = 0. self.BALA_VEL = self.BALA_VEL_BASE + self.VEL_MIN_AVIO ambient = AmbientLight("alight") ambientNp = render.attachNewNode(ambient) ambient.setColor(VBase4(.3, .3, .3, 1.)) self.avio = render.attachNewNode("avio") self.avio.setHpr(randint(0, 359), randint(0, 359), randint(0, 359)) self.avio.setPos(ini_pos) self.avioR = self.avio.attachNewNode("avioDum2") if tipus == "kamikaze": self.modelAvio = base.loader.loadModel('prova/avio1blend') else: self.modelAvio = base.loader.loadModel('prova/avio1blend') self.modelAvio.reparentTo(self.avioR) self.avioVel = self.VEL_MIN_AVIO self.balaDreta = self.modelAvio.find("**/BalaDreta") self.balaEsquerra = self.modelAvio.find("**/BalaEsquerra") self.avio.setLight(ambientNp) self.avio.setAntialias(AntialiasAttrib.MMultisample) self.modelAvio.setColor(1, 1, 0, 1) self.modelAvio.setScale(.51) lightBales = AmbientLight('dlight') self.lightBalesNp = base.camera.attachNewNode(lightBales) self.lightBalesNp.setHpr(0, 0, 0) #-#-#-#-configuracio de camara base.disableMouse() #~ self.oobe() base.camera.reparentTo(self.avio) base.camera.setHpr(self.avio, 0, 0, 0) base.camera.setPos(self.avio, 0, self.CAMERA_Y, 1.5) base.camLens.setFov(self.CAM_FOV * (4. / 3.), self.CAM_FOV) self.mirilla2 = OnscreenImage(image="prova/textures/areatir2.png", parent=pixel2d) self.mirilla2.setScale(128) self.mirilla2.setTransparency(1) self.mirilla2.setPos(self.H_WIDTH, 0, -self.H_HEIGHT) self.mirilla = base.loader.loadModel("prova/textures/fixador.egg") self.mirilla.reparentTo(pixel2d) self.mirilla.setScale(64.) self.mirilla.setPos(0, 0, 0) self.mirilla.find('**/+SequenceNode').node().pose(0) self.cursorGirar = pixel2d.attachNewNode("cursorGirar") self.cursorGirarImage = OnscreenImage( image="prova/textures/fletxa.png", parent=self.cursorGirar) self.cursorGirarImage.setScale(16. / 2, 1., 32. / 2) self.cursorGirarImage.setPos(0, 0, 0) self.cursorGirarImage.setHpr(-90, 0, -90) self.cursorGirarImage.setTransparency(1) cursorGirarEffect = BillboardEffect.make(up_vector=Vec3(0, 0, 1), eye_relative=False, axial_rotate=False, offset=0., look_at=self.mirilla2, look_at_point=Point3(0, 0, 0)) self.cursorGirar.setEffect(cursorGirarEffect) self.overheats = [] for i in range(8): if i % 2 == 0: self.overheats.append( OnscreenImage(image="prova/textures/overheat1.png", parent=pixel2d)) else: self.overheats.append( OnscreenImage(image="prova/textures/overheat2.png", parent=pixel2d)) self.overheats[i].setScale(32., 1., 32.) self.overheats[i].setTransparency(1) self.overheats[i].hide() self.overheats[0].setPos(self.H_WIDTH + 36, 0, -self.H_HEIGHT + 36) self.overheats[0].setHpr(0, 0, 0) self.overheats[1].setPos(self.H_WIDTH + 36, 0, -self.H_HEIGHT + 36) self.overheats[1].setHpr(0, 0, 0) self.overheats[2].setPos(self.H_WIDTH + 36, 0, -self.H_HEIGHT - 36) self.overheats[2].setHpr(0, 0, 90) self.overheats[3].setPos(self.H_WIDTH + 36, 0, -self.H_HEIGHT - 36) self.overheats[3].setHpr(0, 0, 90) self.overheats[4].setPos(self.H_WIDTH - 36, 0, -self.H_HEIGHT - 36) self.overheats[4].setHpr(0, 0, 180) self.overheats[5].setPos(self.H_WIDTH - 36, 0, -self.H_HEIGHT - 36) self.overheats[5].setHpr(0, 0, 180) self.overheats[6].setPos(self.H_WIDTH - 36, 0, -self.H_HEIGHT + 36) self.overheats[6].setHpr(0, 0, -90) self.overheats[7].setPos(self.H_WIDTH - 36, 0, -self.H_HEIGHT + 36) self.overheats[7].setHpr(0, 0, -90) #PARTICLE SYSTEM SETUP self.particlesDummy = render.attachNewNode("particlesDummy") self.particlesDummy.setPosHprScale(0, 0, 0, 0, 0, 0, 1, 1, 1) self.particlesDummy.clearLight(render.find("dlight")) self.particlesDummy.setLight(self.lightBalesNp) base.enableParticles() #COLLISIONS base.cTrav = CollisionTraverser() base.cTrav.setRespectPrevTransform(True) self.balaCol = CollisionNode("balaCol") self.balaCol.setIntoCollideMask(BitMask32.allOff()) self.balaCol.setFromCollideMask(BitMask32(0x00000001)) balaColSolid = CollisionSphere(0., 0., 0., .2) self.balaCol.addSolid(balaColSolid) self.pickRay = CollisionNode("pickRay") self.pickRayNp = base.camera.attachNewNode(self.pickRay) self.pickRay.setIntoCollideMask(BitMask32.allOff()) self.pickRay.setFromCollideMask(BitMask32(0x00000002)) self.pickRayCHandler = CollisionHandlerQueue() self.mouseRay = CollisionRay() self.pickRay.addSolid(self.mouseRay) self.mouseRay.setOrigin(0, 0, 0) base.cTrav.addCollider(self.pickRayNp, self.pickRayCHandler) #~ self.nearPlane = CollisionNode("nearPlane") #~ self.nearPlaneNp = base.camera.attachNewNode(self.nearPlane) #~ base.camRays.setIntoCollideMask(BitMask32(0x00000001)) #~ self.nearPlaneNp.setPos(0, 1, 0) #~ self.nearPlaneColSolid = CollisionPlane(Plane(Vec3(0, -1, 0), Point3(0, 1, 0))) #~ self.nearPlane.addSolid(self.nearPlaneColSolid) def giraAvio(task): timeVar = globalClock.getDt() point = base.win.getPointer(0) pointerx = point.getX() pointery = point.getY() self.mouseRay.setFromLens(base.camNode, pointerx, pointery) #Cursors de la pantalla self.mirilla.setPos(pointerx, 0, -pointery) self.cursorGirar.setPos(pointerx, 0, -pointery) r = pow(abs(pointery - self.H_HEIGHT), 2) + pow( abs(pointerx - self.H_WIDTH), 2) if r > 8000: self.mirilla.hide() self.cursorGirar.show() else: self.mirilla.show() self.cursorGirar.hide() #3D pointerx = (pointerx - self.H_WIDTH) pointery = (pointery - self.H_HEIGHT) self.avioR.setX(self.avio, -pointerx * 3. / float(self.WIN_WIDTH)) self.avioR.setZ(self.avio, pointery * 3. / (self.WIN_HEIGHT)) self.avio.setH(self.avio, -pointerx * 256. / self.WIN_WIDTH * timeVar) self.avio.setP(self.avio, -pointery * 256. / self.WIN_HEIGHT * timeVar) self.avioR.setR(self.avio, pointerx / 10.) self.avioR.setP(self.avio, pointery / 70.) self.avioR.setH(self.avio, -pointerx / 50.) #~ self.avioVel += self.avioAcc*timeVar #~ self.avio.setPos(self.avio, self.avioVel*timeVar) return task.cont def propulsaAvio(acceleracio, task): self.avioVel += acceleracio * globalClock.getDt() if self.avioVel < self.VEL_MIN_AVIO: self.avioVel = self.VEL_MIN_AVIO elif self.avioVel > self.VEL_MAX_AVIO: self.avioVel = self.VEL_MAX_AVIO self.BALA_VEL = self.BALA_VEL_BASE + self.avioVel #MOSTRA LA VELOCITAT pos = float(self.avioVel - self.VEL_MIN_AVIO) / ( self.VEL_MAX_AVIO - self.VEL_MIN_AVIO) base.camera.setY(self.CAMERA_Y - pos * 4) #~ self.marcaVelocitat.setX(MARCAVEL_INI_X+pos*137.) return task.cont self.haCremat = False def mouAvio(task): timeVar = globalClock.getDt() self.avio.setPos(self.avio, 0, self.avioVel * timeVar, 0) if self.keyMap["shoot"] == 1: if self.bulletClock <= 0.: self.bulletClock = self.SHOOT_TIME if not self.haCremat: if self.overheatClock > 16: self.haCremat = True self.overheatClock = 18 else: self.overheatClock += self.SHOOT_TIME shoot() else: self.bulletClock -= timeVar else: self.bulletClock = 0. self.overheatClock -= timeVar if self.overheatClock < 16: self.haCremat = False if self.haCremat: self.overheatClock -= timeVar if self.overheatClock < 0: self.overheatClock = 0 elif self.overheatClock < 2: self.overheats[0].hide() elif self.overheatClock < 4: self.overheats[1].hide() self.overheats[0].show() elif self.overheatClock < 6: self.overheats[2].hide() self.overheats[1].show() elif self.overheatClock < 8: self.overheats[3].hide() self.overheats[2].show() elif self.overheatClock < 10: self.overheats[4].hide() self.overheats[3].show() elif self.overheatClock < 12: self.overheats[5].hide() self.overheats[4].show() elif self.overheatClock < 14: self.overheats[6].hide() self.overheats[5].show() self.overheats[7].hide() elif self.overheatClock < 16: self.overheats[7].hide() self.overheats[6].show() else: self.overheats[7].show() if self.keyMap["turn"] == 1: self.avio.setX(self.avio, -self.VEL_COSTAT * timeVar) elif self.keyMap["turn"] == -1: self.avio.setX(self.avio, self.VEL_COSTAT * timeVar) return task.cont def avioRecte(task): p = self.avio.getP(render) if p > 170 or p < -170: return task.cont timeVar = globalClock.getDt() roll = self.avio.getR(render) if roll < -self.VEL_AVIO_RECTE * timeVar: self.avio.setR(render, roll + self.VEL_AVIO_RECTE * timeVar) elif roll <= self.VEL_AVIO_RECTE * timeVar: self.avio.setR(render, 0) else: self.avio.setR(render, roll - self.VEL_AVIO_RECTE * timeVar) return task.cont self.balaPositiu = True def shoot(): bala = self.particlesDummy.attachNewNode("balaDummy") balaImage = OnscreenImage(image="prova/textures/bala.png", parent=bala) balaImage.setTransparency(1) balaImage.setScale(.1, 1., .2) balaImage.setBillboardPointEye() bala.setQuat(self.modelAvio.getQuat(render)) if self.balaPositiu: bala.setPos(self.balaDreta.getPos(render)) self.balaPositiu = False else: bala.setPos(self.balaEsquerra.getPos(render)) self.balaPositiu = True balaSphere = bala.attachNewNode(self.balaCol) balaColHandler = CollisionHandlerQueue() base.cTrav.addCollider(balaSphere, balaColHandler) #~ if type(self.shootPoint) == 'libpanda.Point3': #~ bala.lookAt(self.shootPoint) #~ else: bala.setH(bala, 180.) taskMgr.add( mouBala, "moubala", extraArgs=[bala, balaImage, self.BALA_VEL, balaColHandler], appendTask=True) def mouBala(bala, balaImage, vel, queue, task): if task.time > 3: balaImage.detachNode() expbala = ParticleEffect() expbala.reparentTo(self.particlesDummy) expbala.loadConfig('explosio.ptf') expbala.start(bala) taskMgr.doMethodLater(.25, suprimir, "suprimir", extraArgs=[bala, expbala]) return task.done if queue.getNumEntries() != 0: balaImage.detachNode() entry = queue.getEntry(0) bala.setPos(entry.getSurfacePoint(self.particlesDummy)) expbala = ParticleEffect() expbala.reparentTo(self.particlesDummy) expbala.loadConfig('explosio.ptf') expbala.start(bala) taskMgr.doMethodLater(.25, suprimir, "suprimir", extraArgs=[bala, expbala]) return task.done bala.setFluidPos(bala, 0, vel * globalClock.getDt(), 0) balaImage.setR(balaImage, 1000 * globalClock.getDt()) return task.cont def suprimir(bala, expbala): bala.detachNode() expbala.cleanup() expbala.detachNode() def setKey(key, value): self.keyMap[key] = value def centraRatoli(): point = base.win.getPointer(0) x = point.getX() y = point.getY() x -= self.H_WIDTH y -= self.H_HEIGHT r = sqrt(pow(abs(y), 2) + pow(abs(x), 2)) def centra(t, x, y): base.win.movePointer(0, trunc(x * t) + self.H_WIDTH, trunc(y * t) + self.H_HEIGHT) i = LerpFunc(centra, fromData=1., toData=0., duration=r / 700., blendType='easeInOut', extraArgs=[x, y], name="centraRata") i.start() self.previousPos = 0 self.interval01 = LerpPosHprInterval(self.modelAvio, .5, Point3(3, 0, 0), VBase3(0, 0, 70), Point3(0, 0, 0), VBase3(0, 0, 0), blendType='easeInOut') self.interval10 = LerpPosHprInterval(self.modelAvio, .5, Point3(0, 0, 0), VBase3(0, 0, 0), Point3(-3, 0, 0), VBase3(0, 0, -70), blendType='easeInOut') self.interval02 = LerpPosHprInterval(self.modelAvio, .5, Point3(-3, 0, 0), VBase3(0, 0, -70), Point3(0, 0, 0), VBase3(0, 0, 0), blendType='easeInOut') self.interval20 = LerpPosHprInterval(self.modelAvio, .5, Point3(0, 0, 0), VBase3(0, 0, 0), Point3(3, 0, 0), VBase3(0, 0, 70), blendType='easeInOut') self.interval12 = LerpPosHprInterval(self.modelAvio, 1., Point3(-3, 0, 0), VBase3(0, 0, -70), Point3(3, 0, 0), VBase3(0, 0, 70), blendType='easeInOut') self.interval21 = LerpPosHprInterval(self.modelAvio, 1., Point3(3, 0, 0), VBase3(0, 0, 70), Point3(-3, 0, 0), VBase3(0, 0, -70), blendType='easeInOut') def allIntervalsStopped(): if self.interval01.isStopped() and self.interval10.isStopped( ) and self.interval02.isStopped() and self.interval20.isStopped( ) and self.interval12.isStopped() and self.interval21.isStopped(): return True else: return False def tombaAvio(task): if self.keyMap[ "turn"] == 0 and self.previousPos != 0 and allIntervalsStopped( ): if self.previousPos == 1: self.interval10.start() else: self.interval20.start() self.previousPos = 0 elif self.keyMap[ "turn"] == -1 and self.previousPos != -1 and allIntervalsStopped( ): if self.previousPos == 0: self.interval01.start() else: self.interval21.start() self.previousPos = -1 elif self.keyMap[ "turn"] == 1 and self.previousPos != 1 and allIntervalsStopped( ): if self.previousPos == 0: self.interval02.start() else: self.interval12.start() self.previousPos = 1 return task.cont def anim1(): self.mirilla.find('**/+SequenceNode').node().setPlayRate(1.) self.mirilla.find('**/+SequenceNode').node().play(0, 3) def anim2(): self.mirilla.find('**/+SequenceNode').node().setPlayRate(1.) self.mirilla.find('**/+SequenceNode').node().play(4, 8) def anim3(): self.mirilla.find('**/+SequenceNode').node().setPlayRate(-1.) self.mirilla.find('**/+SequenceNode').node().play(0, 3) def anim4(): self.mirilla.find('**/+SequenceNode').node().setPlayRate(-1.) self.mirilla.find('**/+SequenceNode').node().play(3, 8) #events self.accept(self.QUIT_KEY, sysExit, [0]) self.accept(self.ACCELERATE_KEY, taskMgr.add, [ propulsaAvio, "propulsaAvio1", None, [self.ACCELERACIO], None, None, True ]) self.accept(self.ACCELERATE_KEY + "-up", taskMgr.remove, ["propulsaAvio1"]) self.accept(self.DECELERATE_KEY, taskMgr.add, [ propulsaAvio, "propulsaAvio2", None, [-self.ACCELERACIO], None, None, True ]) self.accept(self.DECELERATE_KEY + "-up", taskMgr.remove, ["propulsaAvio2"]) for key in self.SHOOT_KEYS: self.accept(key, setKey, ["shoot", 1]) self.accept(key + "-up", setKey, ["shoot", 0]) self.accept(self.RIGHT_KEY, setKey, ["turn", -1]) self.accept(self.LEFT_KEY, setKey, ["turn", 1]) self.accept(self.RIGHT_KEY + "-up", setKey, ["turn", 0]) self.accept(self.LEFT_KEY + "-up", setKey, ["turn", 0]) self.accept(self.CENTRA_RATA_KEY, centraRatoli) self.accept("n", anim1) self.accept("m", anim2) self.accept("v", anim3) self.accept("b", anim4) taskMgr.add(giraAvio, "GiraAvio") taskMgr.add(mouAvio, "MouAvio") taskMgr.add(avioRecte, "avioRecte") taskMgr.add(tombaAvio, "tombaAvio")