class GuiUnitInfo: def __init__(self, offset, parent, unit_type, default_hp, hp, default_ap, ap): self.offset = offset self.frame = DirectFrame( relief = DGG.FLAT , scale = 1 , frameSize = (-0.5, 0.5, 0, -0.5) , parent = parent ) self.frame.setBillboardPointEye() self.frame.setLightOff() self.frame.setBin("fixed", 40) self.frame.setDepthTest(False) self.frame.setDepthWrite(False) fixedWidthFont = loader.loadFont(GUI_FONT)#@UndefinedVariable #fixedWidthFont.setPixelsPerUnit(60) #fixedWidthFont.setRenderMode(fontt.RMSolid) if not fixedWidthFont.isValid(): print "pandaInteractiveConsole.py :: could not load the defined font %s" % str(self.font) fixedWidthFont = DGG.getDefaultFont() self.label = OnscreenText( parent = self.frame , text = "" , pos = (offset.getX(),offset.getZ()+0.1) , align=TextNode.ACenter , mayChange=True , scale=0.1 , fg = (1,0,0,1) #, shadow = (0, 0, 0, 1) #, frame = (200,0,0,1) ) self.label.setFont( fixedWidthFont ) #self.label.setLightOff() self.all_icons = {} self.visible_icons = {} self.addIcon("overwatch") self.addIcon("set_up") self.ap_bar = DirectWaitBar(parent = self.frame , text = "" , range = default_ap , value = ap , pos = (offset.getX()+0.08,0,offset.getZ()-0.27) , barColor = (0,0,1,1) , frameColor = (0,0,0.5,0.2) , scale = (0.3,0.5,0.3)) self.hp_bar = DirectWaitBar(parent = self.frame , text = "" , range = default_hp , value = hp , pos = (offset.getX()+0.08,0,offset.getZ()-0.2) , barColor = (0,1,0,1) , frameColor = (1,0,0,0.9) , scale = (0.3,0.5,0.3)) self.insignia = OnscreenImage(parent = self.frame ,image = "unit_" + unit_type + "_big_transparent_32.png" #,pos = (offset.getX(),0,offset.getZ()+0.14) , pos = (offset.getX() - 0.31,0,offset.getZ()-0.23) ,scale = 0.09) self.insignia.setTransparency(TransparencyAttrib.MAlpha) def addIcon(self, name): self.all_icons[name] = OnscreenImage(parent = self.frame ,image = name + "_icon.png" #,pos = offset + (0,0,-0.1) ,scale = 0.08) self.all_icons[name].setTransparency(TransparencyAttrib.MAlpha) self.all_icons[name].hide() def write(self, text): text = "" self.label.setText(text) def redraw(self): return def remove(self): self.frame.remove() def reparentTo(self, parent): self.frame.reparentTo(parent) def hide(self): self.label.hide() def show(self): self.label.show() def refreshBars(self, hp, ap): self.ap_bar['value'] = ap self.hp_bar['value'] = hp self.ap_bar.setValue() self.hp_bar.setValue() def refreshIcons(self): count = len(self.visible_icons) start_pos = (1 - count) * 0.25 / 2 for icon in self.all_icons: if icon in self.visible_icons: self.visible_icons[icon].setPos(self.offset + (start_pos, 0, -0.08)) self.visible_icons[icon].show() start_pos += 0.21 else: self.all_icons[icon].hide() def hideOverwatch(self): if "overwatch" in self.visible_icons: self.visible_icons.pop("overwatch") self.refreshIcons() def showOverwatch(self): self.visible_icons["overwatch"] = self.all_icons["overwatch"] self.refreshIcons() def hideSetUp(self): if "set_up" in self.visible_icons: self.visible_icons.pop("set_up") self.refreshIcons() def showSetUp(self): self.visible_icons["set_up"] = self.all_icons["set_up"] self.refreshIcons()
class DistributedInspectionSite(DistributedNode): def __init__(self, cr): DistributedNode.__init__(self, cr) ####################################################### # The below attributes are required at generation time. ####################################################### # The site id is the unique id associated with the data # for the inspection site. ####################################################### self.siteId = -1 self.zoneId = -1 ####################################################### self.siteData = None self.distanceTask = None self.interactCollSphereNP = None self.interactCollSphere = None self.identifierIcon = None self.floorMarker = None self.iconSequence = None self.fadeSequence = None self.text = None def setSiteId(self, _id): self.siteId = _id def getSiteId(self): return self.siteId def setZoneId(self, _id): self.zoneId = _id def getZoneId(self): return self.zoneId def announceGenerate(self): DistributedNode.announceGenerate(self) self.setName('InspectionSite-%d' % self.siteId) self.notify = directNotify.newCategory('DistributedInspectionSite[%d]' % self.siteId) self.siteData = InspectionSites.getSiteById(self.zoneId, self.siteId) if self.siteData: interactKey = base.inputStore.Interact.upper() self.text = OnscreenText( text = 'Press \'%s\' to %s' % (interactKey, self.siteData.type), pos = (0, -0.75), font = CIGlobals.getToonFont(), fg = (1, 1, 1, 1), shadow = (0, 0, 0, 1) ) self.text.hide() self.distanceTask = base.taskMgr.add(self.__calculateDistance, self.uniqueName('calculateAvDistance')) self.generateCollision() self.generateIconAndMarker() self.accept('enter' + self.interactCollSphereNP.getName(), self.onEnter) self.accept('exit' + self.interactCollSphereNP.getName(), self.onExit) self.reparentTo(render) def __calculateDistance(self, task): dist = float(base.localAvatar.getPos(self).length()) fullAlphaDist = 15.0 noAlphaDist = 105.0 alpha = 1.0 if 10 < dist < noAlphaDist: alpha = float(fullAlphaDist / dist) if alpha < 0.0: alpha = 0.0 elif dist >= noAlphaDist: alpha = 0.0 self.identifierIcon.setColorScale(1.0, 1.0, 1.0, alpha) self.floorMarker.setColorScale(1.0, 1.0, 1.0, alpha) return task.cont def generateCollision(self): self.interactCollSphere = CollisionSphere(0, 0, 0, 4) self.interactCollSphere.setTangible(0) ss = CollisionNode('inspectionSensor') ss.addSolid(self.interactCollSphere) self.interactCollSphereNP = self.attachNewNode(ss) self.interactCollSphereNP.setCollideMask(CIGlobals.EventBitmask) def generateIconAndMarker(self): icon = 'phase_5/maps/inspect_location.mat' self.identifierIcon = DirectFrame(parent = self, image = icon, frameColor = (0, 0, 0, 0)) self.identifierIcon.setTransparency(TransparencyAttrib.MAlpha) self.identifierIcon.setTwoSided(1) self.identifierIcon.setBillboardPointEye() self.identifierIcon.setZ(2.0) self.iconSequence = Sequence( LerpPosInterval(self.identifierIcon, 1.0, pos = (0, 0, 6.0), startPos = (0, 0, 3.0), blendType = 'easeInOut', name = ('inspSite%d-in' % self.siteId)), LerpPosInterval(self.identifierIcon, 1.0, pos = (0, 0, 3.0), startPos = (0, 0, 6.0), blendType = 'easeInOut', name = ('inspSite%d-out' % self.siteId)) ) self.iconSequence.loop() cm = CardMaker('marker') self.floorMarker = self.attachNewNode(cm.generate()) self.floorMarker.setBSPMaterial(icon, 1) self.floorMarker.setTransparency(TransparencyAttrib.MAlpha) self.floorMarker.setTwoSided(1) self.floorMarker.setPosHpr(-2.50, 2.53, -0.01, 0.0, 90.0, 0.0) self.floorMarker.setScale(5.0) def requestEnter(self): pass def canEnter(self): place = base.cr.playGame.getPlace() return place and place.fsm.getCurrentState().getName() == 'walk' def onEnter(self, _): self.text.show() self.acceptOnce(base.inputStore.Interact, self.requestEnter) def onExit(self, _): self.text.hide() self.ignore(base.inputStore.Interact) def disable(self): DistributedNode.disable(self) base.taskMgr.remove(self.distanceTask) if self.iconSequence: self.iconSequence.finish() self.iconSequence = None if self.fadeSequence: self.fadeSequence.finish() self.fadeSequence = None if self.text: self.text.hide() self.ignoreAll() def delete(self): if self.siteData: self.siteData = None if self.identifierIcon: self.identifierIcon.destroy() self.identifierIcon = None if self.distanceTask: self.distanceTask = None if self.interactCollSphereNP: self.interactCollSphereNP.removeNode() self.interactCollSphereNP = None self.interactCollSphere = None if self.floorMarker: self.floorMarker.removeNode() self.floorMarker = None if self.text: self.text.hide() self.text.destroy() self.text = None del self.siteData del self.identifierIcon del self.distanceTask del self.interactCollSphereNP del self.interactCollSphere del self.floorMarker del self.text DistributedNode.delete(self)