Пример #1
0
class Preloader():
    
    def __init__(self):
        self.progressBar = DirectWaitBar(text = "", value = 0, pos = (0,0,0), scale = 0.5, barColor = (1,0.3,0,1))
        self.textObject = OnscreenText(text = "", pos = (0.0,-0.15),
                              scale = 0.1,fg=(0,0,0,1),align=TextNode.ACenter,mayChange=1)
                              
        f = open('models_2.txt', 'r')
        self.models = f.readlines()
        f.close()
        
        for N in range(len(self.models)):
            self.models[N] = self.models[N].replace("\n", "")
            
        self.totalItems = len(self.models)
        
        base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()
        
        self.itemCount = 0
        
        for M in self.models:
            print(M)
            item = loader.loadModel(M)
            progress = 100 / float(self.totalItems)
            self.progressBar['value'] += progress
            #text = str(self.progressBar['value'])+'%'
            self.textObject.setText("Loading")
            #self.loaderBar.setTexOffset(self.modTS, -progress + 0.15,0)
            base.graphicsEngine.renderFrame()
            base.graphicsEngine.renderFrame()
            
        self.textObject.destroy()
        self.progressBar.destroy()
Пример #2
0
class RaceGui(Gui, RaceGuiFacade):
    def __init__(self, mdt, racegui_props):
        Gui.__init__(self, mdt)
        r_p = self.props = racegui_props
        result_props = ResultProps(r_p.menu_args, r_p.drivers_img,
                                   r_p.cars_imgs, r_p.share_urls,
                                   r_p.share_imgs, r_p.track_name)
        self.results = Results(result_props)
        self.loading = Loading(mdt)
        self.debug_txt = OnscreenText('',
                                      pos=(-.1, .1),
                                      scale=.05,
                                      fg=(1, 1, 1, 1),
                                      parent=eng.base.a2dBottomRight,
                                      align=TextNode.ARight)
        self.way_txt = OnscreenText('',
                                    pos=(.1, .1),
                                    scale=.1,
                                    fg=r_p.menu_args.text_err,
                                    parent=eng.base.a2dBottomLeft,
                                    align=TextNode.ALeft,
                                    font=FontMgr().load_font(r_p.font))

    def start(self):
        self.minimap = Minimap(self.mdt.track.lrtb, self.props.minimap_path,
                               self.props.minimap_image, self.props.col_dct,
                               self.props.cars, self.props.car_name)

    def destroy(self):
        self.results.destroy()
        self.loading.destroy()
        self.way_txt.destroy()
        self.minimap.destroy()
        Gui.destroy(self)
Пример #3
0
class Countdown(GameObject):
    def __init__(self, sfx_path, font, seconds):
        GameObject.__init__(self)
        self.countdown_sfx = loader.loadSfx(sfx_path)
        self.__countdown_txt = OnscreenText('',
                                            pos=(0, 0),
                                            scale=.2,
                                            fg=(1, 1, 1, 1),
                                            font=font)
        self.__cnt = seconds
        self.tsk = self.eng.do_later(1.0, self.process_countdown)

    def process_countdown(self):
        if self.__cnt >= 0:
            self.countdown_sfx.play()
            txt = str(self.__cnt) if self.__cnt else _('GO!')
            self.__countdown_txt.setText(txt)
            self.__cnt -= 1
            return Task.again
        self.__countdown_txt.destroy()
        self.notify('on_start_race')

    def destroy(self):
        self.tsk = self.eng.rm_do_later(self.tsk)
        self.__countdown_txt.destroy()
        GameObject.destroy(self)
class LoadingScreen:
    def __init__(self, main):
        self.main = main
        self.imageObject = OnscreenImage(image = 'IMAGES/loading.jpg', pos = (0, 0, 0))
        self.imageObject.reparentTo(render2d)
        #base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()

    def finish(self):
        self.imageObject.destroy()
        self.countDownText = OnscreenText(text=str(countDownStart), style=1, fg=(1,1,1,1),
                pos=(0.01, 0.1), align = TextNode.ACenter, scale = .2, mayChange = 1)
        taskMgr.add(self.countDown,"countDownTask")

    def countDown(self,task):
        timeLeft = "%01d" % (countDownStart - task.time)
        if (countDownStart - task.time) > 1:
            self.countDownText.setText(timeLeft)
            return task.cont
        elif 1 > (countDownStart - task.time) > 0:
            self.countDownText.setText("GO!")
            return task.cont
        else:
            self.canMove = True
            if not self.main.isActive:
                print "Activate"
                self.main.isActive = True
                taskMgr.add(self.main.update, 'updateWorld')
                self.main.activateKeys()
            self.countDownText.destroy()
            return task.done
Пример #5
0
class Countdown(Subject):

    def __init__(self, countdown_sfx, font):
        Subject.__init__(self)
        self.countdown_sfx = loader.loadSfx(countdown_sfx)
        self.__countdown_txt = OnscreenText(
            '', pos=(0, 0), scale=.2, fg=(1, 1, 1, 1), font=font)
        self.countdown_cnt = 3
        meth = self.process_countdown
        self.tsk = taskMgr.doMethodLater(1.0, meth, 'countdown')
        # manage repeating do_later

    def process_countdown(self, task):
        if self.countdown_cnt >= 0:
            self.countdown_sfx.play()
            txt = str(self.countdown_cnt) if self.countdown_cnt else _('GO!')
            self.__countdown_txt.setText(txt)
            self.countdown_cnt -= 1
            return task.again
        self.__countdown_txt.destroy()
        self.notify('on_start_race')

    def destroy(self):
        self.tsk = taskMgr.remove(self.tsk)
        self.__countdown_txt.destroy()
        Subject.destroy(self)
Пример #6
0
 def isCheck(self, index):
     kingIndex = 0
     for i in range(0, 64):
         if (isinstance(self.pieces[i], King)
                 and self.pieces[i].obj.getColor() != self.turn):
             kingIndex = i
     for j in range(0, 64):
         if (isinstance(self.pieces[index], Piece)
                 and self.pieces[index].obj.getColor() == self.turn):
             if (self.checkIfRoutePossible(
                     index, kingIndex,
                     self.pieces[index].getMovementTableBattle())):
                 global check
                 print("CHECK FOUND")
                 label = "white"
                 if self.turn == WHITE:
                     label = "black"
                 check = OnscreenText(text="Check on " + label + " king",
                                      parent=base.a2dTopLeft,
                                      align=TextNode.ALeft,
                                      style=1,
                                      fg=(1, 1, 1, 1),
                                      pos=(0.06, -0.26),
                                      scale=.05)
             elif (not isinstance(check, type(None))):
                 print("Should remove now")
                 check.destroy()
                 check = None
Пример #7
0
class TextHistoryLabel(NodePath):
    def __init__(self, text, speaker = None, voiceName = None, parent = None, height = 0):
        #TODO add a voice button in it
        NodePath.__init__(self,'texthistorylabel')
        
        self.parent = parent or aspect2d
        self.reparentTo(parent)
        
        if speaker:
            text = '\1th_name\1(' + speaker.strip() + ')\n\2' + text
        
        self.textcontent = OnscreenText(text = text,align = TextNode.ALeft, pos = (TEXTLEFT,-height),
                                   wordwrap = WORDWRAP, parent = self, **base.getStyle('historytext'))
        
        self.labelHeight = self.textcontent.textNode.getHeight() * self.textcontent.getScale()[1]

        
    def destroy(self):
        self.textcontent.destroy()
        self.removeNode()
        
    def getLabelHeight(self):
        return self.labelHeight
        
        
Пример #8
0
class MyApp(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)
        self.hs = OnscreenText(' ',
                               style=1,
                               fg=(1, 1, 1, 1),
                               pos=(-0.4, -0.8),
                               scale=.1)
        bg = OnscreenImage(image='models/banner.png', pos=(0, 0, 0))
        b = DirectButton(text=("Play"),
                         text_bg=(255, 255, 255, 0),
                         text_scale=(0.5, 0.5),
                         text_fg=(0, 0, 255, 255),
                         scale=.2,
                         command=setText)
        b.setPos(0.55, 0, -0.75)
        self.taskMgr.add(self.update, "update")

    def update(self, task):
        p = open('score.txt', 'r')
        score = p.readline()
        p.close()
        self.hs.destroy()
        self.hs = OnscreenText(score,
                               style=1,
                               fg=(1, 1, 1, 1),
                               pos=(-0.4, -0.8),
                               scale=.1)
        return Task.cont
Пример #9
0
class Alert(Notifier):
    def __init__(self, reason):
        Notifier.__init__(self, "alert")
        VirtualFileSystem.getGlobalPtr().mount(Filename("mf/alert.mf"), ".",
                                               VirtualFileSystem.MFReadOnly)
        ok = loader.loadModel("alert.egg")

        if reason not in LOCAL_EN:
            reason = GENERAL

        self.reason = reason

        self.bg_frame = DirectFrame(frameColor=(0, 0, 0, 0),
                                    frameSize=(-1, 1, -1, 1),
                                    suppressMouse=1,
                                    state=DGG.NORMAL,
                                    sortOrder=1000)
        self.frame = DirectFrame(frameSize=(1, 1, 1, 1),
                                 image=ok.find('**/alert'),
                                 image_scale=(1, 0, 0.6),
                                 state=DGG.NORMAL,
                                 parent=self.bg_frame)
        self.text = OnscreenText(text=LOCAL_EN[reason],
                                 fg=(1, 1, 1, 1),
                                 pos=(0, 0.15, 0),
                                 align=TextNode.ACenter,
                                 wordwrap=13,
                                 parent=self.frame)
        self.button = DirectButton(geom=(ok.find('**/ok-ready'),
                                         ok.find('**/ok-click'),
                                         ok.find('**/ok-hover'),
                                         ok.find('**/ok-click')),
                                   relief=None,
                                   geom_scale=(0.3, 0, 0.15),
                                   geom_pos=(0, 0, -0.175),
                                   pressEffect=0,
                                   command=self.destroy,
                                   parent=self.frame)

        self.notify.debug(
            f"[__init__] Created Alert with reason {self.reason}")

        loader.unloadModel(ok)

    def __repr__(self):
        return str(self.reason)

    def destroy(self):
        VirtualFileSystem.getGlobalPtr().unmount("mf/alert.mf")
        VirtualFileSystem.getGlobalPtr().unmount("mf/ok_small.mf")
        self.bg_frame.destroy()
        self.frame.destroy()
        self.button.destroy()
        self.text.cleanup()
        self.text.destroy()
        del self.frame
        del self.button
        del self.text
        del self
Пример #10
0
class Core(FSM):
    """knows Menu, Scenario and Loading."""
    def __init__(self):
        FSM.__init__(self, "Core Game Control")
        # We might need to put a loading screen in front of menu if we get some
        # fancy menu screens.
        self.defaultTransitions = {
            "Menu": [
                "Loading",
            ],
            "Loading": [
                "Scenario",
            ],
            "Scenario": ["Menu", "Loading"]
        }
        # Optional, but prevents a warning message.
        # The scenario task chain gives us grouping option.
        # It might get replaced by an own task manager, by chance.
        base.taskMgr.setupTaskChain("scenario", frameBudget=-1)

    def enterLoading(self, scenario):
        # TODO: put this into gui package and add a black background
        self.loading = OnscreenText(text="LOADING",
                                    pos=(0, 0),
                                    scale=0.1,
                                    align=TextNode.ACenter,
                                    fg=(1, 1, 1, 1))
        self.preloader = scenarioPreloader(scenario)
        base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()
        self.preloader.preloadFast()  # depends on the loading screen
        # Other preloader methods would specify a callback that calls
        # self.demand(scenario), but preloadFast() is executed in one frame, so
        # we can safely demand that from here. Interactive loading screens
        # might require special handling.
        self.demand("Scenario", scenario)

    def exitLoading(self):
        self.loading.destroy()
        del self.loading
        del self.preloader

    def enterScenario(self, scenario):
        self.scenario = ScenarioProxy(scenario)
        self.scenario.begin()

    def exitScenario(self):
        self.scenario.destroy()
        del self.scenario

    def enterMenu(self, menu, *args):
        #self.menu = MenuProxy(menu, *args)
        import gui
        self.menu = getattr(gui, menu)()

    def exitMenu(self):
        self.menu.destroy()
Пример #11
0
    def keyboard_action_check(self):
        """Check for actions and update the object accordingly"""
        ### recording ###
        # for start and stop recording you press a then r
        if keyboard.is_pressed('a'):
            keyboard.wait('r')
            self.recording_text = OnscreenText(text='',
                                               pos=(0.0, -0.4),
                                               scale=0.07)
            if self.is_recording:
                self.recording_text.destroy()
                saving_text = OnscreenText(text='saving',
                                           pos=(0.0, -0.4),
                                           scale=0.07)

                # if previous state was recording then we store the data in json tables and reset the variables
                json.dump(
                    self.stored_vals,
                    open(
                        'posture-app/results/' + self.record_id +
                        '/pose3d_data.txt', 'w'))
                json.dump(
                    np.array(self.stored_kinect_data).tolist(),
                    open(
                        'posture-app/results/' + self.record_id +
                        '/kinect_data.txt', 'w'))
                json.dump(
                    self.stored_pifpaf,
                    open(
                        'posture-app/results/' + self.record_id +
                        '/pifpaf_data.txt', 'w'))

                self.stored_vals = {
                    "azure": {
                        "head": [],
                        "back": [],
                        "orient": []
                    },
                    "pose3d": {
                        "head": [],
                        "back": [],
                        "orient": []
                    }
                }
                self.stored_kinect_data = []
                self.stored_pifpaf = []
                self.record_id = str(int(time.time()))
                self.record_count = 0
                saving_text.destroy()
            else:
                self.recording_text = OnscreenText(text='recording',
                                                   pos=(0.0, -0.4),
                                                   scale=0.07)

            self.is_recording = not self.is_recording
Пример #12
0
class ResponseRegister(ServerResponse):
    def execute(self, data):
        try:
            self.status = data.getString()
            print "ResponseRegister - ", self.status

            if (self.status == "Success"):

                print "Created Successfully!"
            elif self.status == "Same Username":
                print "Already have that username"
                #self.l = login2()
                #self.l.throwIncorrectUsername()
                taskMgr.add(self.destroyIncorrectUsername,
                            "destroyIncorrectUsername")
                self.throwIncorrectUsername()
            else:
                print "there was a problem with the server"
                taskMgr.add(self.destroyServerError, "destroyServerError")
                self.throwServerError()

            #self.log('Received [' + str(Constants.RAND_STRING) + '] String Response')

        except:
            self.log('Bad [' + str(self.status) + '] Register Response')
            print_exc()

    def throwIncorrectUsername(self):
        self.incorrectUsername = OnscreenText(
            text="Already have that username",
            pos=(0, -.5),
            scale=0.05,
            fg=Constants.TEXT_ERROR_COLOR,
            mayChange=0)

    def throwServerError(self):
        self.serverError = OnscreenText(text="Unable to Connect to Server",
                                        pos=(0, -.5),
                                        scale=0.05,
                                        fg=Constants.TEXT_ERROR_COLOR,
                                        mayChange=0)

    def destroyIncorrectUsername(self, task):
        if task.time < 5.0:
            return task.cont
        else:
            self.incorrectUsername.destroy()
            return task.done

    def destroyServerError(self, task):
        if task.time < 5.0:
            return task.cont
        else:
            self.serverError.destroy()
            return task.done
Пример #13
0
 def enterWorld(self, scenario=scenarios.TestEnvironment):
     #self.world = OdeWorld()
     #self.world.setGravity(0.0, 0.0, 0.0)
     #world.setGravity(0.0, 0.0, -9.81)
     loading = OnscreenText(text="LOADING", pos=(0,0), scale=0.1,
                            align=TextNode.ACenter, fg=(1,1,1,1))
     base.graphicsEngine.renderFrame()
     base.graphicsEngine.renderFrame()
     self.scenario = scenario()
     loading.destroy()
     self.scenario.start()
Пример #14
0
class EmptyScene(Scene):
	def showScene(self):
		self.text = OnscreenText(text = 'Empty Scene', pos = (0, 0), scale = 0.2)

		return True
	# end showScene
	
	def hideScene(self):
		self.text.destroy()
	
		return True
	# end hideScene
Пример #15
0
class EmptyScene(Scene):
    def showScene(self):
        self.text = OnscreenText(text='Empty Scene', pos=(0, 0), scale=0.2)

        return True

    # end showScene

    def hideScene(self):
        self.text.destroy()

        return True

    # end hideScene
class Core(FSM):
    """knows Menu, Scenario and Loading."""
    def __init__(self):
        FSM.__init__(self, "Core Game Control")
        # We might need to put a loading screen in front of menu if we get some
        # fancy menu screens.
        self.defaultTransitions = {"Menu":["Loading",],
                                   "Loading":["Scenario",],
                                   "Scenario":["Menu", "Loading"]
                                   }
        # Optional, but prevents a warning message.
        # The scenario task chain gives us grouping option.
        # It might get replaced by an own task manager, by chance.
        base.taskMgr.setupTaskChain("scenario", frameBudget=-1)

    def enterLoading(self, scenario):
        # TODO: put this into gui package and add a black background
        self.loading = OnscreenText(text="LOADING", pos=(0,0), scale=0.1,
                               align=TextNode.ACenter, fg=(1,1,1,1))
        self.preloader = scenarioPreloader(scenario)
        base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()
        self.preloader.preloadFast()  # depends on the loading screen
        # Other preloader methods would specify a callback that calls
        # self.demand(scenario), but preloadFast() is executed in one frame, so
        # we can safely demand that from here. Interactive loading screens
        # might require special handling.
        self.demand("Scenario", scenario)

    def exitLoading(self):
        self.loading.destroy()
        del self.loading
        del self.preloader

    def enterScenario(self, scenario):
        self.scenario = ScenarioProxy(scenario)
        self.scenario.begin()

    def exitScenario(self):
        self.scenario.destroy()
        del self.scenario

    def enterMenu(self, menu, *args):
        #self.menu = MenuProxy(menu, *args)
        import gui
        self.menu = getattr(gui, menu)()

    def exitMenu(self):
        self.menu.destroy()
Пример #17
0
class ServerOptionsMenu(Menu):
    
    def __init__(self):
        Menu.__init__(self)
        
        fieldValues = {'Server Name' : Settings.SERVER_NAME,
                       'World Name' : Settings.LAST_WORLD }
        self.fields = {}
        
        y = 0
        for fieldLabel, initText in fieldValues.iteritems():
            self.fields[fieldLabel] = self.CreateField(fieldLabel, initText, y, False)
            y += 1
            
        self.instructions = OnscreenText(text = 'Press Enter to start server', pos = (-0.1, 0.1), scale = 0.09, fg = (1, 1, 1, 1), align = TextNode.ARight, parent = base.a2dBottomRight)
            
        self.Show()
        
        self.acceptOnce('enter', self.OnStart)
            
    def OnStart(self):
        Settings.SERVER_NAME = self.GetValue('Server Name')
        Settings.LAST_WORLD = self.GetValue('World Name')
        ServerStartEvent().Fire()
        self.Destroy()
        
    def CreateField(self, fieldLabel, initText, yIndex, focus):
        label = OnscreenText(text = fieldLabel, pos = (-0.4, 0.35 - yIndex * 0.2), scale = 0.07, fg = (1, 1, 1, 1), align = TextNode.ALeft)
        label.reparentTo(self.node)
        f = DirectEntry(text = '' ,
                        scale = 0.05,
                        initialText = initText, 
                        numLines = 1,
                        rolloverSound = None,
                        clickSound = None,
                        pos = (-0.4, 1, 0.25 - yIndex * 0.2),
                        focus = (not focus))
        f.reparentTo(self.node)
        return f
    
    def GetValue(self, key):
        return self.fields[key].get()
    
    def Destroy(self):
        self.node.removeNode()
        self.instructions.destroy()
Пример #18
0
class ConsoleLog:
    def __init__(self, text, valid, archivable=True, auto_create=True):
        """
        @param text: What did they type in the console?
        @type text: str
        @param valid: Did the command work?
        @type valid: bool
        @param archivable: Should the log be retrievable via arrow keys?
        @type archivable: bool
        @param auto_create: Should the text of the log be auto created?
        @type auto_create: bool
        """
        self.text = text
        self.valid = valid
        self.log = None
        self.archivable = archivable
        if auto_create:
            self.create()

        if not valid and self.log is not None:
            self.log["fg"] = (1, 0, 0, 1)

    def create(self):
        self.log = OnscreenText(text=self.text,
                                fg=(1, 1, 1, 1),
                                pos=(-1.25, -.8),
                                align=TextNode.ALeft)

        if not self.archivable:
            self.log["pos"] = (self.log["pos"][0] + 0.05, self.log["pos"][1])
            self.log["fg"] = (.8, .8, .8, 1)

        if not self.valid:
            self.log["fg"] = (1, 0, 0, 1)

            if not self.archivable:
                self.log["fg"] = (.8, 0, 0, 1)

    def move_up(self):
        """
        Move the OnscreenText up
        """
        self.log.setPos(self.log.getPos()[0], self.log.getPos()[1] + 0.07)

    def destroy(self):
        self.log.destroy()
Пример #19
0
class ResponseLogin(ServerResponse):

    def execute(self, data):

        try:
            self.status = data.getInt()
            #self.username = data.getString()
            print "ResponseLogin - ", self.status
            
            if(self.status == 1):
                print "logged In!"
                c = selectcharandteamtype()
            elif self.status == 0:
                print "incorrect username/password"
                #self.l = login2()
                #self.l.throwIncorrectUsername()
                taskMgr.add(self.destroyIncorrectUsername, "destroyIncorrectUsername")
                self.throwIncorrectUsername()
            else:
                print "there was a problem with the server"
                taskMgr.add(self.destroyServerError, "destroyServerError")
                self.throwServerError()

            #self.log('Received [' + str(Constants.RAND_STRING) + '] String Response')

        except:
            self.log('Bad [' + str(self.status) + '] Login Response')
            print_exc()
    def throwIncorrectUsername(self):
        self.incorrectUsername = OnscreenText(text="Incorrect Username/Password", 
                                    pos=(0, -.5), scale=0.05, fg=Constants.TEXT_ERROR_COLOR, mayChange=0)
    def throwServerError(self):
        self.serverError = OnscreenText(text="Unable to Connect to Server",
                                    pos=(0, -.5), scale=0.05, fg=Constants.TEXT_ERROR_COLOR, mayChange=0)
    def destroyIncorrectUsername(self, task):
        if task.time < 5.0:
            return task.cont
        else:  
            self.incorrectUsername.destroy()
            return task.done
    def destroyServerError(self, task):
        if task.time < 5.0:
            return task.cont
        else:  
            self.serverError.destroy()
            return task.done    
Пример #20
0
class ResponseRegister(ServerResponse):

    def execute(self, data):
        try:
            self.status = data.getInt32()
            print "ResponseRegister - ", self.status
            
            if(self.status == 1):
                
                print "Created Successfully!"
            elif self.status == 0:
                print "Already have that username"
                #self.l = login2()
                #self.l.throwIncorrectUsername()
                taskMgr.add(self.destroyIncorrectUsername, "destroyIncorrectUsername")
                self.throwIncorrectUsername()
            else:
                print "there was a problem with the server"
                taskMgr.add(self.destroyServerError, "destroyServerError")
                self.throwServerError()

            #self.log('Received [' + str(Constants.RAND_STRING) + '] String Response')

        except:
            self.log('Bad [' + str(self.status) + '] Register Response')
            print_exc()
    def throwIncorrectUsername(self):
        self.incorrectUsername = OnscreenText(text="Already have that username", 
                                pos=(0, -.5), scale=0.05, fg=Constants.TEXT_ERROR_COLOR, mayChange=0)
    def throwServerError(self):
        self.serverError = OnscreenText(text="Unable to Connect to Server",
                                pos=(0, -.5), scale=0.05, fg=Constants.TEXT_ERROR_COLOR, mayChange=0)
    def destroyIncorrectUsername(self, task):
        if task.time < 5.0:
            return task.cont
        else:  
            self.incorrectUsername.destroy()
            return task.done
    def destroyServerError(self, task):
        if task.time < 5.0:
            return task.cont
        else:  
            self.serverError.destroy()
            return task.done    
Пример #21
0
class mainMenu:
    def __init__(self, mainMenuState, cameraActive):
        # Just try and destroy a menu if it already exists
        try:
            self.hideMainMenu()
        except:
            # If nothing exists we create the main menu
            self.bk_text = "Welcome to SHENKO"
            self.textObject = OnscreenText(text=self.bk_text,
                                           pos=(0.95, -0.95),
                                           scale=0.05,
                                           fg=(0, 1, 1, 1),
                                           bg=(0, 0, 0, .5),
                                           align=TextNode.ACenter,
                                           mayChange=1)
            #  Draw the Shenko LOGO
            self.imageObject = OnscreenImage(image='logo.png',
                                             pos=(0, 0, .6),
                                             scale=0.5)
            self.imageObject.setImage('logo.png')

            # Menu buttons
            rollSound = base.loader.loadSfx("click.ogg")
            self.startbttn = DirectButton(text=("start", "---> start <---",
                                                "--> start <--", "disabled"),
                                          pos=(0, 0, .2),
                                          scale=.07,
                                          rolloverSound=rollSound,
                                          command=self.start)
            self.mainMenuState = False
            print('derp', self.mainMenuState)

    def hideMainMenu(self):
        print("#---#### ####---#")
        #DirectButton.destroy()
        self.textObject.destroy()  # This is the text lower right of screen
        self.imageObject.destroy()  # This is the Logo
        self.startbttn['state'] = DGG.DISABLED
        self.startbttn.destroy()

    def start(self):
        print("LOADING CENTRAL --------------------------_> ...")
        self.hideMainMenu()
Пример #22
0
class HUD(Thing):
    def __init__(self):
        super(HUD, self).__init__("empty")

        #initialize hud
        self.textStackSize = OnscreenText(text = u"0/\u221e", pos = (-1.2, 0.9), scale = 0.07)
        self.stackDepth = 0

    def save(self):
        self.textStackSize.destroy()
        self.stackDepth += 1
        self.textStackSize = OnscreenText(text = str(self.stackDepth) + u"/\u221e", pos = (-1.2, 0.9), scale = 0.07)

    def revert(self):
        if self.stackDepth == 0:
            return

        self.textStackSize.destroy()
        self.stackDepth += -1
        self.textStackSize = OnscreenText(text = str(self.stackDepth) + u"/\u221e", pos = (-1.2, 0.9), scale = 0.07)
Пример #23
0
class CarNetworkGui(CarGui):
    def __init__(self, mediator, car_props, players):
        self.car_props = car_props
        CarGui.__init__(self, mediator)
        for player in players:
            if player.car == car_props.name:
                name = player.name
                break
        sprops = self.car_props.race_props.season_props
        menu_props = sprops.gameprops.menu_props
        pars = {
            'scale': .04,
            'fg': menu_props.text_normal_col,
            'font': self.eng.font_mgr.load_font(sprops.font)
        }
        if '@' in name: name = name[:name.index('@')]
        self.name_txt = OnscreenText(name, **pars)
        self.eng.attach_obs(self.on_frame)

    @staticmethod
    def __2d_pos(node):
        p3d = base.cam.get_relative_point(node.node, Point3(0, 0, 0))
        p2d = Point2()
        return p2d if base.camLens.project(p3d, p2d) else None

    def on_frame(self):
        pos = self.__2d_pos(self.mediator.gfx.nodepath)
        if pos:
            self.name_txt.show()
            self.name_txt.set_pos((pos[0], 1, pos[1] + .16))
        else:
            self.name_txt.hide()

    def hide(self):
        CarGui.hide(self)
        self.name_txt.hide()

    def destroy(self):
        self.name_txt.destroy()
        self.eng.detach_obs(self.on_frame)
        CarGui.destroy(self)
Пример #24
0
class OptionsScreen:
    def __init__(self, options):
        self.bg = OnscreenImage(image='./image/bg.png', pos = (0.0, -1.0, 0.0), parent=render2d)
        self.bg.setTransparency(TransparencyAttrib.MAlpha)
        
        self.title = OnscreenText(text = 'Options', pos = (0.0, 0.7), scale = 0.3, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))

        self.option_title_txt = OnscreenText(text='Controller', scale=0.2, pos=(-1.0, 0.0), font=babelfish_font, align=TextNode.ALeft, fg=(1,1,1,1))
        
        self.option_value = options.get('game-opts', 'controller')
        self.option_value_txt = OnscreenText(text=self.option_value, scale=0.2, pos=(.7, 0.0), font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))
    
        self.options = options
        self.curr_controller = 0
        
        self.controllers = ['Keyboard','Joypad', 'Mouse']
        
        #define o controle atual baseado no arquivo salvo
        for f in self.controllers:
            if f == self.option_value:
                break
            else:
                self.curr_controller += 1
        
    def option_changed(self, command):
        self.toggle_value(command)
    
    def toggle_value(self, opt):
        if opt == 'nav-right':
            self.curr_controller += 1
        elif opt == 'nav-left':
            self.curr_controller -= 1
        if (self.curr_controller >= len(self.controllers)):
            self.curr_controller = 0
        elif (self.curr_controller < 0):
            self.curr_controller = len(self.controllers) - 1
            
        self.option_value = self.controllers[self.curr_controller]
        self.option_value_txt.destroy()
        self.option_value_txt = OnscreenText(text=self.option_value, scale=0.2, pos=(.7, 0.0), font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))
    
    def clear(self):
        self.bg.destroy()
        self.title.destroy()
        
        self.option_title_txt.destroy()
        self.option_value_txt.destroy()

        self.options.set('game-opts', 'controller', self.option_value)
Пример #25
0
class OptionLabel(GuiElement):
    '''
    one option label in options menu
    size is the size of the text and the controlNP is normally outside the box
    (for a better align)
    '''
    #TODO: inherit this from a 'MenuElement' liked class?
    def __init__(self, configForm, text , controlNP = None, controlOffset = 0.35 , size = (0.4,0.15)):
        
        GuiElement.__init__(self, size = size)
        
        self.text = text
        self.controlNP = controlNP
        self._controlOffset = controlOffset
        
        #TODO: textNP as a button-like, commonly use in menus
        self.textNP = OnscreenText(font = color_themes.default_font, text = text, scale = 0.07, fg = (1,1,1,1) )
        
        self.textParentNP = NodePath('tpnp')
        self.textParentNP.reparentTo(self)
        self.textNP.reparentTo(self.textParentNP)
        self.controlParentNP = NodePath('cpnp')
        self.controlParentNP.setPos(self._controlOffset,0,0)
        self.controlParentNP.reparentTo(self)
        self.controlNP.reparentTo(self.controlParentNP)
        
    def destroy(self):
        if self.textNP:
            self.textNP.destroy()
        if self.controlNP:
            self.controlNP.destroy()
        self.textNP = None
        self.controlNP = None
        self.textParentNP = None
        self.controlParentNP = None
        GuiElement.destroy(self) 

        
Пример #26
0
class Client(DirectObject):
    def __init__(self):
        DirectObject.__init__(self)
        
        #No player yet
        self.player = None
        self.stars = []
        
        tcpPort = base.config.GetInt('server-port', 4400)
        hostname = base.config.GetString('server-host', '192.168.137.1')
        self.url = URLSpec('http://%s:%s' % (hostname, tcpPort))
        
        self.cr = MyClientRepository()
        self.cr.connect([self.url], successCallback = self.connectSuccess, failureCallback = self.connectFailure)
        self.waitingText = OnscreenText(
            'Connecting to %s.\n.' % (self.url),
            scale = 0.1, fg = (1, 1, 1, 1), shadow = (0, 0, 0, 1))
    
    def connectFailure(self, statusCode, statusString):
        self.waitingText.destroy()
        self.failureText = OnscreenText(
            'Failed to connect to %s: %s.' % (self.url, statusString),
            scale = 0.15, fg = (1, 0, 0, 1), shadow = (0, 0, 0, 1))
        
    def connectSuccess(self):
        """ Successfully connected.  But we still can't really do
        anything until we've got the doID range. """
        self.waitingText.destroy()
        self.waitingText = OnscreenText('Waiting for server.',scale = 0.1, fg = (1, 1, 1, 1), shadow = (0, 0, 0, 1))
        self.acceptOnce('createReady', self.createReady)
        
    def createReady(self):
        """ Now we're ready to go! """
        self.waitingText.destroy()
        
        # Manifest an avatar for ourselves.
        #self.av = self.cr.createDistributedObject(className = 'DistributedPlayer')

        # Update the local avatar's position every frame.
        #self.moveTask = taskMgr.add(self.moveAvatar, 'moveAvatar')

        # Send position updates only several times a second, instead
        # of every frame, or we will flood the network.
        #self.lastBroadcastTransform = self.av.getTransform()
        #self.updateTask = taskMgr.doMethodLater(0.2, self.updateAvatar, 'updateAvatar')
        
    def addStars(self, positions):
        for position in positions:
            star = DistributedStar(self.cr)
            star.setInitialPos(position)
            self.cr.createDistributedObject(distObj = star)
            self.stars.append(star)
            
    def clearStars(self):
        for p in self.stars:
            self.cr.sendDeleteMsg(p.doId)
Пример #27
0
class CarMultiPlayerPanel(CarPanel):
    def enter_waiting(self):
        CarPanel.enter_waiting(self)
        if self.ncars == 1: parent = base.aspect2d
        elif self.ncars == 2:
            if self.player_idx == 0: parent = base.a2dCenterQuarter
            else: parent = base.a2dCenterThirdQuarter
        elif self.ncars == 3:
            if self.player_idx == 0: parent = base.a2dQuarterCenter
            elif self.player_idx == 1: parent = base.a2dThirdQuarterQuarter
            else: parent = base.a2dThirdQuarterThirdQuarter
        elif self.ncars == 4:
            if self.player_idx == 0: parent = base.a2dQuarterQuarter
            elif self.player_idx == 1: parent = base.a2dQuarterThirdQuarter
            elif self.player_idx == 2: parent = base.a2dThirdQuarterQuarter
            else: parent = base.a2dThirdQuarterThirdQuarter
        menu_props = \
            self.car_props.race_props.season_props.gameprops.menu_props
        pars = {
            'scale':
            .065,
            'parent':
            parent,
            'fg':
            menu_props.text_normal_col,
            'font':
            self.eng.font_mgr.load_font(
                self.car_props.race_props.season_props.font)
        }
        self.wait_lab = OnscreenText(_('waiting for the other players'),
                                     pos=(0, 0),
                                     **pars)

    def exit_waiting(self):
        CarPanel.exit_waiting(self)
        self.wait_lab.destroy()
Пример #28
0
class cApplication( DirectObject ):
    def __init__( self ):
        # create world
        self.world = cWorld( )
        # setup controls
        self.setupControls( )
        # display title information
        self.title = OnscreenText( text = 'BOIDS.PY - SEEK & ARRIVE', fg = ( 1.0, 1.0, 1.0, 1.0), pos = ( -.98, .9 ), scale = 0.06 )
        # display copright information
        self.copyRight = OnscreenText( text = 'Copyright (C) 2016 David Lettier.', fg = ( 1.0, 1.0, 1.0, 1.0), pos = ( .98, -.98 ), scale = 0.05 )
        # display panda version text
        self.pandaVersion = OnscreenText( text = 'Panda Version 1.9.2', fg = ( 1.0, 1.0, 1.0, 1.0), pos = ( -1.18, -.98 ), scale = 0.04 )
        # display print debug button
        # this button calls the prntDebug function
        self.prntDebugButton = DirectButton( text = "Print Debug", relief = DGG.RAISED, scale = .1, pad = ( .5, .5 ), pos = Vec3( -1.0, 0.0, -.8 ), command = self.prntDebug )
    def setupControls( self ):
        # accept the esc key to exit application
        self.accept( 'escape', sys.exit )
    def prntDebug( self ):
        # destory debug button
        self.prntDebugButton.destroy( )
        # create new clear debug button
        # this button calls the clearDebug function
        self.clearDebugButton = DirectButton( text = "Clear Debug", relief = DGG.RAISED, scale = .1, pad = ( .5, .5 ), pos = Vec3( -1.0, 0.0, -.8 ), command = self.clearDebug )
        # create green target position text
        self.greenPos = OnscreenText( text = 'Green Target Pos: ' + str( int( self.world.target.getX( ) ) ) + ", " + str( int( self.world.target.getY( ) ) ) + ", " + str( int( self.world.target.getZ( ) ) ), fg = ( 1.0, 1.0, 1.0, 1.0), pos = ( -.8, .8 ), scale = 0.05, mayChange = True )
        # create blue boid position text
        self.bluePos = OnscreenText( text = 'Blue Boid (Arrive) Pos: ' + str( int( self.world.blueBoid.boidModel.getX( ) ) ) + ", " + str( int( self.world.blueBoid.boidModel.getY( ) ) ) + ", " + str( int( self.world.blueBoid.boidModel.getZ( ) ) ), fg = ( 1.0, 1.0, 1.0, 1.0), pos = ( -.8, .7 ), scale = 0.05, mayChange = True )
        # create green boid position text
        self.redPos = OnscreenText( text = 'Red Boid (Seek) Pos: ' + str( int( self.world.redBoid.boidModel.getX( ) ) ) + ", " + str( int( self.world.redBoid.boidModel.getY( ) ) ) + ", " + str( int( self.world.redBoid.boidModel.getZ( ) ) ), fg = ( 1.0, 1.0, 1.0, 1.0), pos = ( -.8, .6 ), scale = 0.05, mayChange = True )
        # add the update on screen text task
        taskMgr.add( self.updateOSTxt, 'updateOSTxt' )
    def updateOSTxt( self, Task ):
        # update green target position text
        self.greenPos.setText( 'Green Target Pos: ' + str( int( self.world.target.getX( ) ) ) + ", " + str( int( self.world.target.getY( ) ) ) + ", " + str( int( self.world.target.getZ( ) ) ) )
        # update blue boid position text
        self.bluePos.setText( 'Blue Boid (Arrive) Pos: ' + str( int( self.world.blueBoid.boidModel.getX( ) ) ) + ", " + str( int( self.world.blueBoid.boidModel.getY( ) ) ) + ", " + str( int( self.world.blueBoid.boidModel.getZ( ) ) ) )
        # update red boid position text
        self.redPos.setText( 'Red Boid (Seek) Pos: ' + str( int( self.world.redBoid.boidModel.getX( ) ) ) + ", " + str( int( self.world.redBoid.boidModel.getY( ) ) ) + ", " + str( int( self.world.redBoid.boidModel.getZ( ) ) ) )
        # call task next frame
        return Task.cont
    def clearDebug( self ):
        # destory button
        self.clearDebugButton.destroy( )
        # destory all debug on screen text
        self.greenPos.destroy( )
        self.bluePos.destroy( )
        self.redPos.destroy( )
        # remove task
        taskMgr.remove( 'updateOSTxt' )
        # create again the print debug button to start the cycle all over again
        self.prntDebugButton = DirectButton( text = "Print Debug", relief = DGG.RAISED, scale = .1, pad = ( .5, .5 ), pos = Vec3( -1.0, 0.0, -.8 ), command = self.prntDebug )
Пример #29
0
class DeveloperConsole(InteractiveInterpreter, DirectObject):
  """The name says it all."""
  def __init__(self):
    sys.stdout = PseudoFile(self.writeOut)
    sys.stderr = PseudoFile(self.writeErr)
    tpErr = TextProperties()
    tpErr.setTextColor(1, 0.5, 0.5, 1)
    TextPropertiesManager.getGlobalPtr().setProperties("err", tpErr)
    #font = loader.loadFont("cmss12")
    self.frame = DirectFrame(parent = base.a2dTopCenter, text_align = TextNode.ALeft, text_pos = (-base.getAspectRatio() + TEXT_MARGIN[0], TEXT_MARGIN[1]), text_scale = 0.05, text_fg = (1, 1, 1, 1), frameSize = (-2.0, 2.0, -0.5, 0.0), frameColor = (0, 0, 0, 0.5), text = '')#, text_font = font)
    self.entry = DirectEntry(parent = base.a2dTopLeft, command = self.command, scale = 0.05, width = 1000.0, pos = (-0.02, 0, -0.48), relief = None, text_pos = (1.5, 0, 0), text_fg = (1, 1, 0.5, 1), rolloverSound = None, clickSound = None)#, text_font = font)
    self.otext = OnscreenText(parent = self.entry, scale = 1, align = TextNode.ALeft, pos = (1, 0, 0), fg = (1, 1, 0.5, 1), text = ':')#, font = font)
    self.lines = [''] * 9
    self.commands = []  # All previously sent commands
    self.cscroll = None # Index of currently navigated command, None if current
    self.command = ''   # Currently entered command
    self.block = ''     # Temporarily stores a block of commands
    self.hide()
    self.initialized = False
  
  def prevCommand(self):
    if self.hidden: return
    if len(self.commands) == 0: return
    if self.cscroll == None:
      self.cscroll = len(self.commands)
      self.command = self.entry.get()
    elif self.cscroll <= 0:
      return
    else:
      self.commands[self.cscroll] = self.entry.get()
    self.cscroll -= 1
    self.entry.set(self.commands[self.cscroll])
    self.entry.setCursorPosition(len(self.commands[self.cscroll]))
  
  def nextCommand(self):
    if self.hidden: return
    if len(self.commands) == 0: return
    if self.cscroll == None: return
    self.commands[self.cscroll] = self.entry.get()
    self.cscroll += 1
    if self.cscroll >= len(self.commands):
      self.cscroll = None
      self.entry.set(self.command)
      self.entry.setCursorPosition(len(self.command))
    else:
      self.entry.set(self.commands[self.cscroll])
      self.entry.setCursorPosition(len(self.commands[self.cscroll]))

  def writeOut(self, line, copy = True):
    if copy: sys.__stdout__.write(line)
    lines = line.split('\n')
    firstline = lines.pop(0)
    self.lines[-1] += firstline
    self.lines += lines
    self.frame['text'] = '\n'.join(self.lines[-9:])

  def writeErr(self, line, copy = True):
    if copy: sys.__stderr__.write(line)
    line = '\1err\1%s\2' % line
    lines = line.split('\n')
    firstline = lines.pop(0)
    self.lines[-1] += firstline
    self.lines += lines
    self.frame['text'] = '\n'.join(self.lines[-9:])

  def command(self, text):
    if not self.hidden:
      self.cscroll = None
      self.command = ''
      self.entry.set('')
      self.entry['focus'] = True
      self.writeOut(self.otext['text'] + ' ' + text + '\n', False)
      if text != '' and (len(self.commands) == 0 or self.commands[-1] != text):
        self.commands.append(text)
      
      # Insert plugins into the local namespace
      locals = __main__.__dict__
      #locals['manager'] = self.manager
      #for plugin in self.manager.named.keys():
      #  locals[plugin] = self.manager.named[plugin]
      locals['panda3d'] = panda3d
      
      # Run it and print the output.
      if not self.initialized:
        InteractiveInterpreter.__init__(self, locals = locals)
        self.initialized = True
      try:
        if self.runsource(self.block + '\n' + text) and text != '':
          self.otext['text'] = '.'
          self.block += '\n' + text
        else:
          self.otext['text'] = ':'
          self.block = ''      
      except Exception: # Not just "except", it will also catch SystemExit
        # Whoops! Print out a traceback.
        self.writeErr(traceback.format_exc())

  def toggle(self):
    if self.hidden:
      self.show()
    else:
      self.hide()

  def show(self):
    self.accept('arrow_up', self.prevCommand)
    self.accept('arrow_up-repeat', self.prevCommand)
    self.accept('arrow_down', self.nextCommand)
    self.accept('arrow_down-repeat', self.nextCommand)
    self.hidden = False
    self.entry['focus'] = True
    self.frame.show()
    self.entry.show()
    self.otext.show()

  def hide(self):
    self.ignoreAll()
    self.hidden = True
    self.entry['focus'] = False
    self.frame.hide()
    self.entry.hide()
    self.otext.hide()

  def destroy(self):
    sys.stdout = sys.__stdout__
    sys.stderr = sys.__stderr__
    self.ignoreAll()
    self.frame.destroy()
    self.entry.destroy()
    self.otext.destroy()
Пример #30
0
class World(DirectObject):
    #class World, extends DirectObject, builds the world to play the game

###################### INITIALIZATIONS #########################################
    def __init__(self):

        mySplashScreen = SplashScreen()
        mySplashScreen.loading()
        mySplashScreen.introduction()
        self.promptMode()

        self.turnWallNotification()

        ##### Creating Scene #####
        self.createBackground()
        self.loadWallModel()
        self.loadBallModel()
        self.setCamera()
        self.createLighting()

        ##### Create Controls #####
        self.createKeyControls()
        self.keyMap = {"left":0, "right":0, "forward":0, "backward":0, "drop":0}

        ##### Task Manager #####
        timer = 0.2
        taskMgr.doMethodLater(timer, self.traverseTask, "tsk_traverse")
            #scans for collisions every 0.2 seconds
        taskMgr.add(self.move,"moveTask")
            #constant smooth movement

        ##### Collisions #####
        self.createBallColliderModel()
        self.disableForwardMovement = False
        self.disableBackwardMovement = False
        self.disableLeftMovement = False
        self.disableRightMovement = False

        ##### Game state variables #####
        self.isMoving = False
        self.isDropping = False 
        self.camAngle = math.pi/2
        self.direction = "W" #constant; does not change with relativity
        self.drop = False

        self.levelHeight = 2.1
        self.level = 0
        self.maxLevel = 6
        self.currentHeight = 13.302
        self.cameraHeight = 0.2
        self.mode = None
        self.timer = ""

        ##### Views #####
        self.xray_mode = False
        self.collision_mode = False
        self.wireframe = False

        ##### On-Screen Text #####
        self.title = addTitle("aMAZEing")
        self.instructions = OnscreenText(text="[ i ]: Toggle Instructions", 
                style=1, fg=(0, 0, 0, 1), pos=(1.3, 0.95), 
                align=TextNode.ARight, scale=0.05)
        self.instr = []
        self.messages = []
        self.levelText = OnscreenText(text= "Level = " + str(self.level), 
                style=1, fg=(0, 0, 0, 1), pos=(-1.3, -0.95), 
                align=TextNode.ALeft, scale=0.07)
        self.directionText = OnscreenText(text="Direction = " + self.direction,
                style=1, fg=(0, 0, 0, 1), pos=(-1.3, -0.85),
                align=TextNode.ALeft, scale=0.07)

        self.timerText = OnscreenText(text= self.timer, 
                style=1, fg=(1, 1, 1, 1), pos=(1.3, 0.85), 
                align=TextNode.ARight, scale=0.07)
    
    def setKey(self, key, value):
        #records the state of the arrow keys
        self.keyMap[key] = value

    ###################### Onscreen Text #######################################

    def postInstructions(self):
        #posts the instructions onto the screen

        inst1 = addInstructions(0.95, "[ESC]: Quit")
        self.instr.append(inst1)
        inst2 = addInstructions(0.90,  "[Left Arrow]: Turn Left")
        self.instr.append(inst2)
                               
        inst3 = addInstructions(0.85, "[Right Arrow]: Turn Right")
        self.instr.append(inst3)
                                
        inst4 = addInstructions(0.80, "[Up Arrow]: Move Ball Forward")
        self.instr.append(inst4)
                                
        inst5 = addInstructions(0.75,  "[Down Arrow]: Move Ball Backwards")
        self.instr.append(inst5)
                               
        inst6 = addInstructions(0.70,
                            "[Space]: Drop Levels (if level drop is availale)")
        self.instr.append(inst6)
                               
        inst7 = addInstructions(0.60,  "[x]: Toggle XRay Mode")
        self.instr.append(inst7)
                               
        inst8 = addInstructions(0.55, "[c]: Toggle Collision Mode")
        self.instr.append(inst8)
                                
        inst9 = addInstructions(0.50, "[z]: Toggle Wireframe")
        self.instr.append(inst9)

        inst10 = OnscreenText(text='''Hello!
        Welcome to aMAZEing!
        You are this sphere,
        and your goal is to find the exit of the maze! Each level
        of the maze has a hole you can drop through, to move on to the
        next level. This maze has six levels and each maze is a 12x12.
        If you chose timer mode, you have 5 minutes to finish the maze,
        or else you lose.
        Good luck! You're aMAZEing :)''', style = 1, 
                fg=(0, 0, 0, 1), pos=(0, -.1), align=TextNode.ACenter, scale=0.07)
        self.instr.append(inst10)

    def deleteInstructions(self):
        #deletes onscreen instructions
        for instr in self.instr:
            instr.destroy()

    def addNotification(self, txt):
        #adds a notification to the screen
        y = 0.9
        tex = OnscreenText(text=txt, style=1, fg= (0, 0, 0, 1), pos=(0, y))
        self.messages.append(tex)

    def deleteNotifications(self):
        #deletes all on-screen notifications
        for msg in self.messages:
            msg.destroy()

    def updateLevelText(self):
        #updates the level text
        self.levelText.destroy()

        levelTextPos = (-1.3, -0.95)
        levelScale = 0.07

        self.levelText = OnscreenText(text= "Level = " + str(self.level), 
                style=1, fg=(0, 0, 0, 1), pos=levelTextPos, 
                align=TextNode.ALeft, scale=levelScale)

    def updateDirectionText(self):
        #updates the direction text on the screen
        self.directionText.destroy()

        directionTextPos = (-1.3, -0.85)
        directionScale = 0.07

        self.directionText = OnscreenText(text="Direction = " + self.direction,
                style=1, fg=(0, 0, 0, 1), pos=directionTextPos,
                align=TextNode.ALeft, scale=directionScale)

    def updateTimerText(self):
        #updates timer on screen
        self.timerText.destroy()

        timerTextPos = (1.3, 0.85)
        timerScale = 0.07

        if self.mode == "timer":
            self.timerText = OnscreenText(text= self.timer, 
                style=1, fg=(1, 1, 1, 1), pos=timerTextPos, 
                align=TextNode.ARight, scale=timerScale)

    def turnWallNotification(self):
        #give a notification sequence at the beginning
        notificationSeq = Sequence()
        notificationSeq.append(Func(addNotification,"""
        If you just see a blank color,
        it means you are facing a wall :)"""))
        notificationSeq.append(Wait(8))
        notificationSeq.append(Func(deleteNotifications))
        notificationSeq.start()

    def promptMode(self):
        #prompts for the mode
        modeScreen = SplashScreen()
        modeScreen.mode()

    def setMode(self, mode):
        #sets the mode of the game
        self.mode = mode
        
        if self.mode == "timer":
            self.setTimer()

    ###################### Initialization Helper Functions #####################

    def createBackground(self):
        #black feautureless space
        base.win.setClearColor(Vec4(0,0,0,1))

    def loadWallModel(self):
        #loads the wall model (the maze) 
        wallScale = 0.3
        wallModelName = self.randomWallModel()
            #randomly select a maze

        self.wallModel = loader.loadModel(wallModelName)
        self.wallModel.setScale(wallScale)
        self.wallModel.setPos(0, 0, 0)
        self.wallModel.setCollideMask(BitMask32.allOff())
        self.wallModel.reparentTo(render)

        ### Setting Texture ###
        texScale = 0.08
        self.wallModel.setTexGen(TextureStage.getDefault(),
                                   TexGenAttrib.MWorldNormal)
        self.wallModel.setTexProjector(TextureStage.getDefault(),
                                         render, self.wallModel)
        self.wallModel.setTexScale(TextureStage.getDefault(), texScale)
        tex = loader.load3DTexture('/Users/jianwei/Documents/School/Freshman/Semester1/15-112/TERMPROJECT/Project/wallTex/wallTex_#.png')
        self.wallModel.setTexture(tex)

        #creating visual geometry collision
        self.wallModel.setCollideMask(BitMask32.bit(0))

    def randomWallModel(self):
        #generates a random wall in the library of mazes that were 
        #randomly generated by the Blender script "mazeGenerator"
        #and exported to this computer
        numMazes = 10

        name = str(random.randint(0, numMazes))
            #randomly selects a number saved in the computer

        path = "/Users/jianwei/Documents/School/Freshman/Semester1/15-112/TERMPROJECT/Project/mazeModels/maze"

        path += name 

        return path
        
    def loadBallModel(self):
        #loads the character, a ball model

        #ballModelStartPos = (-8, -8, 0.701) #THIS IS THE END
        ballModelStartPos = (8, 8, 13.301) #level 0 
        ballScale = 0.01
        self.ballModel = loader.loadModel("/Users/jianwei/Documents/School/Freshman/Semester1/15-112/TERMPROJECT/Project/ball")
        self.ballModel.reparentTo(render)
        self.ballModel.setScale(ballScale)
        self.ballModel.setPos(ballModelStartPos)


        ### Setting ball texture ###
        texScale = 0.08
        self.ballModel.setTexGen(TextureStage.getDefault(),
                                   TexGenAttrib.MWorldPosition)
        self.ballModel.setTexProjector(TextureStage.getDefault(), 
                                         render, self.ballModel)
        self.ballModel.setTexScale(TextureStage.getDefault(), texScale)
        tex = loader.load3DTexture('/Users/jianwei/Documents/School/Freshman/Semester1/15-112/TERMPROJECT/Project/ballTex/ballTex_#.png')
        self.ballModel.setTexture(tex)

    def setCamera(self):
        #sets up the initial camera location
        #camera will follow the sphere 
        followLength = 2
        camHeight = 0.2

        base.disableMouse()
        base.camera.setPos(self.ballModel.getX(),
                                self.ballModel.getY() - followLength,
                                self.ballModel.getZ() + camHeight)
        base.camLens.setNear(0.4)

        #creates a floater object - will look at the floater object 
        #above the sphere, so you can get a better view
        self.floater = NodePath(PandaNode("floater"))
        self.floater.reparentTo(render)

    def createKeyControls(self):
        #creates the controllers for the keys
        #event handler
        #describes what each key does when pressed and unpressed

        self.accept("escape", sys.exit)

        self.accept("arrow_left", self.turnLeft)
        self.accept("arrow_right", self.turnRight)
        self.accept("arrow_up", self.setKey, ["forward",1])
        self.accept("arrow_down", self.setKey, ["backward",1])
        self.accept("space", self.nowDropping)

        #unpressed event handlers
        self.accept("arrow_left-up", self.setKey, ["left",0])
        self.accept("arrow_right-up", self.setKey, ["right",0])
        self.accept("arrow_up-up", self.setKey, ["forward",0])
        self.accept("arrow_down-up", self.setKey, ["backward",0])
        self.accept("space_up", self.setKey, ["drop", 0])

        #views
        self.accept('x', self.toggle_xray_mode)
        self.accept('c', self.toggle_collision_mode)
        self.accept('z', self.toggle_wireframe)

        #information
        self.accept('i', self.postInstructions)
        self.accept('i-up', self.deleteInstructions)

        #restart
        self.accept('r', self.restart)

        #modes
        self.accept("t", self.setMode, ["timer"])
        self.accept("m", self.setMode, ["marathon"])

    def createBallColliderModel(self):
        #creates the collider sphere around the ball
        cSphereRad = 9.9
        self.cTrav = CollisionTraverser() #moves over all possible collisions

        self.ballModelSphere = CollisionSphere(0, 0, 0, cSphereRad)
            #collision mesh around ball is a simple sphere
        self.ballModelCol = CollisionNode('ballModelSphere')
        self.ballModelCol.addSolid(self.ballModelSphere)
        self.ballModelCol.setFromCollideMask(BitMask32.bit(0))
        self.ballModelCol.setIntoCollideMask(BitMask32.allOff())
        self.ballModelColNp = self.ballModel.attachNewNode(self.ballModelCol)
        self.ballModelGroundHandler = CollisionHandlerQueue()
            #collision handler queue stores all collision points
        self.cTrav.addCollider(self.ballModelColNp, self.ballModelGroundHandler)

    def createLighting(self):
        #creates lighting for the scene
        aLightVal = 0.3
        dLightVal1 = -5
        dLightVal2 = 5

        #set up the ambient light
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor(Vec4(aLightVal, aLightVal, aLightVal, 1))
        ambientLight1 = AmbientLight("ambientLight1")
        ambientLight1.setColor(Vec4(aLightVal, aLightVal, aLightVal, 1))
        ambientLight2 = AmbientLight("ambientLight2")
        ambientLight2.setColor(Vec4(aLightVal, aLightVal, aLightVal, 1))

        #sets a directional light
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(Vec3(dLightVal1, dLightVal1, dLightVal1))
        directionalLight.setColor(Vec4(1, 1, 1, 1))
        directionalLight.setSpecularColor(Vec4(0, 0, 0, 1))

        #sets a directional light
        directionalLight1 = DirectionalLight("directionalLight2")
        directionalLight1.setDirection(Vec3(dLightVal2, dLightVal1, dLightVal1))
        directionalLight1.setColor(Vec4(1, 1, 1, 1))
        directionalLight1.setSpecularColor(Vec4(1, 1, 1, 1))


        #attaches lights to scene
        render.setLight(render.attachNewNode(ambientLight))
        render.setLight(render.attachNewNode(ambientLight1))
        render.setLight(render.attachNewNode(ambientLight1))
        render.setLight(render.attachNewNode(directionalLight))
        render.setLight(render.attachNewNode(directionalLight1))

###################### COLLISION DETECTION #####################################

    def traverseTask(self, task=None):
        # handles collisions with collision handers and a 
        # collision queue
        # essentially checks region of potential collision for collisions
        # and stops the ball if a collision is triggered
        # called by task manager
        self.ballModelGroundHandler.sortEntries()
        for i in range(self.ballModelGroundHandler.getNumEntries()):
            entry = self.ballModelGroundHandler.getEntry(i)

            if self.drop == True:
                #we cant drop in this situation
                self.ballModel.setZ(self.currentHeight)

                dropFailWait = 4
                dropFailSeq = Sequence()
                dropFailSeq.append(Func(addNotification,"Whoops! You can't drop here!"))
                dropFailSeq.append(Wait(dropFailWait))
                dropFailSeq.append(Func(deleteNotifications))
                dropFailSeq.start()

                self.drop = False

            elif self.direction == "N":
                self.northDisableMovements()

            elif self.direction == "S":
                self.southDisableMovements()

            elif self.direction == "E":
                self.eastDisableMovements()

            elif self.direction == "W":
                self.westDisableMovements()

            if task: return task.cont #exit task

        # If there are no collisions
        
        if task: return task.cont

    def northDisableMovements(self):
        #disables movements when direction is north
        if self.keyMap["forward"] != 0: #if the ball was moving foward
            self.disableForwardMovement = True #disable forward movement
        if self.keyMap["backward"] != 0:
            self.disableBackwardMovement = True

    def southDisableMovements(self):
        #disables movements when direction is south
        if self.keyMap["forward"] != 0: 
            self.disableBackwardMovement = True 
        if self.keyMap["backward"] != 0:
            self.disableForwardMovement = True

    def eastDisableMovements(self):
        #disables movements when direction is east
        if self.keyMap["forward"] != 0: 
            self.disableRightMovement = True 
        if self.keyMap["backward"] != 0:
            self.disableLeftMovement = True

    def westDisableMovements(self):
        #disables movements when direction is west
        if self.keyMap["forward"] != 0: 
            self.disableLeftMovement = True 
        if self.keyMap["backward"] != 0:
            self.disableRightMovement = True

    def checkCollisions(self):
        #checks for collisions
        self.cTrav.traverse(render)

    def enableAllWalls(self):
        #enables all walls by disabling all the disable wall functions
        self.disableLeftMovement = False
        self.disableRightMovement = False 
        self.disableForwardMovement = False
        self.disableBackwardMovement = False

    def inCollision(self):
        #return true if we are in a collision right now, false otherwise
        if (self.disableForwardMovement == True
            or self.disableBackwardMovement == True 
            or self.disableRightMovement == True 
            or self.disableLeftMovement):
            return True
        return False

    def checkForWin(self):
        #checks for a win, toggles win splash sceen if we win
        yLoc = self.ballModel.getY()
        exitBound = -9.1

        if yLoc < exitBound: 
            winScreen = SplashScreen()
            winScreen.win()

        if self.mode == "timer":
            self.checkForTimerLoss()

    def checkForTimerLoss(self):
        #checks to see the time, will lose if past 5 minutes
        
        if self.timer == "0:05:00":
            loseScreen = SplashScreen()
            loseScreen.lose()

###################### MOVEMENTS ###############################################

    def move(self, task):
        # Accepts arrow keys to move the player front and back
        # Also deals with grid checking and collision detection

        step = 0.03

        #movement animation
        self.movementAnimation(step)
        #rotation animation
        self.rotationAnimation()

        base.camera.setX(self.ballModel.getX() + math.sin(self.camAngle))
        base.camera.setY(self.ballModel.getY() + math.cos(self.camAngle))

        self.resetCamDist()
        self.checkCollisions()
        self.lookAtFloater()

        self.checkForWin()

        return task.cont

    def resetCamDist(self):
        #resets the camera distance to a specific distance
        #keeps distance relatively constant
        camFarDist = 0.75
        camCloseDist = 0.7

        camvec = self.ballModel.getPos() - base.camera.getPos()
            #vector between ball and camera
        camvec.setZ(0)
        camdist = camvec.length()
        camvec.normalize()

        if (camdist > camFarDist):
            base.camera.setPos(base.camera.getPos() + 
                                    camvec*(camdist-camFarDist))
            camdist = camFarDist

        if (camdist < camCloseDist):
            base.camera.setPos(base.camera.getPos() -
                                    camvec*(camCloseDist-camdist))
            camdist = camCloseDist

        base.camera.lookAt(self.ballModel)

    def lookAtFloater(self):
        #looks at the floater above the sphere
        floaterHeight = 0.23
        self.floater.setPos(self.ballModel.getPos())
        self.floater.setZ(self.ballModel.getZ() + floaterHeight)
        base.camera.lookAt(self.floater)

    ####################### Movement Animation #################################

    def ballIsMoving(self):
        #notes if the ball is moving or not with self.isMoving variable
        if (self.keyMap["forward"]!=0) or (self.keyMap["backward"]!=0):
            if self.isMoving == False:
                self.isMoving = True

        elif self.keyMap["forward"] == 0 and self.keyMap["backward"] == 0:
            self.isMoving = False

    def movementAnimation(self, step):
        #describes the movement animation
        if self.drop == True:
            self.dropMovementAnimation(step)
        elif self.direction == "N":
            self.northMovementAnimation(step)

        elif self.direction == "S":
            self.southMovementAnimation(step)

        elif self.direction == "E":
            self.eastMovementAnimation(step)

        elif self.direction == "W":
            self.westMovementAnimation(step)

    def northMovementAnimation(self, step):
        #describes animation when direction is north
        if (self.keyMap["forward"]!=0):
            #if you are pressing forward
            if self.disableForwardMovement == False:
                #if you are just moving through space...
                self.ballModel.setY(self.ballModel.getY() + step)
            if self.disableBackwardMovement == True:
                #if you had moved backwards into a wall
                #and you want to move forward again
                self.ballModel.setY(self.ballModel.getY() + step)
                self.disableBackwardMovement = False
                

        if (self.keyMap["backward"]!=0):
            #if you are pressing backwards
            if self.disableBackwardMovement == False:
                #if you are just moving backwards through space...
                self.ballModel.setY(self.ballModel.getY() - step)
            if self.disableForwardMovement == True:
                #if you had moved forward into a wall
                #and want to back away from the wall
                self.ballModel.setY(self.ballModel.getY() - step)
                self.disableForwardMovement = False        

    def southMovementAnimation(self, step):
        #describes animation when direction is north
        #same relative set of animations to northMovementAnimation
        #but opposite
        if (self.keyMap["forward"]!=0):
            if self.disableBackwardMovement == False:
                self.ballModel.setY(self.ballModel.getY() - step)
            if self.disableForwardMovement == True:
                self.ballModel.setY(self.ballModel.getY() - step)
                self.disableForwardMovement = False

        if (self.keyMap["backward"]!=0):
            if self.disableForwardMovement == False:
                self.ballModel.setY(self.ballModel.getY() + step)
            if self.disableBackwardMovement == True:
                self.ballModel.setY(self.ballModel.getY() + step)
                self.disableBackwardMovement = False        

    def eastMovementAnimation(self, step):
        #describes animation when direction is east
        #same relative as north and south movement animations
        #but relative to the x axis
        #and disabling/enabling right and left movement at collisions
        if (self.keyMap["forward"]!=0):
            if self.disableRightMovement == False:
                self.ballModel.setX(self.ballModel.getX() + step)
            if self.disableLeftMovement == True:
                self.ballModel.setX(self.ballModel.getX() + step)
                self.disableLeftMovement = False

        if (self.keyMap["backward"]!=0):
            if self.disableLeftMovement == False:
                self.ballModel.setX(self.ballModel.getX() - step)
            if self.disableRightMovement == True:
                self.ballModel.setX(self.ballModel.getX() - step)
                self.disableRightMovement = False

    def westMovementAnimation(self, step):
        #describes animation when direction is west
        #relatively same animations as the east movement animations
        #exact opposite
        if (self.keyMap["forward"]!=0):
            if self.disableLeftMovement == False:
                self.ballModel.setX(self.ballModel.getX() - step)
            if self.disableRightMovement == True:
                self.ballModel.setX(self.ballModel.getX() - step)
                self.disableRightMovement = False

        if (self.keyMap["backward"]!=0):
            if self.disableRightMovement == False:
                self.ballModel.setX(self.ballModel.getX() + step)
            if self.disableLeftMovement == True:
                self.ballModel.setX(self.ballModel.getX() + step)
                self.disableLeftMovement = False

    def turnRight(self):
        #turns right in the animation

        #uses an interval to slowly rotate camera around
        initial = self.camAngle
        final = self.camAngle + math.pi/2

        #turn animation
        turnTime = 0.2
        turnRightSeq = Sequence()
        turnRightSeq.append(LerpFunc(self.changeCamAngle, turnTime, initial,
                                                         final, 'easeInOut'))
        turnRightSeq.start()

        self.setKey("right", 1) #notes that the right key is pressed

        #changes the direction right, based on current direction
        if self.direction == "N":
            self.direction = "E"
        elif self.direction == "E":
            self.direction = "S"
        elif self.direction == "S":
            self.direction = "W"
        else:
            self.direction = "N"

        #when you turn, all the collision disablements should be True
        #just checking
        #self.enableAllWalls()

        #update the label
        self.updateDirectionText()

    def turnLeft(self):
        #turns left

        initial = self.camAngle
        final = self.camAngle - math.pi/2

        #turn animation
        turnTime = 0.2
        turnRightSeq = Sequence()
        turnRightSeq.append(LerpFunc(self.changeCamAngle, turnTime, initial,
                                                         final, 'easeInOut'))
        turnRightSeq.start()


        self.setKey("left", 1) #notes that left key is pressed

        #changes the direction left, based on current direction
        if self.direction == "N":
            self.direction = "W"
        elif self.direction == "W":
            self.direction = "S"
        elif self.direction == "S":
            self.direction = "E"
        else:
            self.direction = "N"

        #when you turn, all the collision disablements should be True
        #just checking
        #self.enableAllWalls()

        #update the label
        self.updateDirectionText()

    def changeCamAngle(self, angle):
        #changes the camAngle to angle
        self.camAngle = angle

    def dropMovementAnimation(self, step):
        #describes movement when drop is hit

        a = 0.1

        if self.keyMap["drop"] != 0:
            if self.ballModel.getZ() > self.currentHeight - self.levelHeight+ a:
                self.ballModel.setZ(self.ballModel.getZ() - step)
            else:
                self.currentHeight -= self.levelHeight
                self.level += 1
                self.updateLevelText()
                self.drop = False
                base.camera.setZ(self.ballModel.getZ() + self.cameraHeight)

    def nowDropping(self):
        #toggles isDropping boolean
        self.drop = True
        self.setKey("drop", 1)
        
    ################## Ball Rotation Animation #################################

    def rotationAnimation(self):
        #describes the rotation movement of sphere
        self.ballIsMoving()
        speed=300
        inCollision = self.inCollision()

        if self.isMoving and not inCollision:
            if self.direction == "N":
                self.northRotationAnimation(speed)
            if self.direction == "S":
                self.southRotationAnimation(speed)
            if self.direction == "E":
                self.eastRotationAnimation(speed)
            if self.direction == "W":
                self.westRotationAnimation(speed)

    def northRotationAnimation(self, speed):
        #describes the rotation animation if direction is north
        if self.keyMap["forward"] != 0:
            self.ballModel.setP(self.ballModel.getP()-speed*globalClock.getDt())
        elif self.keyMap["backward"] != 0:
            self.ballModel.setP(self.ballModel.getP()+speed*globalClock.getDt())

    def southRotationAnimation(self, speed):
        #describes the rotaiton animation if the direction is south
        if self.keyMap["backward"] != 0:
            self.ballModel.setP(self.ballModel.getP()-speed*globalClock.getDt())
        elif self.keyMap["forward"] != 0:
            self.ballModel.setP(self.ballModel.getP()+speed*globalClock.getDt())

    def eastRotationAnimation(self, speed):
        #describes the rotation animation if the direction is east
        if self.keyMap["backward"] != 0:
            self.ballModel.setR(self.ballModel.getR()-speed*globalClock.getDt())
        elif self.keyMap["forward"] != 0:
            self.ballModel.setR(self.ballModel.getR()+speed*globalClock.getDt())

    def westRotationAnimation(self, speed):
        #describes the rotation animation if the direction is west
        if self.keyMap["forward"] != 0:
            self.ballModel.setR(self.ballModel.getR()-speed*globalClock.getDt())
        elif self.keyMap["backward"] != 0:
            self.ballModel.setR(self.ballModel.getR()+speed*globalClock.getDt())

###################### VIEWS ###################################################

    def toggle_xray_mode(self):
        #Toggle X-ray mode on and off.
        #Note: slows down program considerably
        xRayA = 0.5
        self.xray_mode = not self.xray_mode
        if self.xray_mode:
            self.wallModel.setColorScale((1, 1, 1, xRayA))
            self.wallModel.setTransparency(TransparencyAttrib.MDual)
        else:
            self.wallModel.setColorScaleOff()
            self.wallModel.setTransparency(TransparencyAttrib.MNone)

    def toggle_collision_mode(self):
        #Toggle collision mode on and off
        #Shows visual representation of the collisions occuring
        self.collision_mode = not self.collision_mode
        if self.collision_mode == True:
            # Note: Slows the program down considerably
            self.cTrav.showCollisions(render)
        else:
            self.cTrav.hideCollisions()

    def toggle_wireframe(self):
        #toggles wireframe view
        self.wireframe = not self.wireframe
        if self.wireframe:
            self.wallModel.setRenderModeWireframe()
        else:
            self.wallModel.setRenderModeFilled()

##################### RESTART ##################################################
    
    def restart(self):
        #restarts the game
        loading = SplashScreen()
        loading.loading()
        self.reset()

    def reset(self):
        #resets the maze, resets the location of the character

        #removes all notes
        self.wallModel.removeNode()
        self.ballModel.removeNode()

        #resets notes
        self.loadWallModel()
        self.loadBallModel()
        self.createBallColliderModel()
        self.resetCamDist()

        #resets timers
        taskMgr.remove("timerTask")
        self.timer = ""
        self.timerText.destroy()

        self.promptMode()

#################### TIMER #####################################################

    def setTimer(self):
        #code from panda.egg user on Panda3D, 
        #"How to use Timer, a small example maybe?" forum
        #creates a timer
        self.timer = DirectLabel(pos=Vec3(1, 0.85),scale=0.08)

        taskMgr.add(self.timerTask, "timerTask")

    def dCharstr(self, theString):
        #code from panda.egg user on Panda3D, 
        #"How to use Timer, a small example maybe?" forum
        #turns time string into a readable clock string
        if len(theString) != 2:
            theString = '0' + theString
        return theString

    def timerTask(self, task):
        #code from panda.egg user on Panda3D, 
        #"How to use Timer, a small example maybe?" forum
        #task for resetting timer in timer mode
        secondsTime = int(task.time)
        minutesTime = int(secondsTime/60)
        hoursTime = int(minutesTime/60)
        self.timer = (str(hoursTime) + ':' 
                            + self.dCharstr(str(minutesTime%60)) + ':' 
                            + self.dCharstr(str(secondsTime%60)))

        self.updateTimerText()
        
        return Task.cont
Пример #31
0
class Dialog:
	def __init__(self, menuGraphics, fonts, menu, menuButton):

		self.menuGraphics = menuGraphics
                self.menuButton = menuButton
		self.fonts = fonts
		self.self = self
                self.menu = menu
                self.links = {}
                links = open('links.txt', 'r')
                for line in links:
                    (key, val) = line.split()
                    self.links[key] = val
                self.keys = self.links.keys()
                self.pressed = False

	def initMenu(self, args):
		type = args[0]
		if(args[1] != None):
			self.title = args[1]
		else:
			self.title = None
		self.items = args[2]
		self.buttons = []

		if(type == 3):
			self.frame = DirectFrame(
				geom = self.menuGraphics.find("**/menu3"),
				relief = None, scale = (1.5,1,1.5),
				frameColor = (1,1,1,.75), parent = base.aspect2d)
			framePadding = .1

			height = self.frame.getHeight()/2 - framePadding

			self.title = DirectLabel(text = self.title,
				text_font = self.fonts["times"], text_fg = (1,1,1,.75),
				relief = None, text_align = TextNode.ACenter,
				text_scale = .05, parent = self.frame,
				pos = (-.025,0,height+0.05))
                        if self.title["text"].startswith('Screen'):
                            if self.menu.world.startOptions.has_key(self.title["text"]):
                                self.active = [self.menu.world.startOptions[self.title["text"]]]
                            else:
                                self.active = [0]
                            for N in range(len(self.items)):
                                    xPos = -.3
                                    zPos = -(height / (2)) * N + 0.1
                                    if len(self.buttons)>=5:
                                        xPos = 0.15
                                        zPos = self.buttons[N-5]["pos"][2]
                                    self.buttons.append(DirectRadioButton(
                                            variable = self.active, value = [N], scale = 0.045,
                                            text = self.keys[N], text_font = self.fonts["times"],
                                            boxPlacement = 'left',
                                            text_fg = (1,1,1,.75),
                                            text_pos=(0,0),
                                            text_align = TextNode.ALeft,
                                            relief = None,
                                            clickSound = None,
                                            #rolloverSound = None,
                                            parent = self.frame,
                                            pos = (xPos, 0, zPos)))

                            for button in self.buttons:
                                    button.setOthers(self.buttons)

                            b = DirectButton(
                                            command = self.loadWebView,
                                            text = "OK",
                                            text_font = self.fonts["blue"],
                                            text_fg = (1,1,1,1),
                                            text_scale=(0.04,0.04),
                                            text_pos=(0,-0.01),
                                            text_align = TextNode.ACenter,
                                            geom = (self.menuButton.find("**/normal"),
                                                            self.menuButton.find("**/clicked"),
                                                            self.menuButton.find("**/hoover")),
                                            geom_scale = (1,1,1.5),
                                            relief = None, clickSound = None,
                                            rolloverSound = None, parent = self.frame,
                                            pos = (0, 0, -.16))
                        else:
                            self.help = OnscreenText(text = 'f1 - URL reload\
                                                        \nf2 - Zoom in on display\
                                                        \nf3 - Toggle menu\
                                                        \narrow keys - Navigation',
                                                font = self.fonts["times"],
                                                fg = (1,1,1,.75),
                                                pos = (-0.37, 0.09),
                                                scale = 0.045,
                                                align = TextNode.ALeft,
                                                parent = self.frame)
                                                
                            self.close = DirectButton(
                                            command = self.destroyHelp,
                                            text = "Close",
                                            text_font = self.fonts["blue"],
                                            text_fg = (1,1,1,1),
                                            text_scale=(0.04,0.04),
                                            text_pos=(0,-0.01),
                                            text_align = TextNode.ACenter,
                                            geom = (self.menuButton.find("**/normal"),
                                                            self.menuButton.find("**/clicked"),
                                                            self.menuButton.find("**/hoover")),
                                            geom_scale = (1,1,1.5),
                                            relief = None, clickSound = None,
                                            rolloverSound = None, parent = self.frame,
                                            pos = (0, 0, -.16))

		return

        def loadWebView(self):
                if self.title["text"] == "Screen 1":
                    key = self.buttons[self.active[0]]["text"]
                    self.menu.world.htmlview1.webView.loadURL(self.links[key], '', '', '')
                    self.menu.world.htmlview1.htmlFile = self.links[key]
                elif self.title["text"] == "Screen 2":
                    key = self.buttons[self.active[0]]["text"]
                    self.menu.world.htmlview2.webView.loadURL(self.links[key], '', '', '')
                    self.menu.world.htmlview2.htmlFile = self.links[key]
                elif self.title["text"] == "Screen 3":
                    key = self.buttons[self.active[0]]["text"]
                    self.menu.world.htmlview3.webView.loadURL(self.links[key], '', '', '')
                    self.menu.world.htmlview3.htmlFile = self.links[key]
                elif self.title["text"] == "Screen 4":
                    key = self.buttons[self.active[0]]["text"]
                    self.menu.world.htmlview4.webView.loadURL(self.links[key], '', '', '')
                    self.menu.world.htmlview4.htmlFile = self.links[key]
                elif self.title["text"] == "Screen 5":
                    key = self.buttons[self.active[0]]["text"]
                    self.menu.world.htmlview5.webView.loadURL(self.links[key], '', '', '')
                    self.menu.world.htmlview5.htmlFile = self.links[key]
                self.menu.options[self.title["text"]] = self.active[0]
                self.destroyScreen()

	def destroyScreen(self):
		for N in range(len(self.items)):
			self.buttons[0].destroy()
		if(self.title != None):
			self.title.destroy()
		self.frame.destroy()
		self.self = None
		return

        def destroyHelp(self):
                self.close.destroy()
                self.help.destroy()
                self.title.destroy()
                self.frame.destroy()
Пример #32
0
class World(DirectObject):
    mySound = base.loader.loadSfx("trial.mp3")

    #Used for adding a virus at a randomly generated position
    def random_vgen(self):
        print 'I am in random'
        for i in range(0, 5):

            self.a[random.randint(0, 7)][random.randint(0, 7)] = 1

    def initializer(self, level):

        self.turns = 0

        ##   Level Definition

        def levelone():
            self.a[4][4] = 1
            self.a[4][5] = 1
            self.a[4][6] = 1
            self.a[5][2] = 1
            self.a[3][5] = 1
            self.a[4][6] = 1
            self.a[5][5] = 1

        def leveltwo():
            self.a[4][3] = 1
            self.a[4][5] = 1
            self.a[4][7] = 1
            self.a[5][2] = 1
            self.a[3][5] = 1
            self.a[2][2] = 1
            self.a[5][3] = 1
            self.a[1][2] = 1

        def levelthree():
            self.a[4][4] = 1
            self.a[4][5] = 1
            self.a[4][6] = 1
            self.a[5][2] = 1
            self.a[3][5] = 1
            self.a[4][6] = 1
            self.a[5][5] = 1
            self.a[4][3] = 1
            self.a[4][5] = 1
            self.a[4][7] = 1
            self.a[5][2] = 1
            self.a[3][5] = 1
            self.a[2][2] = 1
            self.a[5][3] = 1

        options = {1: levelone, 2: leveltwo, 3: levelthree}

        options[level]()

        print self.a
        temp = []
        count = 0
        for element in reversed(self.a):
            for ele in element:
                #print 'cheking element is 1 : ' + str(ele)
                if ele == 1:
                    temp.append(count)
                    self.pieces[count] = Monster(count, WHITE)
                    #self.squares[count].setColor(HIGHLIGHT)
                count = count + 1
        self.list = temp

    def showscore(self):
        try:
            self.score.destroy()
        except:
            pass
        self.score = OnscreenText(text='Number of Turns : %s' % (self.turns),
                                  pos=(0.5, 0.95),
                                  scale=0.07,
                                  mayChange=True)

    def menuscreen(self):

        # Callback function to set  text
        def setText():
            b.destroy()
            helptext.destroy()

        # Add button
        b = DirectButton(text=("START", "START", "START", "disabled"),
                         scale=0.15,
                         command=setText,
                         pos=(0, 0, 0.85))

        helptext = OnscreenText(text='''
    STORY:
    Hello Mad Scientist!
    You are so close to finding the cure to aids!
    You understood the behaviour and can finally manipulate the virus to kill itself!
    But time is running out!
    You have a red and white blood cell sample infected with AIDS Virus.

    INSTRUCTIONS:
    The AIDS Virus obeys the Conway's Game of Life. Who would have guessed?
    1.  If virus is surrounded by more than 3 viruses, it dies of suffocation
    2.  If virus is surrounded by less than 2 viruses, it dies of underpopulation
    3.  If dead empty cell, is surrounded by exactly 3 viruses, a new virus is spawned due to breeding.

    AIM:
    To kill all the viruses, by moving one of them every turn.

    ''',
                                pos=(-0.90, 0.72),
                                frame=(123, 123, 123, 1),
                                wordwrap=25,
                                align=TextNode.ALeft,
                                bg=(0.23, 0.243, 0.13, 0.9))

    def endscreen(self):
        def restart():
            taskMgr.remove(self.mouseTask)
            for i in range(64):
                self.squares[i].setColor(SquareColor(i))
            scorecard.destroy()
            restartb.destroy()
            end.destroy()
            nextlevelb.destroy()
            self.reference.destroy()
            self.mySound.stop()
            try:
                self.score.destroy()
            except:
                pass
            print 'restarting'
            print self.a
            print self.list

            World()

        def quitgame():
            sys.exit()

        def nextLevel():
            self.currlevel = self.currlevel + 1
            nextlevelb.destroy()
            scorecard.destroy()
            restartb.destroy()
            end.destroy()
            self.score.destroy()
            self.initializer(self.currlevel)

        # Add button

        scorecard = OnscreenText(text='You finished it in %s turns! ' %
                                 (self.turns),
                                 frame=(123, 123, 123, 0),
                                 wordwrap=25,
                                 bg=(0.2, 0, 0.8, 1))

        nextlevelb = DirectButton(text=("NEXT LEVEL", "NEXT LEVEL",
                                        "NEXT LEVEL", "disabled"),
                                  scale=0.15,
                                  command=nextLevel,
                                  pos=(0, 0, -0.15))
        restartb = DirectButton(text=("RESTART", "RESTART", "RESTART",
                                      "disabled"),
                                scale=0.15,
                                command=restart,
                                pos=(0, 0, -0.35))
        end = DirectButton(text=("QUIT", "QUIT", "QUIT", "disabled"),
                           scale=0.15,
                           command=quitgame,
                           pos=(0, 0, -0.55))
        if self.currlevel == self.maxlevel:
            nextlevelb.destroy()

    def __init__(self):
        #music

        self.mySound.play()

        print 'I am being initialized'

        self.menuscreen()
        self.list = []
        self.turns = 0
        self.maxlevel = 3
        self.currlevel = 1
        self.a = [[0 for x in range(8)] for y in range(8)]

        #This code puts the standard title and instruction text on screen
        self.title = OnscreenText(text="Game of Life : Help in ending AIDS!",
                                  style=1,
                                  fg=(1, 1, 1, 1),
                                  pos=(0, -0.95),
                                  scale=.07)
        self.escapeEvent = OnscreenText(text="ESC: Quit",
                                        style=1,
                                        fg=(1, 1, 1, 1),
                                        pos=(-1.3, 0.95),
                                        align=TextNode.ALeft,
                                        scale=.05)
        ##    self.mouse1Event = OnscreenText(
        ##      text="Left-click and drag: Pick up virus and drag it to a new bloodcell",
        ##      style=1, fg=(1,1,1,1), pos=(-1.3, 0.90),
        ##      align=TextNode.ALeft, scale = .05)
        ##

        self.accept('escape', sys.exit)  #Escape quits

        base.disableMouse()  #Disble mouse camera control
        camera.setPosHpr(0, -13.75, 6, 0, -25, 0)  #Set the camera
        self.setupLights()  #Setup default lighting

        #Since we are using collision detection to do picking, we set it up like
        #any other collision detection system with a traverser and a handler
        self.picker = CollisionTraverser()  #Make a traverser
        self.pq = CollisionHandlerQueue()  #Make a handler
        #Make a collision node for our picker ray
        self.pickerNode = CollisionNode('mouseRay')
        #Attach that node to the camera since the ray will need to be positioned
        #relative to it
        self.pickerNP = camera.attachNewNode(self.pickerNode)
        #Everything to be picked will use bit 1. This way if we were doing other
        #collision we could seperate it
        self.pickerNode.setFromCollideMask(BitMask32.bit(1))
        self.pickerRay = CollisionRay()  #Make our ray
        self.pickerNode.addSolid(self.pickerRay)  #Add it to the collision node
        #Register the ray as something that can cause collisions
        self.picker.addCollider(self.pickerNP, self.pq)
        #self.picker.showCollisions(render)

        #We will attach all of the squares to their own root. This way we can do the
        #collision pass just on the sqaures and save the time of checking the rest
        #of the scene
        self.squareRoot = render.attachNewNode("squareRoot")

        #For each square
        self.squares = [None for i in range(64)]
        self.pieces = [None for i in range(64)]

        for i in range(64):
            #Load, parent, color, and position the model (a single square polygon)
            self.squares[i] = loader.loadModel("models/square")
            self.squares[i].reparentTo(self.squareRoot)
            self.squares[i].setPos(SquarePos1(i))
            self.squares[i].setColor(SquareColor(i))
            #Set the model itself to be collideable with the ray. If this model was
            #any more complex than a single polygon, you should set up a collision
            #sphere around it instead. But for single polygons this works fine.
            self.squares[i].find("**/polygon").node().setIntoCollideMask(
                BitMask32.bit(1))
            #Set a tag on the square's node so we can look up what square this is
            #later during the collision pass
            self.squares[i].find("**/polygon").node().setTag('square', str(i))

            #We will use this variable as a pointer to whatever piece is currently
            #in this square

        self.initializer(self.currlevel)

        #This will represent the index of the currently highlited square
        self.hiSq = False
        #This wil represent the index of the square where currently dragged piece
        #was grabbed from
        self.dragging = False

        #Start the task that handles the picking
        self.mouseTask = taskMgr.add(self.mouseTask, 'mouseTask')
        #self.trial = taskMgr.add(self.trial,'trial')
        self.accept("mouse1", self.grabPiece)  #left-click grabs a piece
        self.accept("mouse1-up", self.releasePiece)  #releasing places it

    #This function swaps the positions of two pieces
    def swapPieces(self, fr, to):
        temp = self.pieces[fr]
        self.pieces[fr] = self.pieces[to]
        self.pieces[to] = temp
        if self.pieces[fr]:
            print 'imma swapping'
            self.pieces[fr].square = fr
            print fr
            print SquarePos(fr)
            try:
                self.pieces[fr].obj.setPos(SquarePos(fr))
            except:
                pass
            print 'done'
        if self.pieces[to]:
            self.pieces[to].square = to
            try:
                self.pieces[to].obj.setPos(SquarePos(to))
            except:
                pass

    def trial(self):
        self.turns = self.turns + 1
        try:
            self.reference.destroy()
        except:
            pass
        self.reference = OnscreenText(text='''
Reference:
virus is surrounded by more than 3 viruses, it dies
virus is surrounded by less than 2 viruses, it dies
If dead empty cell, is surrounded by exactly 3 viruses, a new virus is spawned.
''',
                                      style=1,
                                      fg=(1, 1, 1, 1),
                                      pos=(-1, 0.95),
                                      align=TextNode.ALeft,
                                      scale=.05)

        self.showscore()
        a = self.a
        while True:
            for i in self.list:
                #insert deletion code
                print 'imma deleting the sq : ' + str(i)
                self.pieces[i].obj.delete()

                self.squares[i].setColor(SquareColor(i))
            count = 0
            a = [[([[
                sum(b[y1][x1]
                    for b in [[[(
                        (-1 < x2 + dx < len(a[0])) and
                        (-1 < y2 + dy < len(a))) and a[y2 + dy][x2 + dx] or 0
                                for x2 in range(len(a[0]))]
                               for y2 in range(len(a))]
                              for (dx, dy) in [(dx, dy) for dx in [-1, 0, 1]
                                               for dy in [-1, 0, 1] if
                                               (dy != 0 or dx != 0)]])
                for x1 in range(len(a[0]))
            ] for y1 in range(len(a))][y][x] == 3 or ([[
                sum(c[y3][x3]
                    for c in [[[(
                        (-1 < x4 + dx < len(a[0])) and
                        (-1 < y4 + dy < len(a))) and a[y4 + dy][x4 + dx] or 0
                                for x4 in range(len(a[0]))]
                               for y4 in range(len(a))]
                              for (dx, dy) in [(dx, dy) for dx in [-1, 0, 1]
                                               for dy in [-1, 0, 1] if
                                               (dy != 0 or dx != 0)]])
                for x3 in range(len(a[0]))
            ] for y3 in range(len(a))][y][x] == 2 and a[y][x] == 1)) and 1 or 0
                  for x in range(len(a[0]))] for y in range(len(a))]
            lis = []
            #insert a random virus at a probability of 1/5
            diceroll = random.randint(0, 5)
            if diceroll == 2:

                self.random_vgen()
            for element in reversed(a):

                for ele in element:
                    #print 'cheking element is 1 : ' + str(ele)
                    if ele == 1:
                        lis.append(count)
                    count = count + 1
            print lis
            self.list = lis

            self.a = a
            print self.list

            for i in self.list:
                self.pieces[i] = Monster(i, WHITE)
                #self.squares[i].setColor(HIGHLIGHT)
            print 'leaving trial'
            if len(self.list) == 0:
                self.endscreen()
            break

        return

    def mouseTask(self, task):
        #This task deals with the highlighting and dragging based on the mouse

        #First, clear the current highlight
        if self.hiSq is not False:
            self.squares[self.hiSq].setColor(SquareColor(self.hiSq))
            self.hiSq = False

        #Check to see if we can access the mouse. We need it to do anything else
        if base.mouseWatcherNode.hasMouse():
            #get the mouse position
            mpos = base.mouseWatcherNode.getMouse()

            #Set the position of the ray based on the mouse position
            self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())

            #If we are dragging something, set the position of the object
            #to be at the appropriate point over the plane of the board
            if self.dragging is not False:
                #Gets the point described by pickerRay.getOrigin(), which is relative to
                #camera, relative instead to render
                nearPoint = render.getRelativePoint(camera,
                                                    self.pickerRay.getOrigin())
                #Same thing with the direction of the ray
                nearVec = render.getRelativeVector(
                    camera, self.pickerRay.getDirection())
                try:
                    self.pieces[self.dragging].obj.setPos(
                        PointAtZ(.5, nearPoint, nearVec))
                except:
                    pass
            #Do the actual collision pass (Do it only on the squares for
            #efficiency purposes)
            self.picker.traverse(self.squareRoot)
            if self.pq.getNumEntries() > 0:
                #if we have hit something, sort the hits so that the closest
                #is first, and highlight that node
                self.pq.sortEntries()
                i = int(self.pq.getEntry(0).getIntoNode().getTag('square'))
                #Set the highlight on the picked square
                self.squares[i].setColor(HIGHLIGHT)
                self.hiSq = i
                #print 'selected is ' + str(i)

        return Task.cont

    def grabPiece(self):
        #If a square is highlighted and it has a piece, set it to dragging mode
        if (self.hiSq is not False and self.pieces[self.hiSq]):
            self.dragging = self.hiSq
            self.hiSq = False

    def releasePiece(self):
        #Letting go of a piece. If we are not on a square, return it to its original
        #position. Otherwise, swap it with the piece in the new square
        if self.dragging is not False:  #Make sure we really are dragging something
            #We have let go of the piece, but we are not on a square
            if self.hiSq is False:
                try:
                    self.pieces[self.dragging].obj.setPos(
                        SquarePos(self.dragging))
                except:
                    pass
            else:
                #Otherwise, swap the pieces
                self.swapPieces(self.dragging, self.hiSq)
                #self.draggin is the from
                print self.list
                print 'you picked this, so Imma deleting this ' + str(
                    self.dragging)
                #deletion of i after picking it up.
                try:
                    self.list.remove(self.dragging)
                except:
                    pass
                temp2 = []
                temp2 = SquarePosTuple(self.dragging)
                self.a[temp2[0]][temp2[1]] = 0

                i = self.hiSq
                print self.list
                print 'highlighted sq is ' + str(i)
                templis = []
                templis = SquarePosTuple(i)
                print templis
                self.list.append(i)
                print self.list
                print templis
                self.a[templis[0]][templis[1]] = 1

                for line in self.a:
                    print line
                self.trial()

        #We are no longer dragging anything
        self.dragging = False

    def setupLights(self):  #This function sets up some default lighting
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor(Vec4(.8, .8, .8, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(Vec3(0, 45, -45))
        directionalLight.setColor(Vec4(0.2, 0.2, 0.2, 1))
        render.setLight(render.attachNewNode(directionalLight))
        render.setLight(render.attachNewNode(ambientLight))
class Dashboard(DirectObject):
    # def __init__(self, character, taskMgr, raceMst):
    def __init__(self, world, taskMgr):
        self.world = world

        self.font_digital = loader.loadFont('models/font/SFDigitalReadout-Heavy.ttf')
        self.total_players = 30
        self.rank = 21
        self.main_char = world.vehicleContainer
        #self.rm = raceMst
        self.speed = "0.0 km/h"
        self.lead1 = ""
        self.lead2 = ""
        self.lead3 = ""
        self.start_time = datetime.datetime.now()
        self.time_elapsed = datetime.timedelta(milliseconds=0)
        self.countdown_time = datetime.timedelta(minutes=8)
        # insert total time
        self.game_time = self.countdown_time - self.time_elapsed
        # print self.game_time

        # Timer
        self.display_timer = OnscreenText(text=str(self.game_time), style=1, fg=(1, 1, 1, 1), pos=(0, .9), scale=.1,
                                          font=self.font_digital)

        # Mini-Map
        # self.mini_map = OnscreenImage(image="models/dashb/minimap.png", scale=.15, pos=(-1.15, 0, .8))
        # self.mini_map.setTransparency(TransparencyAttrib.MAlpha)


        # Speedometer
        self.speed_img = OnscreenImage(image="models/dashb/speedometer.png", scale=.5, pos=(1.1, 0, -.95))
        self.speed_img.setTransparency(TransparencyAttrib.MAlpha)
        OnscreenText(text="km\n/h", style=1, fg=(1, 1, 1, 1),
                     font=self.font_digital, scale=.07, pos=(1.25, -.92))

        # Your Rank
        OnscreenText(text="Rank", style=1, fg=(1, 1, 1, 1), pos=(-.9, .89), align=TextNode.ALeft,
                     font=self.font_digital, scale=.06)
        #rank = str(self.rm.rank) + "/" + str(self.rm.racers)
        # self.display_rank = OnscreenText(text=rank, style=1, fg=(1, 1, 1, 1),
        #                                  pos=(-.8, .85), align=TextNode.ALeft,
        #                                  scale=.15, font=self.font_digital)
        OnscreenText(text="Players\nLeft", style=1, fg=(1, 1, 1, 1), pos=(-.5, .89), align=TextNode.ALeft,
                     font=self.font_digital, scale=.06)

        #laps = str(self.rm.laps) + " Laps"
        #self.display_lap = OnscreenText(text=laps, style=1, fg=(1, 1, 1, 1), pos=(1.0, .89), align=TextNode.ALeft,
        #                                font=self.font_digital, scale=.06)

        # Leaderboard Ranking
        self.leader1 = OnscreenText(text="1:", style=1, fg=(1, 1, 1, 1),
                                    pos=(-1.3, .5), align=TextNode.ALeft,
                                    scale=.07, font=self.font_digital)
        self.leader2 = OnscreenText(text="2:", style=1, fg=(1, 1, 1, 1),
                                    pos=(-1.3, .45), align=TextNode.ALeft,
                                    scale=.07, font=self.font_digital)
        self.leader3 = OnscreenText(text="3:", style=1, fg=(1, 1, 1, 1),
                                    pos=(-1.3, .4), align=TextNode.ALeft,
                                    scale=.07, font=self.font_digital)

        # Power-ups
        # OnscreenText(text="1", style=1, fg=(1, 1, 1, 1),
        #              pos=(-1.25, -.95),
        #              scale=.07)
        # OnscreenText(text="2", style=1, fg=(1, 1, 1, 1),
        #              pos=(-1.15, -.95),
        #              scale=.07)
        # OnscreenText(text="3", style=1, fg=(1, 1, 1, 1),
        #              pos=(-1.05, -.95),
        #              scale=.07)
        # self.power1 = OnscreenImage(image='models/power_ups/pow1.png', pos=(-1.25, 0, -0.85), scale=.05)
        # self.power2 = OnscreenImage(image='models/power_ups/pow2.png', pos=(-1.15, 0, -0.85), scale=.05)
        # self.power3 = OnscreenImage(image='models/power_ups/pow3.png', pos=(-1.05, 0, -0.85), scale=.05)

        # Display Speed
        self.display_speed = OnscreenText(text=self.speed, style=1, fg=(1, 1, 1, 1),
                                          pos=(1.3, -0.95), align=TextNode.ARight, scale=.07, font=self.font_digital)

        taskMgr.doMethodLater(.1, self.show_speed, 'updateSpeed')
        taskMgr.doMethodLater(.1, self.show_timer, 'updateTimer')
        taskMgr.doMethodLater(.1, self.update_rank, 'updateRank')

    def show_speed(self, task):
        self.speed = str(format(self.main_char.vehicle.getCurrentSpeedKmHour(), '0.2f'))
        # print self.speed

        # Update Speed Display
        self.display_speed.destroy()
        self.display_speed = OnscreenText(text=self.speed, style=3, fg=(1, 1, 1, 1),
                                          pos=(1.2, -0.95), align=TextNode.ARight, scale=.15, font=self.font_digital)
        return task.cont

    def show_timer(self, task):
        self.time_elapsed = datetime.datetime.now() - self.start_time
        game_time = str(self.countdown_time - self.time_elapsed)[2:11]
        self.display_timer.destroy()
        self.display_timer = OnscreenText(text=game_time, style=3, fg=(1, 1, 1, 1), pos=(0, .9), scale=.15,
                                          font=self.font_digital)
        return task.cont

    # server updates client time in ms
    def force_timer(self, server_time):
        self.start_time = datetime.datetime.now()
        self.countdown_time = datetime.timedelta(milliseconds=server_time)

    def update_ranking(self, leaders):
        # get usernames from list
        self.lead1 = leaders.get(1)
        self.lead2 = leaders.get(2)
        self.lead3 = leaders.get(3)

    def update_rank(self, task):
        #self.display_rank.destroy()
        #self.display_lap.destroy()

        # Your Rank
        #rank = str(self.rm.rank) + "/" + str(self.rm.racers)
        # self.display_rank = OnscreenText(text=rank, style=1, fg=(1, 1, 1, 1),
        #                                  pos=(-.8, .85), align=TextNode.ALeft,
        #                                  scale=.15, font=self.font_digital)
        #
        # #laps = str(self.rm.laps) + " Laps - " + str(self.rm.checkpointspassed)
        # self.display_lap = OnscreenText(text=laps, style=1, fg=(1, 1, 1, 1), pos=(1.0, .89), align=TextNode.ALeft,
        #                                 font=self.font_digital, scale=.06)

        # Leader board
        self.leader1.destroy()
        self.leader2.destroy()
        self.leader3.destroy()
        lead1 = "1:" + self.lead1
        lead2 = "2:" + self.lead2
        lead3 = "3:" + self.lead3
        self.leader1 = OnscreenText(text=lead1, style=1, fg=(1, 1, 1, 1),
                                    pos=(-1.3, .5), align=TextNode.ALeft,
                                    scale=.07, font=self.font_digital)
        self.leader2 = OnscreenText(text=lead2, style=1, fg=(1, 1, 1, 1),
                                    pos=(-1.3, .45), align=TextNode.ALeft,
                                    scale=.07, font=self.font_digital)
        self.leader3 = OnscreenText(text=lead3, style=1, fg=(1, 1, 1, 1),
                                    pos=(-1.3, .4), align=TextNode.ALeft,
                                    scale=.07, font=self.font_digital)

        return task.cont
Пример #34
0
class World(DirectObject):

    rotateSpeed = 180

    moveSpeed = 20

    def __init__(self):
        DirectObject.__init__(self)
        base.camera.hide()
        self.access = 0

        self.av = None

        self.ToonSpeedFactor = 1.25
        self.ToonForwardSpeed = 16.0 * self.ToonSpeedFactor
        self.ToonJumpForce = 24.0
        self.ToonReverseSpeed = 8.0 * self.ToonSpeedFactor
        self.ToonRotateSpeed = 80.0 * self.ToonSpeedFactor

        self.moveKeyList = [
            'arrow_left', 'arrow_right', 'arrow_up', 'arrow_down'
        ]

        self.moveKeys = {}
        for key in self.moveKeyList:
            self.moveKeys[key] = False
            self.accept(key, self.moveKeyStateChanged, extraArgs=[key, True])
            self.accept(key + '-up',
                        self.moveKeyStateChanged,
                        extraArgs=[key, False])

        tcpPort = base.config.GetInt('server-port', 4400)
        hostname = base.config.GetString('server-host', '127.0.0.1')
        self.url = URLSpec('http://%s:%s' % (hostname, tcpPort))

        self.cr = MyClientRepository()

        self.waitingText = OnscreenText(
            'Connecting to %s.\nPress ESC to cancel.' % (self.url),
            scale=0.1,
            fg=(1, 1, 1, 1),
            shadow=(0, 0, 0, 1))

        self.accept('escape', self.escape)

        base.disableMouse()

        base.cTrav = CollisionTraverser()

        self.cr.connect([self.url],
                        successCallback=self.connectSuccess,
                        failureCallback=self.connectFailure)

    def moveKeyStateChanged(self, key, newState):
        self.moveKeys[key] = newState

    def escape(self):
        sys.exit()

    def connectFailure(self, statusCode, statusString):
        self.waitingText.destroy()
        self.failureText = OnscreenText(
            'Failed to connect to %s: %s.\nPress ESC to quit.' %
            (self.url, statusString),
            scale=0.15,
            fg=(1, 0, 0, 1),
            shadow=(0, 0, 0, 1))

    def connectSuccess(self):
        self.waitingText.destroy()
        self.waitingText = OnscreenText('Waiting for server.',
                                        scale=0.1,
                                        fg=(1, 1, 1, 1),
                                        shadow=(0, 0, 0, 1))

        self.cr.setInterestZones([1])

        self.acceptOnce('gotTimeSync', self.syncReady)

    def syncReady(self):
        if self.cr.haveCreateAuthority():
            self.createReady()
        else:
            self.acceptOnce('createReady', self.createReady)

    def createReady(self):
        self.waitingText.destroy()

        self.av = self.cr.createDistributedObject(className='DistributedToon',
                                                  zoneId=2)
        self.av.setupLocalAvatar()

        self.offset = 3.2375
        base.camera.reparentTo(self.av)
        base.camera.setPos(0, -10.0 - self.offset, self.offset)
        base.camera.hide()

        self.av.startPosHprBroadcast()

    def changeAvZone(self, zoneId):
        if zoneId == 999 and self.access >= 100:
            self.cr.setObjectZone(self.av, zoneId)
        elif zoneId == 999 and self.access <= 100:
            print "Insufficient access"
        else:
            self.cr.setObjectZone(self.av, zoneId)
            strZoneId = str(zoneId)
            print "Went to room " + strZoneId + ""

    def moveAvatar(self, task):

        wallBitmask = BitMask32(1)
        floorBitmask = BitMask32(2)
        base.cTrav = CollisionTraverser()

        def getAirborneHeight():
            return offset + 0.025000000000000001

        walkControls = GravityWalker(legacyLifter=True)
        walkControls.setWallBitMask(wallBitmask)
        walkControls.setFloorBitMask(floorBitmask)
        walkControls.setWalkSpeed(self.ToonForwardSpeed, self.ToonJumpForce,
                                  self.ToonReverseSpeed, self.ToonRotateSpeed)
        walkControls.initializeCollisions(base.cTrav,
                                          self.model,
                                          floorOffset=0.025,
                                          reach=4.0)
        walkControls.setAirborneHeightFunc(getAirborneHeight)
        walkControls.enableAvatarControls()
        self.model.physControls = walkControls

        def setWatchKey(key, input, keyMapName):
            def watchKey(active=True):
                if active == True:
                    inputState.set(input, True)
                    keyMap[keyMapName] = 1
                else:
                    inputState.set(input, False)
                    keyMap[keyMapName] = 0

            base.accept(key, watchKey, [True])
            base.accept(key + '-up', watchKey, [False])

        keyMap = {
            'left': 0,
            'right': 0,
            'forward': 0,
            'backward': 0,
            'control': 0
        }

        setWatchKey('arrow_up', 'forward', 'forward')
        setWatchKey('control-arrow_up', 'forward', 'forward')
        setWatchKey('alt-arrow_up', 'forward', 'forward')
        setWatchKey('shift-arrow_up', 'forward', 'forward')
        setWatchKey('arrow_down', 'reverse', 'backward')
        setWatchKey('control-arrow_down', 'reverse', 'backward')
        setWatchKey('alt-arrow_down', 'reverse', 'backward')
        setWatchKey('shift-arrow_down', 'reverse', 'backward')
        setWatchKey('arrow_left', 'turnLeft', 'left')
        setWatchKey('control-arrow_left', 'turnLeft', 'left')
        setWatchKey('alt-arrow_left', 'turnLeft', 'left')
        setWatchKey('shift-arrow_left', 'turnLeft', 'left')
        setWatchKey('arrow_right', 'turnRight', 'right')
        setWatchKey('control-arrow_right', 'turnRight', 'right')
        setWatchKey('alt-arrow_right', 'turnRight', 'right')
        setWatchKey('shift-arrow_right', 'turnRight', 'right')
        setWatchKey('control', 'jump', 'control')

        self.movingNeutral, movingForward = (False, False)
        self.movingRotation, movingBackward = (False, False)
        self.movingJumping = False

        def setMovementAnimation(loopName, playRate=1.0):
            if 'jump' in loopName:
                self.movingJumping = True
                self.movingForward = False
                self.movingNeutral = False
                self.movingRotation = False
                self.movingBackward = False
            elif loopName == 'run':
                self.movingJumping = False
                self.movingForward = True
                self.movingNeutral = False
                self.movingRotation = False
                self.movingBackward = False
            elif loopName == 'walk':
                self.movingJumping = False
                self.movingForward = False
                self.movingNeutral = False
                if playRate == -1.0:
                    self.movingBackward = True
                    self.movingRotation = False
                else:
                    self.movingBackward = False
                    self.movingRotation = True
            elif loopName == 'neutral':
                self.movingJumping = False
                self.movingForward = False
                self.movingNeutral = True
                self.movingRotation = False
                self.movingBackward = False
            else:
                self.movingJumping = False
                self.movingForward = False
                self.movingNeutral = False
                self.movingRotation = False
                self.movingBackward = False
            ActorInterval(self.model, loopName, playRate=playRate).loop()

        def handleMovement(task):
            global movingNeutral, movingForward
            global movingRotation, movingBackward, movingJumping
            if keyMap['control'] == 1:
                if keyMap['forward'] or keyMap['backward'] or keyMap[
                        'left'] or keyMap['right']:
                    if self.movingJumping == False:
                        if self.model.physControls.isAirborne:
                            setMovementAnimation('running-jump-idle')
                        else:
                            if keyMap['forward']:
                                if self.movingForward == False:
                                    setMovementAnimation('run')
                            elif keyMap['backward']:
                                if self.movingBackward == False:
                                    setMovementAnimation('walk', playRate=-1.0)
                            elif keyMap['left'] or keyMap['right']:
                                if self.movingRotation == False:
                                    setMovementAnimation('walk')
                    else:
                        if not self.model.physControls.isAirborne:
                            if keyMap['forward']:
                                if self.movingForward == False:
                                    setMovementAnimation('run')
                            elif keyMap['backward']:
                                if self.movingBackward == False:
                                    setMovementAnimation('walk', playRate=-1.0)
                            elif keyMap['left'] or keyMap['right']:
                                if self.movingRotation == False:
                                    setMovementAnimation('walk')
                else:
                    if self.movingJumping == False:
                        if self.model.physControls.isAirborne:
                            setMovementAnimation('jump-idle')
                        else:
                            if self.movingNeutral == False:
                                setMovementAnimation('neutral')
                    else:
                        if not self.model.physControls.isAirborne:
                            if self.movingNeutral == False:
                                setMovementAnimation('neutral')
            elif keyMap['forward'] == 1:
                if self.movingForward == False:
                    if not self.model.physControls.isAirborne:
                        setMovementAnimation('run')
            elif keyMap['backward'] == 1:
                if self.movingBackward == False:
                    if not self.model.physControls.isAirborne:
                        setMovementAnimation('walk', playRate=-1.0)
            elif keyMap['left'] or keyMap['right']:
                if self.movingRotation == False:
                    if not self.model.physControls.isAirborne:
                        setMovementAnimation('walk')
            else:
                if not self.model.physControls.isAirborne:
                    if self.movingNeutral == False:
                        setMovementAnimation('neutral')
            return Task.cont

        base.taskMgr.add(handleMovement, 'controlManager')

        dt = globalClock.getDt()
Пример #35
0
class MyApp(ShowBase):
    def addTitle(self,text):
        return OnscreenText(text=text, style=1, fg=(1,1,1,1), pos=(0,-0.95), align=TextNode.ACenter, scale = .07)

    def makeStatusLabel(self, i):
        return OnscreenText(style=1, fg=(1,1,0,1), pos=(-1.3 + (i*0.8), -0.95 ), align=TextNode.ALeft, scale = .05, mayChange = 1)

    def __init__(self):
        #base = ShowBase()
        ShowBase.__init__(self)
        self.keyMap = {"left":0, "right":0, "forward":0, "cam-left":0, "cam-right":0}
        base.win.setClearColor(Vec4(0,0,0,1))
        self.texto1 = OnscreenText(text="Collect 8 balls and meet Sonic behind the building", style=1, fg=(1,1,1,1), pos=(0,-0.1), align=TextNode.ACenter, scale = .07)
        self.texto2 = OnscreenText(text="Eat bananas for energy and avoid green stones", style=1, fg=(1,1,1,1), pos=(0,-0.2), align=TextNode.ACenter, scale = .07)
        self.texto3 = OnscreenText(text="Arrow keys move the player", style=1, fg=(1,1,1,1), pos=(0,-0.3), align=TextNode.ACenter, scale = .07)
        self.texto4 = OnscreenText(text="a and s help you view the scene", style=1, fg=(1,1,1,1), pos=(0,-0.4), align=TextNode.ACenter, scale = .07)

        
        mySound = base.loader.loadSfx("models/Theme_song.ogg")
        mySound.setLoop(True)
        mySound.play()
		#mySound.setLoop(true)
        self.noOfbanana = self.makeStatusLabel(0)
        self.noOfBalls = self.makeStatusLabel(1)
        self.points = self.makeStatusLabel(2)
            
        self.environ = self.loader.loadModel("models/moonsurface.egg")
        self.environ.reparentTo(self.render)
        self.environ.setScale(0.25, 0.25, 0.25)
        self.environ.setPos(-8, 42, -3)
        self.environ1 = self.loader.loadModel("models/env")
        self.environ1.reparentTo(self.render)
        self.environ1.setScale(50,50,30)
        self.environ1.setPos(0, -170, -3)
        #self.environ1.setHpr(90,0,0)
		
        self.chair1=self.loader.loadModel("models/BeachChair")
        #self.chair1=self.reaparentTo(self.render)
        #self.setScale(1000)
        #self.setPos(25,-160,-3)
        #self.chair1.setHpr(90,0,0)
        self.house1 = self.loader.loadModel("models/houses/church")
        self.house1.reparentTo(self.render)
        self.house1.setScale(0.30)
        self.house1.setPos(25, -150, -3)
        self.house1.setHpr(90,0,0)
        self.house2 = self.loader.loadModel("models/houses/building")
        self.house2.reparentTo(self.render)
        self.house2.setScale(0.30)
        self.house2.setPos(18, -200, -3)
        self.house2.setHpr(180,0,0)
        self.house3 = self.loader.loadModel("models/houses/farmhouse")
        self.house3.reparentTo(self.render)
        self.house3.setScale(0.30)
        self.house3.setPos(20, -130, -3)
        self.house3.setHpr(90,0,0)
        self.house4 = self.loader.loadModel("models/houses/dojo")
        self.house4.reparentTo(self.render)
        self.house4.setScale(0.05)
        self.house4.setPos(5, -220, -3)
        self.house5 = self.loader.loadModel("models/houses/beachhouse2")
        self.house5.reparentTo(self.render)
        self.house5.setScale(0.30)
        self.house5.setPos(-10, -180, -3)
        self.house5.setHpr(-90,0,0)

        self.house6 = self.loader.loadModel("models/houses/gazebo")
        self.house6.reparentTo(self.render)
        self.house6.setScale(0.50)
        self.house6.setPos(-10, -200, -3)
        self.house7 = self.loader.loadModel("models/houses/building")
        self.house7.reparentTo(self.render)
        self.house7.setScale(0.30)
        self.house7.setPos(-10, -120, -3)

        '''  for x in range(0,8):
            self.load4 = loader.loadModel("models/fence")
            self.load4.reparentTo(render)
            self.load4.setScale(.5, .5, 1.3)
            self.load4.setPos(28-x*7,0,1.8)
            cp = self.load4.attachNewNode(CollisionNode('box'))
            cp.node().addSolid(CollisionPolygon(
            Point3(-10.0,0.0,4),Point3(10,0,4),
            Point3(10,-1,-2),Point3(-10,-1,-2))) '''

        self.tunnel = [None for i in range(10)]
    
        for x in range(10):
          #Load a copy of the tunnel
          self.tunnel[x] = loader.loadModel('models/tunnel')
          self.tunnel[x].setHpr(0,90,0)
          self.tunnel[x].setScale(0.5)
          self.tunnel[x].setPos(0,177.5 + 25*x, 0)
          self.tunnel[x].reparentTo(self.render)
##        ###World specific-code
##    
##        #Create an instance of fog called 'distanceFog'.
##        #'distanceFog' is just a name for our fog, not a specific type of fog.
##        self.fog = Fog('distanceFog')
##        #Set the initial color of our fog to black.
##        self.fog.setColor(0, 0, 0)
##        #Set the density/falloff of the fog.  The range is 0-1.
##        #The higher the numer, the "bigger" the fog effect.
##        self.fog.setExpDensity(.08)
##        #We will set fog on render which means that everything in our scene will
##        #be affected by fog. Alternatively, you could only set fog on a specific
##        #object/node and only it and the nodes below it would be affected by
##        #the fog.
##        render.setFog(self.fog)
        self.banana = [None for i in range(20)]
        self.flag = [0 for i in range(20)]
        self.fla = [0 for i in range(5)]
        self.fl = [0 for i in range(8)]
        for x in range(10):
          #Load a copy of the tunnel
          self.banana[x] = loader.loadModel('models/banana/banana')
          #self.banana[x].setHpr(0,90,0)
          self.banana[x].setScale(0.7)
          if(x%2==0):
              self.banana[x].setPos(-1,180 + 25*x, -2)
          else:
              self.banana[x].setPos(1,177.5 + 25*x, -2)
          self.banana[x].reparentTo(self.render)

        self.banana[11] = self.loader.loadModel("models/banana/banana")
        self.banana[11].reparentTo(self.render)
        self.banana[11].setPos(12, 8, -2)
        self.banana[12] = self.loader.loadModel("models/banana/banana")
        self.banana[12].reparentTo(self.render)
        self.banana[12].setPos(0, 120, -2)
        self.banana[13] = self.loader.loadModel("models/banana/banana")
        self.banana[13].reparentTo(self.render)
        self.banana[13].setPos(12, 100, -2)
        self.banana[14] = self.loader.loadModel("models/banana/banana")
        self.banana[14].reparentTo(self.render)
        self.banana[14].setPos(22, 80, -2)
        self.banana[15] = self.loader.loadModel("models/banana/banana")
        self.banana[15].reparentTo(self.render)
        self.banana[15].setPos(12, 50, -2)
        self.banana[16] = self.loader.loadModel("models/banana/banana")
        self.banana[16].reparentTo(self.render)
        self.banana[16].setPos(15, 30, -2)
        self.banana[17] = self.loader.loadModel("models/banana/banana")
        self.banana[17].reparentTo(self.render)
        self.banana[17].setPos(-10, 8, -2)
        self.banana[18] = self.loader.loadModel("models/banana/banana")
        self.banana[18].reparentTo(self.render)
        self.banana[18].setPos(-20, -30, -2)
        self.banana[19] = self.loader.loadModel("models/banana/banana")
        self.banana[19].reparentTo(self.render)
        self.banana[19].setPos(-50, -50, -2)
        
        self.candy = self.loader.loadModel("models/candy/candycane2")
        self.candy.reparentTo(self.render)
        self.candy.setScale(0.001)
        self.candy.setPos(-6, 10, -2)

        self.fire = self.loader.loadModel("models/candy/candycane2")
        self.fire.reparentTo(self.render)
        self.fire.setScale(0.001)
        self.fire.setPos(0, 2, -2)

        self.ball = [None for i in range(8)]
        self.ball[0] = self.loader.loadModel("models/ball/soccerball")
        self.ball[0].reparentTo(self.render)
        self.ball[0].setPos(-6, 6, -2)
        self.ball[0].setScale(0.7)
        self.ball[1] = self.loader.loadModel("models/ball/soccerball")
        self.ball[1].reparentTo(self.render)
        self.ball[1].setPos(-6, -6, -2)
        self.ball[1].setScale(0.7)
        self.ball[2] = self.loader.loadModel("models/ball/soccerball")
        self.ball[2].reparentTo(self.render)
        self.ball[2].setPos(-15, 10, -2)
        self.ball[2].setScale(0.7)
        self.ball[3] = self.loader.loadModel("models/ball/soccerball")
        self.ball[3].reparentTo(self.render)
        self.ball[3].setPos(-19, 0, -2)
        self.ball[3].setScale(0.7)
        self.ball[4] = self.loader.loadModel("models/ball/soccerball")
        self.ball[4].reparentTo(self.render)
        self.ball[4].setPos(-6, -20, -2)
        self.ball[4].setScale(0.7)
        self.ball[5] = self.loader.loadModel("models/ball/soccerball")
        self.ball[5].reparentTo(self.render)
        self.ball[5].setPos(6, 6, -2)
        self.ball[5].setScale(0.7)
        self.ball[6] = self.loader.loadModel("models/ball/soccerball")
        self.ball[6].reparentTo(self.render)
        self.ball[6].setPos(19, 10, -2)
        self.ball[6].setScale(0.7)
        self.ball[7] = self.loader.loadModel("models/ball/soccerball")
        self.ball[7].reparentTo(self.render)
        self.ball[7].setPos(-15, 12, -2)
        self.ball[7].setScale(0.7)

        self.rock = [None for i in range(8)]
        self.rock[0] = self.loader.loadModel("models/greencrystal")
        self.rock[0].reparentTo(self.render)
        self.rock[0].setPos(0,306, -4)
        self.rock[0].setScale(0.007)
        self.rock[0].setHpr(90,0,0)
        self.rock[1] = self.loader.loadModel("models/greencrystal")
        self.rock[1].reparentTo(self.render)
        self.rock[1].setPos(-2, 150, -3)
        self.rock[1].setScale(0.007)
        self.rock[1].setHpr(90,0,0)
        self.rock[2] = self.loader.loadModel("models/greencrystal")
        self.rock[2].reparentTo(self.render)
        self.rock[2].setPos(-10, 10, -3)
        self.rock[2].setScale(0.007)
        self.rock[2].setHpr(90,0,0)
        self.rock[3] = self.loader.loadModel("models/greencrystal")
        self.rock[3].reparentTo(self.render)
        self.rock[3].setPos(5, 0, -3)
        self.rock[3].setScale(0.007)
        self.rock[3].setHpr(90,0,0)
        self.rock[4] = self.loader.loadModel("models/greencrystal")
        self.rock[4].reparentTo(self.render)
        self.rock[4].setPos(-2, -120, -3)
        self.rock[4].setScale(0.007)
        self.rock[4].setHpr(90,0,0)

        self.tire = self.loader.loadModel("models/tire/tire")
        self.tire.reparentTo(self.render)
        self.tire.setScale(0.25, 0.25, 0.25)
        self.tire.setPos(-20, 3, -2)
        
        self.bunny1 = self.loader.loadModel("models/bunny")
        self.bunny1.reparentTo(self.render)
        self.bunny1.setScale(0.2)
        self.bunny1.setPos(15, -160, -3)
        self.bunny1.setHpr(-60,0,0)
        self.bunny2 = self.loader.loadModel("models/bunny")
        self.bunny2.reparentTo(self.render)
        self.bunny2.setScale(0.2)
        self.bunny2.setPos(15, -161, -3)
        self.bunny2.setHpr(-145,0,0)
        # Add the spinCameraTask procedure to the task manager.
        #self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")
 
 
        
        # Load and transform the panda actor.
        self.pandaActor = Actor("models/panda-model",
                                {"walk": "models/panda-walk4"})
        self.pandaActor.setScale(0.005, 0.005, 0.005)
        #self.pandaActor.setPos(0,100,-3)
        self.pandaActor.reparentTo(self.render)
        # Loop its animation.
        self.pandaActor.loop("walk")
 
        # Create the four lerp intervals needed for the panda to
        # walk back and forth.
        pandaPosInterval1 = self.pandaActor.posInterval(20,
                                                        Point3(0, -110, -3),
                                                        startPos=Point3(0, -90, -3))
        pandaPosInterval2 = self.pandaActor.posInterval(20,
                                                        Point3(0, -90, -3),
                                                        startPos=Point3(0, -110, -3))
        pandaHprInterval1 = self.pandaActor.hprInterval(3,
                                                        Point3(180, 0, 0),
                                                        startHpr=Point3(0, 0, 0))
        pandaHprInterval2 = self.pandaActor.hprInterval(3,
                                                        Point3(0, 0, 0),
                                                        startHpr=Point3(180, 0, 0))
 
        # Create and play the sequence that coordinates the intervals.
        self.pandaPace = Sequence(pandaPosInterval1,
                                  pandaHprInterval1,
                                  pandaPosInterval2,
                                  pandaHprInterval2,
                                  name="pandaPace")
        self.pandaPace.loop()
        self.eve = Actor("models/eve",
                                {"walk": "models/eve-walk"})
        self.eve.setScale(0.5, 0.5, 0.5)
        self.eve.setPos(-1,-140,-3)
        self.eve.reparentTo(self.render)
        # Loop its animation.
        self.eve.loop("walk")
 
        # Create the four lerp intervals needed for the panda to
        # walk back and forth.
        evePosInterval1 = self.eve.posInterval(20,
                                                        Point3(-1, -160, -3),
                                                        startPos=Point3(-1, -140, -3))
        evePosInterval2 = self.eve.posInterval(20,
                                                        Point3(-1, -140, -3),
                                                        startPos=Point3(-1, -160, -3))
        eveHprInterval1 = self.eve.hprInterval(3,
                                                        Point3(180, 0, 0),
                                                        startHpr=Point3(0, 0, 0))
        eveHprInterval2 = self.eve.hprInterval(3,
                                                        Point3(0, 0, 0),
                                                        startHpr=Point3(180, 0, 0))
 
        # Create and play the sequence that coordinates the intervals.
        self.evePace = Sequence(evePosInterval1,eveHprInterval1,evePosInterval2,eveHprInterval2,name="evePace")
        self.evePace.loop()
        self.ralph = Actor("models/r/ralph",
                                {"run":"models/ralph-run",
                                 "walk": "models/ralph-walk"})
        self.ralph.setScale(0.5, 0.5, 0.5)
        self.ralph.setPos(0, 420, -3)
        self.ralph.reparentTo(self.render)
        self.boy = Actor("models/soni/sonic",
                                {"anim":"models/soni/sonic-win"})
        self.boy.setScale(0.05, 0.05, 0.05)
        self.boy.setPos(33, -203, -2)
        self.boy.setHpr(-90,0,0)
        self.boy.reparentTo(self.render)
        self.boy.loop("anim")

        self.boy1 = Actor("models/boy/boymodel",
                                {"anim":"models/boy/boyanimation"})
        self.boy1.setScale(0.007)
        self.boy1.setPos(-5, -200, -2)
        self.boy1.setHpr(180,0,0)
        self.boy1.reparentTo(self.render)
        self.boy1.loop("anim")

        self.character=Actor()
        self.character.loadModel('models/dancer')
        self.character.setPos(3,150,-3)
        self.character.reparentTo(render)
        self.character.setHpr(180,0,0)
        self.character.setScale(0.6)
        self.character.loadAnims({'win':'models/dancer'})
        self.character.loop('win')

        self.character1=Actor()
        self.character1.loadModel('models/gorillawalking')
        self.character1.setPos(2,-13,-3)
        self.character1.setScale(0.6)
        self.character1.reparentTo(render)
        self.character1.setHpr(180,0,0)
        self.character1.loadAnims({'win':'models/gorillawalking'})
        self.character1.loop('win')
        
        self.accept("escape", sys.exit)
        self.accept("arrow_left", self.setKey, ["left",1])
        self.accept("arrow_right", self.setKey, ["right",1])
        self.accept("arrow_up", self.setKey, ["forward",1])
        self.accept("a", self.setKey, ["cam-left",1])
        self.accept("s", self.setKey, ["cam-right",1])
        self.accept("arrow_left-up", self.setKey, ["left",0])
        self.accept("arrow_right-up", self.setKey, ["right",0])
        self.accept("arrow_up-up", self.setKey, ["forward",0])
        self.accept("a-up", self.setKey, ["cam-left",0])
        self.accept("s-up", self.setKey, ["cam-right",0])

        taskMgr.add(self.move,"moveTask")
        taskMgr.add(self.find,"fisdTask")
        taskMgr.add(self.potask,"potaskTask")
        # Game state variables
        self.isMoving = False

        # Set up the camera
        
        base.disableMouse()
        base.camera.setPos(self.ralph.getX(),self.ralph.getY()+10,-1)
        #print self.ralph.getX(), self.ralph.getY()

        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))
        self.updateStatusLabel()
		
        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.camGroundRay = CollisionRay()
        self.camGroundRay.setOrigin(0,0,1000)
        self.camGroundRay.setDirection(0,0,-1)
        self.camGroundCol = CollisionNode('camRay')
        self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.camGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.camGroundColNp = base.camera.attachNewNode(self.camGroundCol)
        self.camGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)
        
    def potask(self,task):
        global points
        if(self.ralph.getY()<410):
            self.texto1.destroy()
            self.texto2.destroy()
            self.texto3.destroy()
            self.texto4.destroy()
        if(points<0):
            OnscreenText(text="Game Over", style=1, fg=(1,1,1,1), pos=(0,0), align=TextNode.ACenter, scale = 0.4)
            OnscreenText(text="You are out of energy", style=1, fg=(1,1,1,1), pos=(0,-0.20), align=TextNode.ACenter, scale = 0.05)
        return Task.cont
        
        
    def find(self,task):
        global nob, points, noba
        #print self.ralph.getX(),self.ralph.getY()
        if ((self.ralph.getX()>=-3 and self.ralph.getX()<=-1) and (self.ralph.getY()>=145 and self.ralph.getY()<=165) and self.fla[1] == 0):
            self.rock[1].removeNode()
            points= points - 20
            self.fla[1]=1
        elif((self.ralph.getX()>=-11 and self.ralph.getX()<=-9) and (self.ralph.getY()>=9 and self.ralph.getY()<=11) and self.fla[2] == 0):
            self.rock[2].removeNode()
            points= points - 20
            self.fla[2]=1
        elif((self.ralph.getX()>=4 and self.ralph.getX()<=6) and (self.ralph.getY()>=-1 and self.ralph.getY()<=1) and self.fla[3] == 0):
            self.rock[3].removeNode()
            points= points - 20
            self.fla[3]=1
        elif((self.ralph.getX()>=-1 and self.ralph.getX()<=1) and (self.ralph.getY()>=305 and self.ralph.getY()<=307) and self.fla[0] == 0):
            self.rock[0].removeNode()
            points= points - 20
            self.fla[0]=1
        elif((self.ralph.getX()>=-3 and self.ralph.getX()<=-1) and (self.ralph.getY()>=-121 and self.ralph.getY()<=-119) and self.fla[4] == 0):
            self.rock[4].removeNode()
            points= points - 20
            self.fla[4]=1

            
        if ((self.ralph.getX()>=-7.5 and self.ralph.getX()<=-6.5) and (self.ralph.getY()>=-7.5 and self.ralph.getY()<=-6.5) and self.fl[1] == 0):
            self.ball[1].removeNode()
            noba= noba + 1
            self.fl[1]=1
        elif((self.ralph.getX()>=-15.5 and self.ralph.getX()<=-14.5) and (self.ralph.getY()>=9.5 and self.ralph.getY()<=10.5) and self.fl[2] == 0):
            self.ball[2].removeNode()
            noba= noba + 1
            self.fl[2]=1
        elif((self.ralph.getX()>=-19.5 and self.ralph.getX()<=-18.5) and (self.ralph.getY()>=-0.5 and self.ralph.getY()<=0.5) and self.fl[3] == 0):
            self.ball[3].removeNode()
            noba= noba + 1
            self.fl[3]=1
        elif((self.ralph.getX()>=-6.5 and self.ralph.getX()<=-5.5) and (self.ralph.getY()>=5.5 and self.ralph.getY()<=6.5) and self.fl[0] == 0):
            self.ball[0].removeNode()
            noba= noba + 1
            self.fl[0]=1
        elif((self.ralph.getX()>=-6.5 and self.ralph.getX()<=-5.5) and (self.ralph.getY()>=-20.5 and self.ralph.getY()<=-19.5) and self.fl[4] == 0):
            self.ball[4].removeNode()
            noba= noba + 1
            self.fl[4]=1
        elif((self.ralph.getX()>=5.5 and self.ralph.getX()<=6.5) and (self.ralph.getY()>=5.5 and self.ralph.getY()<=6.5) and self.fl[5] == 0):
            self.ball[5].removeNode()
            noba= noba + 1
            self.fl[5]=1
        elif((self.ralph.getX()>=18.5 and self.ralph.getX()<=19.5) and (self.ralph.getY()>=9.5 and self.ralph.getY()<=10.5) and self.fl[6] == 0):
            self.ball[6].removeNode()
            noba= noba + 1
            self.fl[6]=1
        elif((self.ralph.getX()>=-15.5 and self.ralph.getX()<=-14.5) and (self.ralph.getY()>=11.5 and self.ralph.getY()<=12.5) and self.fl[7] == 0):
            self.ball[7].removeNode()
            noba= noba + 1
            self.fl[7]=1
        

        if ((self.ralph.getX()>=11.5 and self.ralph.getX()<=12.5) and (self.ralph.getY()>=7.5 and self.ralph.getY()<=8.5) and self.flag[11]==0):
            self.banana[11].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[11]=1
        elif ((self.ralph.getX()>=0.5 and self.ralph.getX()<=1.5) and (self.ralph.getY()>=404.5 and self.ralph.getY()<=405.5) and self.flag[9]==0):
            self.banana[9].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[9]=1
        elif ((self.ralph.getX()>=0.5 and self.ralph.getX()<=1.5) and (self.ralph.getY()>=354.5 and self.ralph.getY()<=355.5) and self.flag[7]==0):
            self.banana[7].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[7]=1
        elif ((self.ralph.getX()>=0.5 and self.ralph.getX()<=1.5) and (self.ralph.getY()>=304.5 and self.ralph.getY()<=305.5) and self.flag[5]==0):
            self.banana[5].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[5]=1
        elif ((self.ralph.getX()>=0.5 and self.ralph.getX()<=1.5) and (self.ralph.getY()>=254.5 and self.ralph.getY()<=255.5) and self.flag[3]==0):
            self.banana[3].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[3]=1
        elif ((self.ralph.getX()>=0.5 and self.ralph.getX()<=1.5) and (self.ralph.getY()>=204.5 and self.ralph.getY()<=205.5) and self.flag[1]==0):
            self.banana[1].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[1]=1
        elif ((self.ralph.getX()>=-1.5 and self.ralph.getX()<=-0.5) and (self.ralph.getY()>=379.5 and self.ralph.getY()<=380.5) and self.flag[8]==0):
            self.banana[8].removeNode()
            #print 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
            nob= nob + 1
            points= points + 10
            self.flag[8]=1
        elif ((self.ralph.getX()>=-1.5 and self.ralph.getX()<=-0.5) and (self.ralph.getY()>=329.5 and self.ralph.getY()<=330.5) and self.flag[6]==0):
            self.banana[6].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[6]=1
        elif ((self.ralph.getX()>=-1.5 and self.ralph.getX()<=-0.5) and (self.ralph.getY()>=279.5 and self.ralph.getY()<=280.5) and self.flag[4]==0):
            self.banana[4].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[4]=1
        elif ((self.ralph.getX()>=-1.5 and self.ralph.getX()<=-0.5) and (self.ralph.getY()>=229.5 and self.ralph.getY()<=230.5) and self.flag[2]==0):
            self.banana[2].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[2]=1
        elif ((self.ralph.getX()>=-1.5 and self.ralph.getX()<=-0.5) and (self.ralph.getY()>=179.5 and self.ralph.getY()<=180.5) and self.flag[0]==0):
            self.banana[0].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[0]=1
        elif ((self.ralph.getX()>=-0.5 and self.ralph.getX()<=0.5) and (self.ralph.getY()>=119.5 and self.ralph.getY()<=120.5) and self.flag[12]==0):
            self.banana[12].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[12]=1
        elif ((self.ralph.getX()>=11.5 and self.ralph.getX()<=12.5) and (self.ralph.getY()>=99.5 and self.ralph.getY()<=100.5) and self.flag[13]==0):
            self.banana[13].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[13]=1
        elif ((self.ralph.getX()>=21.5 and self.ralph.getX()<=22.5) and (self.ralph.getY()>=79.5 and self.ralph.getY()<=80.5) and self.flag[14]==0):
            self.banana[14].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[14]=1
        elif ((self.ralph.getX()>=11.5 and self.ralph.getX()<=12.5) and (self.ralph.getY()>=49.5 and self.ralph.getY()<=50.5) and self.flag[15]==0):
            self.banana[15].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[15]=1
        elif ((self.ralph.getX()>=14.5 and self.ralph.getX()<=15.5) and (self.ralph.getY()>=29.5 and self.ralph.getY()<=30.5) and self.flag[16]==0):
            self.banana[16].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[16]=1
        elif ((self.ralph.getX()>=-10.5 and self.ralph.getX()<=-9.5) and (self.ralph.getY()>=7.5 and self.ralph.getY()<=8.5) and self.flag[17]==0):
            self.banana[17].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[17]=1
        elif ((self.ralph.getX()>=-20.5 and self.ralph.getX()<=-19.5) and (self.ralph.getY()>=-30.5 and self.ralph.getY()<=-29.5) and self.flag[18]==0):
            self.banana[18].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[18]=1
        elif ((self.ralph.getX()>=-50.5 and self.ralph.getX()<=-49.5) and (self.ralph.getY()>=-50.5 and self.ralph.getY()<=-49.5) and self.flag[19]==0):
            self.banana[19].removeNode()
            nob= nob + 1
            points= points + 10
            self.flag[19]=1
        
        if(self.ralph.getX()>30 and self.ralph.getY()<-200 and noba <8):
            self.boy.loop("anim")
            #self.ralph.removeNode()
            OnscreenText(text="Game Over (n)-Sad!", style=1, fg=(1,1,1,1), pos=(0,0), align=TextNode.ACenter, scale = 0.4)
            OnscreenText(text="You've Failed this City! \nTask not Completed", style=1, fg=(1,1,1,1), pos=(0,-0.20), align=TextNode.ACenter, scale = 0.05)
            OnscreenText(text="This is a Akshay Arun Shubham Production!", style=1, fg=(1,1,1,1), pos=(0,-0.40), align=TextNode.ACenter, scale = 0.05)
        elif(self.ralph.getX()>30 and self.ralph.getY()<-200 and noba ==8):
            #self.ralph.removeNode()
            OnscreenText(text="Game Over", style=1, fg=(1,1,1,1), pos=(0,0), align=TextNode.ACenter, scale = 0.4)
            OnscreenText(text="Congratulations, Task Completed", style=1, fg=(1,1,1,1), pos=(0,-0.20), align=TextNode.ACenter, scale = 0.05)
            OnscreenText(text="This is a Akshay Arun Shubham Production!", style=1, fg=(1,1,1,1), pos=(0,-0.40), align=TextNode.ACenter, scale = 0.05)
        self.updateStatusLabel()  
        return Task.cont
         
 
    

    #Records the state of the arrow keys
    def setKey(self, key, value):
        self.keyMap[key] = value
    

    # Accepts arrow keys to move either the player or the menu cursor,
    # Also deals with grid checking and collision detection
    def move(self, task):
        
        if(self.ralph.getY()<160):
            
            
            # If the camera-left key is pressed, move camera left.
            # If the camera-right key is pressed, move camera right.
            base.camera.lookAt(self.ralph)
            if (self.keyMap["cam-left"]!=0):
                base.camera.setX(base.camera, -20 * globalClock.getDt())
            if (self.keyMap["cam-right"]!=0):
                base.camera.setX(base.camera, +20 * globalClock.getDt())

            # save ralph's initial position so that we can restore it,
            # in case he falls off the map or runs into something.

            startpos = self.ralph.getPos()

            # If a move-key is pressed, move ralph in the specified direction.

            if (self.keyMap["left"]!=0):
                self.ralph.setH(self.ralph.getH() + 300 * globalClock.getDt())
            if (self.keyMap["right"]!=0):
                self.ralph.setH(self.ralph.getH() - 300 * globalClock.getDt())
            if (self.keyMap["forward"]!=0):
                self.ralph.setY(self.ralph, -25 * globalClock.getDt())

            # If ralph is moving, loop the run animation.
            # If he is standing still, stop the animation.

            if (self.keyMap["forward"]!=0) or (self.keyMap["left"]!=0) or (self.keyMap["right"]!=0):
                if self.isMoving is False:
                    self.ralph.loop("run")
                    self.isMoving = True
            else:
                if self.isMoving:
                    self.ralph.stop()
                    self.ralph.pose("walk",5)
                    self.isMoving = False
        else:
            # If the camera-left key is pressed, move camera left.
            # If the camera-right key is pressed, move camera right.
            base.camera.lookAt(self.ralph)
            startpos = self.ralph.getPos()

            # If a move-key is pressed, move ralph in the specified direction.

            if ((self.keyMap["left"]!=0) and self.ralph.getX()<2.5):
                self.ralph.setH(self.ralph.getH() + 200 * globalClock.getDt())
            if ((self.keyMap["right"]!=0) and self.ralph.getX()>-2.5):
                self.ralph.setH(self.ralph.getH() - 200 * globalClock.getDt())
            if ((self.keyMap["forward"]!=0) and self.ralph.getX()>-3 and self.ralph.getX()<3):
                self.ralph.setY(self.ralph, -25 * globalClock.getDt())
            elif (self.ralph.getX()<-3):
                self.ralph.setX(-2.9)
            elif  (self.ralph.getX()>3):
                self.ralph.setX(2.9)

            # If ralph is moving, loop the run animation.
            # If he is standing still, stop the animation.

            if (self.keyMap["forward"]!=0) or (self.keyMap["left"]!=0) or (self.keyMap["right"]!=0):
                if self.isMoving is False:
                    self.ralph.loop("run")
                    self.isMoving = True
            else:
                if self.isMoving:
                    self.ralph.stop()
                    self.ralph.pose("walk",5)
                    self.isMoving = False


        camvec = self.ralph.getPos() - base.camera.getPos()
        camvec.setZ(0)
        camdist = camvec.length()
        camvec.normalize()
        if (camdist > 10.0):
            base.camera.setPos(base.camera.getPos() + camvec*(camdist-10))
            camdist = 10.0
        if (camdist < 5.0):
            base.camera.setPos(base.camera.getPos() - camvec*(5-camdist))
            camdist = 5.0

        return task.cont

    def updateStatusLabel( self ):
        global nob, points
        self.noOfbanana.setText("Bananas Taken: " + str(nob))
        self.points.setText("Energy Meter: " + str(points))
        self.noOfBalls.setText("Balls found: " + str(noba))
Пример #36
0
class World(DirectObject):

    def __init__(self):
        self.itemID = 0
        self.switchState = True
        self.iAktion = "E"
        self.altIPos = [0,0]
        self.switchCam = False
        self.kampf = Battle.Kampf()
        self.itemDa = False
        self.keyMap = {"left":0, "right":0, "forward":0, "cam-left":0, "cam-right":0}
        base.win.setClearColor(Vec4(0,0,0,1))

        self.environ = loader.loadModel("models/world")      
        self.environ.reparentTo(render)
        self.environ.setPos(0,0,0)

 
        self.spieler = Players.Player(Actor("models/box.x"))
        self.spieler.actor.reparentTo(render)
        spielerStartPos = (-107.575, 26.6066, -0.490075)
        self.spieler.actor.setPos(spielerStartPos)
        self.textObjectSpieler = OnscreenText(text = self.spieler.name+":  "+str(self.spieler.energie)+"/"+str(self.spieler.maxenergie)+" HP", pos = (-0.90, -0.98), scale = 0.07, fg = (1,0,0,1))        

        # Erstellt Gegner
        
        self.gegnerStartPos = ([(-39.1143569946,25.1781406403,-0.136657714844),
                                (-102.375793457,-30.6321983337,0.0),
                                (-56.927986145, -34.6329650879, -0.16748046875),
                                (-79.6673126221,30.8231620789,2.89721679688),
                                (-4.37648868561,30.5158863068,2.18450927734),
                                (22.6527004242,4.99837779999,3.11364746094),
                                (-23.8257598877,-7.87773084641,1.36920166016),
                                (-80.6140823364,19.5769443512,4.70764160156),
                                (-75.0773696899,-15.2991075516,6.24676513672)
                                ])
        
        gegnerPos = random.choice(self.gegnerStartPos)
        self.gegnerErstellen(gegnerPos)
        self.textObjectGegner = OnscreenText(text = str(self.gegner.name)+": "+str(self.gegner.energie)+"/"+str(self.gegner.maxenergie)+" HP", pos = (0.90, -0.98), scale = 0.07, fg = (1,0,0,1))
        
        self.floater = NodePath(PandaNode("floater"))
        self.floater.reparentTo(render)

        self.item = None
        
        # Handling der Usereingaben für Bewegung

        self.accept("escape", sys.exit)
        self.accept("arrow_left", self.setKey, ["left",1])
        self.accept("arrow_right", self.setKey, ["right",1])
        self.accept("arrow_up", self.setKey, ["forward",1])
        self.accept("a", self.setKey, ["cam-left",1])
        self.accept("s", self.setKey, ["cam-right",1])
        self.accept("i", self.setKey, ["inventar",1])
        self.accept("arrow_left-up", self.setKey, ["left",0])
        self.accept("arrow_right-up", self.setKey, ["right",0])
        self.accept("arrow_up-up", self.setKey, ["forward",0])
        self.accept("a-up", self.setKey, ["cam-left",0])
        self.accept("s-up", self.setKey, ["cam-right",0])

        self.accept("e", self.iAktionsHandler,["e"])
        self.accept("v", self.iAktionsHandler,["v"])
        self.accept("w", self.iAktionsHandler,["w"])
        
        taskMgr.add(self.move,"moveTask")
        taskMgr.add(self.erkenneKampf,"Kampferkennung")
        taskMgr.add(self.screentexts,"Screentexte")


        # Menü erstellen

        self.createMenu()
        
        # Kameraeinstellungen
        
        base.disableMouse()
        base.camera.setPos(self.spieler.actor.getX(),self.spieler.actor.getY()+10,2)
        
        self.collisionInit();
        
        self.setAI()
        
        # Licht
        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))

        # Hintergrund (Himmel)

        self.setupSkySphere()

    def iAktionsHandler(self,key):
        if key == "e":
            self.iAktion = "E"
        elif key == "w":
            self.iAktion = "W"
        elif key == "v":
            self.iAktion = "V"
            

    def collisionInit(self):
        # Kollisionserkennung, um auf dem Boden zu laufen. Der Collisionray
        # erkennt die Hoehe des Gelaendes und wenn ein Objekt da ist, wird 
        # die Bewegung als illegal gewertet.

        self.cTrav = CollisionTraverser()

        self.spielerGroundRay = CollisionRay()
        self.spielerGroundRay.setOrigin(0,0,1000)
        self.spielerGroundRay.setDirection(0,0,-1)
        self.spielerGroundCol = CollisionNode('spielerRay')
        self.spielerGroundCol.addSolid(self.spielerGroundRay)
        self.spielerGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.spielerGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.spielerGroundColNp = self.spieler.actor.attachNewNode(self.spielerGroundCol)
        self.spielerGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.spielerGroundColNp, self.spielerGroundHandler)

        self.camGroundRay = CollisionRay()
        self.camGroundRay.setOrigin(0,0,1000)
        self.camGroundRay.setDirection(0,0,-1)
        self.camGroundCol = CollisionNode('camRay')
        self.camGroundCol.addSolid(self.camGroundRay)
        self.camGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.camGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.camGroundColNp = base.camera.attachNewNode(self.camGroundCol)
        self.camGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.camGroundColNp, self.camGroundHandler)

        self.gegnerGroundRay = CollisionRay()
        self.gegnerGroundRay.setOrigin(0,0,1000)
        self.gegnerGroundRay.setDirection(0,0,-1)
        self.gegnerGroundCol = CollisionNode('gegnerRay')
        self.gegnerGroundCol.addSolid(self.gegnerGroundRay)
        self.gegnerGroundCol.setFromCollideMask(BitMask32.bit(0))
        self.gegnerGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.gegnerGroundColNp = self.gegner.actor.attachNewNode(self.gegnerGroundCol)
        self.gegnerGroundHandler = CollisionHandlerQueue()
        self.cTrav.addCollider(self.gegnerGroundColNp, self.gegnerGroundHandler)


    def setupSkySphere(self):
        self.skysphere = loader.loadModel("models/LinearPinkSkySphere.bam")
        # Textur für den Himmel laden
        self.sky_tex = loader.loadTexture("Images/Sterne.jpg")
        # Himmel Textur konfigurieren
        self.skysphere.setTexture(self.sky_tex, 1)
	self.skysphere.setBin('background', 1) 
        self.skysphere.setDepthWrite(0) 
        self.skysphere.reparentTo(render)
        self.skysphere.setScale(40)
        taskMgr.add(self.skysphereTask, "SkySphere Task") 

    def skysphereTask(self, task): 
        self.skysphere.setPos(base.camera, 0, 0, 0) 
        return task.cont

    def createMenu(self):
        self.createFrame()
        itemListe = self.spieler.inventar.anzeigen(1)
        standardpos = [0.18, 0.98, 0.83]
        self.buttonListe = []
        beutelLabel = DirectLabel(text = itemListe[0][0], pos = (0.18, 0.98, 0.95), scale = 0.07, text_fg = (1,0,0,1), text_bg = (0, 50, 50, 1), textMayChange = 1)
        del itemListe [0][0]
        for zeile in range(4):
            for i in range(0,5):
                Button = DirectButton(text = itemListe [zeile] [i], pos = standardpos, scale = 0.07, text_fg = (1,0,0,1), text_bg = (0, 50, 50, 1), textMayChange = 1, extraArgs = [zeile,i], command = self.inventarAktion)
                self.buttonListe.append (Button)
                standardpos[0] += 0.25
            standardpos[0] = 0.18    
            standardpos[2] -= 0.15
            
    def createFrame(self):
        self.myFrame = DirectFrame(frameColor=(0, 50, 50, 0.5),
                      frameSize=(-1, 1, -.7, 1),
                      pos=(1, -1, 1))

    def inventarAktion(self,zeile,spalte):
        if self.iAktion == "E":
            self.spieler.inventar.entfernen(1,[zeile,spalte])
            self.myFrame.destroy()
            i = 0
            for item in self.buttonListe:
                    self.buttonListe [i].destroy()
                    i += 1
            del self.buttonListe[:]
            self.createMenu()  
        elif self.iAktion == "W":
            self.altIPos = [zeile,spalte]
        elif self.iAktion == "V":
            self.spieler.inventar.verschieben(1,1,self.altIPos,[zeile,spalte])
            self.myFrame.destroy()
            i = 0
            for item in self.buttonListe:
                    self.buttonListe [i].destroy()
                    i += 1
            del self.buttonListe[:]
            self.createMenu()        
        
        
    # Erkennt den Status der Eingabe
    def setKey(self, key, value):
        self.keyMap[key] = value

    def screentexts(self,task):
        self.textObjectSpieler.destroy()
        self.textObjectSpieler = OnscreenText(text = self.spieler.name+":  "+str(self.spieler.energie)+"/"+str(self.spieler.maxenergie)+" HP", pos = (-0.90, -0.98), scale = 0.07, fg = (1,0,0,1))
        self.textObjectGegner.destroy()
        if self.kampf.active == True:
            self.textObjectGegner = OnscreenText(text = str(self.gegner.name)+": "+str(self.gegner.energie)+"/"+str(self.gegner.maxenergie)+" HP", pos = (0.90, -0.98), scale = 0.07, fg = (1,0,0,1))
        else:
            self.textObjectGegner = OnscreenText(text = "Kein Gegner vorhanden", pos = (0.90, -0.98), scale = 0.07, fg = (1,0,0,1))
        return Task.cont

    def camera(self):
         # cam-left Key: Kamera nach links
        # cam-right Key: Kamera nach rechts
        base.camera.lookAt(self.spieler.actor)
        if (self.keyMap["cam-left"]!=0):
            base.camera.setX(base.camera, -20 * globalClock.getDt())
        if (self.keyMap["cam-right"]!=0):
            base.camera.setX(base.camera, +20 * globalClock.getDt())

        # Wenn die Kamera zu weit weg ist, zoom heran.
        # Wenn die Kamera zu nah dran ist, zoom weg.

        camvec = self.spieler.actor.getPos() - base.camera.getPos()
        camvec.setZ(0)
        camdist = camvec.length()
        camvec.normalize()
        if (camdist > 10.0):
            base.camera.setPos(base.camera.getPos() + camvec*(camdist-10))
            camdist = 10.0
        if (camdist < 5.0):
            base.camera.setPos(base.camera.getPos() - camvec*(5-camdist))
            camdist = 5.0

        # Haelt die Kamera einen Schritt über dem Boden
        # oder zwei Schritte ueber dem Spieler, je nachdem, was groesser ist.
        
        entries = []
        for i in range(self.camGroundHandler.getNumEntries()):
            entry = self.camGroundHandler.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"):
            base.camera.setZ(entries[0].getSurfacePoint(render).getZ()+1.0)
        if (base.camera.getZ() < self.spieler.actor.getZ() + 2.0):
            base.camera.setZ(self.spieler.actor.getZ() + 2.0)
            
        # Die Kamera soll in die Richtung des Spielers gucken, aber auch
        # immer horizontal bleiben.
        
        self.floater.setPos(self.spieler.actor.getPos())
        self.floater.setZ(self.spieler.actor.getZ() + 2.0)
        base.camera.lookAt(self.floater)

    def collisions(self,startpos):
        
        # Überprüfen auf Itemkollision
        
        if self.item <> None:
            if (self.item.actor.getX() - self.spieler.actor.getX() < 1
            and self.item.actor.getY() - self.spieler.actor.getY() < 1
            and self.item.actor.getZ() - self.spieler.actor.getZ() <1
            and self.itemDa == True):
                self.itemDa = False
                self.item.actor.detachNode()
                self.spieler.inventar.einfuegen(self.item)
                self.myFrame.destroy()
                del self.buttonListe[:]
                self.createMenu()

         # Start der Kollisionserkennung

        self.cTrav.traverse(render)


        # Aendert die Z Koordinate des Spielers. Wenn er etwas trifft, bewegt
        # ihn entsprechend, wenn er nichts trifft, setzt die Koordinate 
        # auf den Stand des letzten Frames
        self.dummyMethode(self.spielerGroundHandler, self.spieler.actor,startpos)

    
    def move(self,task):

        self.camera();
        
        # Speichert die Startposition, damit der Spieler zurueckgesetzt
        # werden kann, sollte er irgendwo runterfallen

        startpos = self.spieler.actor.getPos()

        # Wenn einer der Move Keys gedrueckt wird, wird der Spieler
        # in die ensprechende Richtung bewegt

        if (self.keyMap["left"]!=0):
            self.spieler.actor.setH(self.spieler.actor.getH() + 150 * globalClock.getDt())
        if (self.keyMap["right"]!=0):
            self.spieler.actor.setH(self.spieler.actor.getH() - 150 * globalClock.getDt())
        if (self.keyMap["forward"]!=0):
            self.spieler.actor.setY(self.spieler.actor, -12 * globalClock.getDt())

        self.collisions(startpos);

        return Task.cont

    def gegnermove(self):
 
        # Zeit seit dem letzten Frame. Benötigt fuer
        # framerateunabhaengige Bewegung.
        elapsed = globalClock.getDt()

        startpos = self.gegner.actor.getPos()
 
        # Aendert die Z Koordinate des Gegners. Wenn er etwas trifft, bewegt
        # ihn entsprechend, wenn er nichts trifft, setzt die Koordinate 
        # auf den Stand des letzten Frames
 
        self.cTrav.traverse(render)
        self.dummyMethode(self.gegnerGroundHandler, self.gegner.actor,startpos)
 
        self.gegner.actor.setP(0)
        if self.gegner.energie == 0:
            return Task.done
        else:
            return Task.cont

    def dummyMethode(self, handler, actor,startpos):
        entries = []
        for i in range(handler.getNumEntries()):
            entry = handler.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"):
            actor.setZ(entries[0].getSurfacePoint(render).getZ())
        else:
            actor.setPos(startpos)
	
	
	
    def setAI(self):
        # Erstellt die AI World
        self.AIworld = AIWorld(render)
 
        self.AIchar = AICharacter("gegner",self.gegner.actor, 100, 0.02, 1)
        self.AIworld.addAiChar(self.AIchar)
        self.AIbehaviors = self.AIchar.getAiBehaviors()
 
        self.AIbehaviors.wander(360, 0, 15, 1.0)
 
        #AI World update zum Tasknamager hinzufügen       
        taskMgr.add(self.AIUpdate,"AIUpdate")
 
 
    # Update der AI World   
    def AIUpdate(self,task):
        if self.kampf.active == False:
            self.AIworld.update()
            self.gegnermove()
 
        return Task.cont

    # Startet bei einem Abstand von 4 zwischen Spieler und Gegner einen Kampf
    def erkenneKampf(self,task):
        if (self.spieler.actor.getX() - self.gegner.actor.getX() < 4
        and self.spieler.actor.getX() - self.gegner.actor.getX() > -4
        and self.kampf.active == False):
            self.kampf.active = True
            self.startzeit = globalClock.getLongTime()
        if self.kampf.active == True:
            self.Kampf(self)
        if self.gegner.energie == 0:
            return Task.done
        else:
            return Task.cont

    def gegnerErstellen(self,pos):
        self.gegner = Monster.Goblin(Actor("models/box.x"))
        self.gegner.actor.reparentTo(render)
        self.gegner.actor.setPos(pos)
        self.gegnerAltPos = pos
        self.setAI()

    def gegnerTod(self):
        self.kampf.active = False
        itemPos = self.gegner.actor.getPos()
        self.gegner.actor.detachNode()
        self.item = Items.Axt()
        self.item.ID = self.itemID
        self.itemID += 1
        self.itemDa = True
        self.item.actor.setScale(0.3)
        self.item.actor.reparentTo(render)
        self.item.actor.setPos(itemPos)
        gegnerNeuPos = random.choice(self.gegnerStartPos)
        while gegnerNeuPos == self.gegnerAltPos:
            gegnerNeuPos = random.choice(self.gegnerStartPos)
        self.gegnerErstellen(gegnerNeuPos)

    # Lässt Spieler und Gegner nach bestimmter Zeit Aktionen ausführen. Bei Tod des
    # Gegners wird ein neuer Gegner sowie ein Item generiert
    def Kampf(self,task):
        if ((int(globalClock.getLongTime()) - int(self.startzeit)) % 5 == 0
        and self.kampf.active == True):
            erg = self.kampf.Kampf(self.spieler,self.gegner)
            self.spieler = erg[0]
            self.gegner = erg[1]
            self.startzeit -= 1
            if self.spieler.energie == 0:
                sys.exit
            elif self.gegner.energie == 0:
                self.gegnerTod();
        if self.startzeit <= 0:
            self.startzeit = globalClock.getLongTime()
Пример #37
0
class Keyboard(object):
    def __init__(self, state=None, *a, **k):
        super(Keyboard, self).__init__(*a, **k)
        if state:
            self.state = state
        self.active = False
        self.cfg = GlobalConf().path('game.player0.keys')

        self.keys_txt = {
            'on_move_forward': (1, "Forward"),
            'on_move_backward': (2, "Backward"),
            'on_strafe_left': (3, "Strafe left"),
            'on_strafe_right': (4, "Strafe right"),
            'on_steer_left': (5, "Steer left"),
            'on_steer_right': (6, "Steer right"),
            'on_throw_weapon': (7, "Throw weapon"),
            'on_place_stick': (8, "Place stick"),
            'on_feed': (9, "Feed"),
            'on_jump': (10, "Jump"),
            'on_run': (11, "Run"),
            'on_hit': (12, "Hit")
        }

    def get_key_name(self, event):
        if event is None or event == 'no-event':
            return "?"
        else:
            return event[6:]

    def do_paint(self):
        tx_scale = (0.6, 0.6)
        init = -0.15
        dif = -0.06

        self.keys_btn = {}
        self.keys_lab = {}

        for func, (i, bt_text) in self.keys_txt.iteritems():
            self.keys_btn[func] = DirectButton(
                text=bt_text,
                text_font=self.state.font,
                text_scale=tx_scale,
                text_align=TextNode.ARight,
                scale=.1,
                pos=(0.3, 0, init + dif * i),
                relief=None,
                command=lambda func=func: self.det_key(func))
            self.keys_lab[func] = OnscreenText(text=self.get_key_name(
                self.cfg.child(func).value),
                                               font=self.state.font,
                                               align=TextNode.ALeft,
                                               pos=(0.7, init + dif * i),
                                               scale=0.07)
            self.cfg.child(func).on_conf_change += (self.on_key_change)

        self.info_txt = OnscreenText(text='Select action',
                                     font=self.state.font,
                                     pos=(0.4, init + dif * 13 - 0.02),
                                     scale=0.04)
        self.active = True

    def do_enable(self):
        if self.active:
            for n in self.keys_btn.itervalues():
                n.setProp('state', DGG.NORMAL)

    def do_disable(self):
        if self.active:
            for n in self.keys_btn.itervalues():
                n.setProp('state', DGG.DISABLED)

    def do_destroy(self):
        for n in self.keys_btn.itervalues():
            n.destroy()
        for n in self.keys_lab.itervalues():
            n.destroy()
        self.info_txt.destroy()
        self.active = False
        self.on_key_change.disconnect_sources()

    def det_key(self, key):
        # Deactivate all buttons
        self.state.do_disable()
        self.keys_lab[key].setText('?')
        self.info_txt.setText('Click any key to config')
        self.slot = self.state.events.on_any_event.connect(
            lambda ev, *a, **k: self.get_key(ev, key))

    def get_key(self, ev, key):
        if is_key_event(ev):
            self.state.do_enable()
            self.state.events.on_any_event -= self.slot
            for c in self.cfg.childs():
                if c.value == ev:
                    c.set_value('no-event')
            self.cfg.child(key).set_value(ev)

    @slot
    def on_key_change(self, cfg):
        if self.keys_lab[cfg.name]:
            self.keys_lab[cfg.name].setText(self.get_key_name(cfg.value))
            self.info_txt.setText('Select button')
Пример #38
0
class PhilosophicalDiners(ShowBase):

    def __init__(self):
        ShowBase.__init__(self)

        #
        self.wp = WindowProperties()
        self.wp.setSize(1280, 720)
        base.win.requestProperties(self.wp)
        self.fork_height = 2.3
        self.frame_time = 0.0
        self.textObject = OnscreenText(text='',
                                       pos=(-1.0, 0.9), scale = 0.10, fg=(255, 255, 255, 200))

        # create sockets, get h constants
        self.p_constants = get_constants()
        self.context, self.socket = self._create_socket_context()

        # Load textures
        self.bowl_tex = self.loader.loadTexture(
            ASSETS_DIR + "marble.jpg")
        self.wood_tex = self.loader.loadTexture(
            ASSETS_DIR + "derevo_mebel.jpg")
        self.chair_tex = self.loader.loadTexture(
            ASSETS_DIR + "02_1.bmp")
        self.black_tex = self.loader.loadTexture(ASSETS_DIR + "black.png")

        # Load models
        # Load environment (really just a plane)
        self.environ = self._load_model(
            "house", scale=[25, 25, 25], pos=[0, 0, -10])
        # Load the "table"
        self.table = self._load_model(
            "round_table", scale=[27, 27, 14], pos=[0, 0, 0])
        # Load and place forks, chairs
        self._load_forks()
        self._load_chairs()
        self._load_bowls()

        # Apply textures to models
        self.environ.setTexture(self.black_tex)
        self.table.setTexture(self.wood_tex)
        self.table.setTexScale(
            TextureStage.getDefault(), 0.005, 0.005)

        # Start sim
        self.rnum = 0
        self.philos = subprocess.Popen("./philos", shell=True)

        # Tasks
        self.taskMgr.add(self.spin_camera, "spin_camera")
        self.taskMgr.add(self._comm, "comm")

    def _comm(self, task):
        """Communicate with sim

        This is a blocking function
        """
        if task.time - self.frame_time > 0.35:
            self.socket.send("Hello")  # Send generic request
            # Get message, if wait longer than timeout, quit
            try:
                message = self.socket.recv()
            except zmq.error.Again:
                for fork in self.forks:
                    fork.setZ(self.fork_height)
                raw_input(
                    "Looks like everyone is done! Press enter to exit . . .")
                exit(0)

            if self.p_constants["VERBOSE"]:
                print "Received reply ", self.rnum, "[", message, "]"
            self._anim_fork(int(message[0]), int(message[2]))
            self._anim_bowl(int(message[1]), int(message[2]))

            self.rnum += 1
            self.frame_time = task.time

        return Task.cont

    def _anim_bowl(self, bowl_num, fork_pos):

        bowl_num = (bowl_num + 1) % self.p_constants["NPHILOSOPHERS"]

        self.textObject.destroy()
        ost = "\n".join(["{} has eaten {} meals".format(
            n, self.bowls[n]["meals"]) for n in xrange(self.p_constants["NPHILOSOPHERS"])])
        self.textObject = OnscreenText(text=ost,
                                       pos=(-1.26, 0.9), scale=0.08, fg=(130, 130, 130, 125))

        if fork_pos:
            self.bowls[bowl_num]["num_up"] += 1
        else:
            self.bowls[bowl_num]["num_up"] -= 1

        if self.bowls[bowl_num]["num_up"] == 2:
            self.bowls[bowl_num]["meals"] += 1
            self.bowls[bowl_num]["bowl"].setPos(*self.bowls[bowl_num]["pos"])
        else:
            self.bowls[bowl_num]["bowl"].setPos(*[100, 100, 100])

    def _anim_fork(self, fork_num, fork_pos):
        curr_Z = self.forks[fork_num].getZ()
        self.forks[fork_num].setZ(curr_Z + 1 if fork_pos else curr_Z - 1)

    def _load_model(self, name, **kwargs):
        """Load name.egg as name as name in self.models

        Also sets scale, pos, and/or hpr as per kwargs
        """
        model = self.loader.loadModel(ASSETS_DIR + name)
        model.reparentTo(self.render)
        if kwargs.get("scale"):
            assert len(kwargs.get("scale")) == 3
            assert isinstance(kwargs.get("scale"), list)
            model.setScale(*kwargs.get("scale"))
        if kwargs.get("pos"):
            assert len(kwargs.get("pos")) == 3
            assert isinstance(kwargs.get("pos"), list)
            model.setPos(*kwargs.get("pos"))
        if kwargs.get("hpr"):
            assert len(kwargs.get("hpr")) == 3
            assert isinstance(kwargs.get("hpr"), list)
            model.setHpr(*kwargs.get("hpr"))
        if kwargs.get("H"):
            assert isinstance(kwargs.get("H"), float)
            model.setH(model, kwargs.get("H"))

        return model

    def _load_forks(self):
        """Load and place forks"""
        self.forks = self.p_constants["NPHILOSOPHERS"] * [0]
        for i in xrange(self.p_constants["NPHILOSOPHERS"]):
            x, y, angle = self._get_fork_coord(i)
            self.forks[i] = self._load_model(
                "fork", scale=[3, 3, 3], pos=[x, y, self.fork_height], H=rad2deg(angle) + 90)

    def _load_chairs(self):
        """Load and place chairs"""
        self.chairs = self.p_constants["NPHILOSOPHERS"] * [0]
        for i in xrange(self.p_constants["NPHILOSOPHERS"]):
            x, y, angle = self._get_chair_coord(i, 5.0)
            self.chairs[i] = self._load_model(
                "chair1", scale=[7, 7, 7], pos=[x, y - 1, 0], H=rad2deg(angle) + 15)
            self.chairs[i].setTexture(self.chair_tex)
            self.chairs[i].setTexScale(
                TextureStage.getDefault(), 0.005, 0.005)

    def _load_bowls(self):
        """Load and place bowls"""
        self.bowls = [{} for x in xrange(self.p_constants["NPHILOSOPHERS"])]
        for i in xrange(self.p_constants["NPHILOSOPHERS"]):
            x, y, angle = self._get_chair_coord(i, 3.6)
            self.bowls[i]["bowl"] = self._load_model(
                "bowl", scale=[2, 2, 2], pos=[100, 100, 100], H=rad2deg(angle))
            self.bowls[i]["pos"] = [x, y - 1, self.fork_height]
            self.bowls[i]["num_up"] = 0
            self.bowls[i]["meals"] = 0
            self.bowls[i]["bowl"].setTexture(self.bowl_tex)
            self.bowls[i]["bowl"].setTexScale(
                TextureStage.getDefault(), 0.005, 0.005)

    def _get_chair_coord(self, num, diam):
        """Do mathemagics to get cartesian coordinates of a fork by its number
        on the table
        """
        circumf = pi * diam
        angle1 = num * 2 * pi / self.p_constants["NPHILOSOPHERS"]
        angle2 = (num + 1) * 2 * pi / self.p_constants["NPHILOSOPHERS"]
        ang_diff = angle1 - angle2
        angle = angle1 + ang_diff / 2
        return (circumf / 2 * cos(angle), circumf / 2 * sin(angle), angle)

    def _get_fork_coord(self, num):
        """Do mathemagics to get cartesian coordinates of a fork by its number
        on the table
        """
        circumf = pi * 3.6
        angle = num * 2 * pi / self.p_constants["NPHILOSOPHERS"]
        return (circumf / 2 * cos(angle), circumf / 2 * sin(angle), angle)

    def spin_camera(self, task):
        """Spin the camera around the table"""
        angleDegrees = 0  # task.time * 6.0
        angleRadians = angleDegrees * (pi / 180.0)
        self.camera.setPos(
            35 * sin(angleRadians) - 3.3, -27.5 * cos(angleRadians), 16)
        self.camera.setHpr(angleDegrees, -30, 0)
        return Task.cont

    def _create_socket_context(self):
        """Creates context, socket and returns them"""
        # Find upper bound on ACTIME from constants and set timeout to double
        # that
        timeout = int(2000 * self.p_constants["ACTIME_UPPER"])

        context = zmq.Context()  # Create Context
        socket = context.socket(zmq.REQ)  # Create socket
        # Connect to dining philosophers
        socket.connect(self.p_constants["SERV_ADDR"])
        socket.RCVTIMEO = timeout  # Set timeout

        return context, socket
Пример #39
0
class Screen (object):

    def __init__(self, state = None, *a, **k):
        super (Screen, self).__init__ (*a, **k)
        if state:
            self.state = state
        self.active = False
        self.cfg_p = GlobalConf().child ('panda')
        self.cfg_g = GlobalConf().child ('game')        
    
    def do_paint (self):
        # Get possible screen resolutions NOT AVAILABLE IN OSX
        # di = base.pipe.getDisplayInformation()
        # for index in range(di.getTotalDisplayModes()): 
        #    sizes += (  str(di.getDisplayModeWidth(index)), 
        #                str(di.getDisplayModeHeight(index))
        #            )         
        
        actual_full = self.cfg_p.child ('fullscreen').value
        actual_width = self.cfg_p.child ('width').value
        actual_height = self.cfg_p.child ('height').value
        self.active = True
        
        self.sizes = [  (640, 480),
                        (800, 600),
                        (1024, 768),
                        (1280, 800),
                        (1280, 1024),
                        (1440, 900)
                        ]

        self.sizes_tx = []
        for h, w in self.sizes:
            self.sizes_tx += [str (h)+"x"+str (w)]
        
        # Gets the position of the actual config from self.sizes
        init_item = self.sizes.index ((actual_width, actual_height))

        #
        # TO DO: add images to check buttos
        #
            
        # Create a frame
        tx_scale = (0.9, 0.9)
        self.res_txt = OnscreenText (text = "Resolution",
            font = self.state.font,
            align = TextNode.ALeft,
            pos = (-0.1, -0.4)
            )
        self.res_menu = DirectOptionMenu (text = "Resolution",
            highlightScale = tx_scale,
            text_font = self.state.font, 
            text_scale = tx_scale,
            item_text_font = self.state.font,
            item_text_scale = tx_scale,
            scale = 0.08,
            items = self.sizes_tx,
            initialitem = init_item,
            highlightColor = (0.65,0.65,0.65,1),
            command = self.change_res,
            pos = (0.5, 0, -0.4)
            )
        
        #checked = loader.loadModel ('menu/checked.egg')
        #unchecked = loader.loadModel ('menu/unchecked.egg')
        self.full_screen = DirectCheckButton (text = "Full screen",
            text_font = self.state.font,     
            text_scale = tx_scale,
            #text_pos = (0.5, 0, -0.7),
            text_align = TextNode.ALeft,
            indicatorValue = self.cfg_p.child ('fullscreen').value,
            scale = .08,
            relief = None,
            boxPlacement = 'right',
            boxRelief = None,
            #boxImage = (unchecked, checked , None),
            #boxImageScale = 0.15,
            command = self.change_full,
            pos = (-0.1, 0, -0.6)
            )
            
        self.fps_display = DirectCheckButton (text = "FPS display",
            text_font = self.state.font,     
            text_scale = tx_scale,
            text_align = TextNode.ALeft,
            indicatorValue = self.cfg_p.child ('frame-meter').value,
            scale = .08,
            relief = None,
            boxPlacement = 'right',
            boxRelief = None,
            command = self.change_fps,
            pos = (-0.1, 0, -0.75)
            )
            
        self.sha_display = DirectCheckButton (text = "Shaders",
            text_font = self.state.font,     
            text_scale = tx_scale,
            text_align = TextNode.ALeft,            
            indicatorValue = self.cfg_g.child ('shader').value,
            scale = .08,
            relief = None,
            boxPlacement = 'right',
            boxRelief = None,
            command = self.change_shad,
	    pos = (-0.1, 0, -0.9)
            )

    def do_enable (self):
        pass
        
    def do_disable (self):
        pass
        
    def do_destroy (self):
        self.res_txt.destroy ()
        self.res_menu.destroy ()
        self.fps_display.destroy ()
        self.full_screen.destroy ()
        self.sha_display.destroy ()
        self.active = False
        
    def change_shad (self, status):
        self.cfg_g.child ('shader').set_value (bool(status))
        
    def change_fps (self, status):
        self.cfg_p.child ('frame-meter').set_value (bool(status))
        
    def change_full (self, status):
        self.cfg_p.child ('fullscreen').set_value (bool(status))
        self.cfg_p.nudge ()
        
    def change_res (self, arg):
        i = self.sizes_tx.index(arg)
        self.cfg_p.child ('width').set_value (self.sizes[i][0])
        self.cfg_p.child ('height').set_value (self.sizes[i][1])
        self.cfg_p.nudge ()
Пример #40
0
class Debug(Tool):
    """Tool for debugging."""

    pressed: bool
    last_point: Point
    hud_text: OnscreenText
    card: NodePath
    text_dict: Dict[str, str]
    selected_agent: Optional[TrafficAgent]
    path_np: NodePath

    KEY = 'i'

    def prepare(self):
        """Initialize tool."""
        self.pressed = False
        self.last_point = None
        self.hud_text = OnscreenText(text='',
                                     pos=(5, -20),
                                     scale=22.0,
                                     fg=(1.0, 1.0, 1.0, 0.9),
                                     shadow=(0.0, 0.0, 0.0, 0.9),
                                     align=TextNode.A_left,
                                     font=p3d.ttf,
                                     parent=p3d.pixel2d,
                                     mayChange=True)
        self.card = None
        self.text_dict = {
            'position': None,
            'network_position': None,
            'distance': None,
            'agent': None
        }
        self.selected_agent = None
        self.path_np = None
        self._update_position()
        self._update_hud_text()

    def on_update(self):
        """Update callback called every frame."""
        if self.selected_agent is not None:
            self.text_dict['agent'] = \
                self.selected_agent.debug_str().replace('\n', '\n' + ' ' * 4)
            self._update_hud_text()

    def on_button1_press(self):
        """Button 1 pressed callback."""
        self.pressed = True
        self._update_selection(just_pressed=True)
        point = self.cursor.position

        if self.last_point is not None:
            distance = self.last_point.distance(point)
            self.text_dict['distance'] = f'{distance:.2f}'
        self.last_point = point

        self._update_hud_text()

    def on_button1_release(self):
        """Button 1 released callback."""
        self.pressed = False

    def on_button2_press(self):
        """Button 2 pressed callback."""
        self._clear_agent()
        self._update_selection(agents_only=True,
                               follow=False,
                               just_pressed=True,
                               show_path=False)
        if isinstance(self.selected_agent, Car):
            self.selected_agent.remove(INDEX.simulation.ready_buffer,
                                       INDEX.simulation.ready_buffer, False)
        self._clear_agent()

    def on_button3_press(self):
        """Button 3 pressed callback."""
        self._clear_selection()
        self._update_hud_text()

    def on_cursor_move(self):
        """Cursor moved callback."""
        if self.pressed:
            self._update_selection()
        self._update_position()
        self._update_hud_text()

    def cleanup(self):
        """Clean up before changing tool."""
        self.hud_text.destroy()
        self._clear_selection()

    def _update_selection(self,
                          *,
                          agents_only: bool = False,
                          follow: bool = True,
                          just_pressed: bool = False,
                          show_path: bool = True):
        agent_selected = False
        if just_pressed and self.cursor.pointed_at:
            id_ = int(self.cursor.pointed_at.parent.tags['id'])
            agent = INDEX.entities.get(id_, None)
            if agent is not None and hasattr(agent, 'debug_str'):
                self.selected_agent = agent
                agent_selected = True
                if show_path:
                    self._update_path_np()
                if follow:
                    p3d.messenger.send('follow', [agent])
        if agents_only:
            return

        selected = INDEX.get_at(self.cursor.position, of_type=Node)
        if selected and just_pressed:
            if not agent_selected:
                self._clear_intersection()
                self.card = create_lane_connections_card(
                    selected[0], p3d.render)
        else:
            selected = INDEX.get_at(self.cursor.position, of_type=Way)

        try:
            selected = selected[0]
        except IndexError:
            return

        self.text_dict['network_position'] = f'{selected} - {selected.xurl}'

        if isinstance(selected, Way):
            position = selected.way_position_raw(self.cursor.position)
            way_position, lane_index = position
            lane = selected.lanes[lane_index]

            try:
                lane_position = lane.way_to_lane_position(way_position)
            except ValueError:
                lane_position = 0.0

            oriented_position = (lane.lane_to_oriented_position(lane_position)
                                 if lane_position is not None else 0.0)

            stats = (INDEX.stats[OrientedWay].get(lane.oriented_way, None)
                     or EMPTY_STATS)

            self.text_dict['network_position'] += (
                f'\n    way_position={way_position:.2f}, '
                f'oriented_position={oriented_position:.2f},'
                f'\n    lane_position={lane_position:.2f}, '
                f'lane={lane_index}, '
                f'max_speed={mps_to_kph(selected.max_speed):.1f} kph'
                f'\n    average_speed_kph={stats.average_speed_kph}, '
                f'throughput_cars_per_minute='
                f'{stats.throughput_cars_per_minute}')

    def _clear_selection(self):
        """Clear all seleted objects."""
        self._clear_agent()
        self._clear_intersection()
        self.text_dict['network_position'] = None
        self.text_dict['distance'] = None

    def _clear_agent(self):
        """Clear current agent selection."""
        self.selected_agent = None
        self.text_dict['agent'] = None
        self._clear_path_np()

    def _clear_path_np(self):
        """Clear current path mesh and node path."""
        if self.path_np is not None:
            self.path_np.remove_node()
            self.path_np = None

    def _clear_intersection(self):
        """Clear current intersection selection."""
        if self.card is not None:
            self.card.get_texture().clear()
            self.card.remove_node()
            self.card = None

    def _update_position(self):
        self.text_dict['position'] = (f'{self.cursor.position.x:8.2f}, '
                                      f'{self.cursor.position.y:8.2f}')

    def _update_path_np(self):
        self._clear_path_np()
        try:
            path = self.selected_agent.path
            self.path_np = Factory.create_path(p3d.render, path)
        except AttributeError:
            pass

    def _update_hud_text(self):
        self.hud_text.text = '\n'.join(f"\n['{k}']: {v}"
                                       for k, v in self.text_dict.items()
                                       if v is not None)
Пример #41
0
class TeamActivityGui:
    COUNTDOWN_TASK_NAME = 'updateCountdownTask'
    timer = None
    statusText = None
    countdownText = None
    exitButton = None
    switchButton = None

    def __init__(self, activity):
        self.activity = activity

    def load(self):
        buttonModels = loader.loadModel('phase_3.5/models/gui/inventory_gui')
        upButton = buttonModels.find('**//InventoryButtonUp')
        downButton = buttonModels.find('**/InventoryButtonDown')
        rolloverButton = buttonModels.find('**/InventoryButtonRollover')
        self.exitButton = DirectButton(relief=None, text=TTLocalizer.PartyTeamActivityExitButton, text_fg=(1, 1, 0.65, 1), text_pos=(0, -0.15), text_scale=0.5, image=(upButton, downButton, rolloverButton), image_color=(1, 0, 0, 1), image_scale=(14.5, 1, 9), pos=(0, 0, 0.8), scale=0.15, command=self.handleExitButtonClick)
        self.exitButton.hide()
        if self.activity.toonsCanSwitchTeams():
            self.switchButton = DirectButton(relief=None, text=TTLocalizer.PartyTeamActivitySwitchTeamsButton, text_fg=(1, 1, 1, 1), text_pos=(0, 0.1), text_scale=0.5, image=(upButton, downButton, rolloverButton), image_color=(0, 1, 0, 1), image_scale=(15, 1, 15), pos=(0, 0, 0.5), scale=0.15, command=self.handleSwitchButtonClick)
            self.switchButton.hide()
        else:
            self.switchButton = None
        buttonModels.removeNode()
        self.countdownText = OnscreenText(text='', pos=(0.0, -0.2), scale=PartyGlobals.TeamActivityTextScale * 1.2, fg=(1.0, 1.0, 0.65, 1.0), align=TextNode.ACenter, font=ToontownGlobals.getSignFont(), mayChange=True)
        self.countdownText.hide()
        self.statusText = OnscreenText(text='', pos=(0.0, 0.0), scale=PartyGlobals.TeamActivityTextScale, fg=PartyGlobals.TeamActivityStatusColor, align=TextNode.ACenter, font=ToontownGlobals.getSignFont(), mayChange=True)
        self.statusText.hide()
        self.timer = PartyUtils.getNewToontownTimer()
        self.timer.hide()
        return

    def unload(self):
        self.hideWaitToStartCountdown()
        if self.exitButton is not None:
            self.exitButton.destroy()
            self.exitButton = None
        if self.switchButton is not None:
            self.switchButton.destroy()
            self.switchButton = None
        if self.countdownText is not None:
            self.countdownText.destroy()
            self.countdownText.removeNode()
            self.countdownText = None
        if self.statusText is not None:
            self.statusText.destroy()
            self.statusText.removeNode()
            self.statusText = None
        if self.timer is not None:
            self.timer.destroy()
            del self.timer
        return

    def showStatus(self, text):
        self.statusText.setText(text)
        self.statusText.show()

    def hideStatus(self):
        self.statusText.hide()

    def enableExitButton(self):
        self.exitButton.show()

    def disableExitButton(self):
        self.exitButton.hide()

    def handleExitButtonClick(self):
        self.disableExitButton()
        self.disableSwitchButton()
        self.activity.d_toonExitRequest()

    def enableSwitchButton(self):
        self.switchButton.show()

    def disableSwitchButton(self):
        if self.switchButton is not None:
            self.switchButton.hide()
        return

    def handleSwitchButtonClick(self):
        self.disableSwitchButton()
        self.disableExitButton()
        self.activity.d_toonSwitchTeamRequest()

    def showWaitToStartCountdown(self, duration, waitToStartTimestamp, almostDoneCallback = None):
        self._countdownAlmostDoneCallback = almostDoneCallback
        currentTime = globalClock.getRealTime()
        waitTimeElapsed = currentTime - waitToStartTimestamp
        if duration - waitTimeElapsed > 1.0:
            countdownTask = Task(self._updateCountdownTask)
            countdownTask.duration = duration - waitTimeElapsed
            self.countdownText.setText(str(int(countdownTask.duration)))
            self.countdownText.show()
            taskMgr.remove(TeamActivityGui.COUNTDOWN_TASK_NAME)
            taskMgr.add(countdownTask, TeamActivityGui.COUNTDOWN_TASK_NAME)

    def hideWaitToStartCountdown(self):
        taskMgr.remove(TeamActivityGui.COUNTDOWN_TASK_NAME)
        self._countdownAlmostDoneCallback = None
        if self.countdownText is not None:
            self.countdownText.hide()
        return

    def _updateCountdownTask(self, task):
        countdownTime = int(task.duration - task.time)
        seconds = str(countdownTime)
        if self.countdownText['text'] != seconds:
            self.countdownText['text'] = seconds
            if countdownTime == 3 and self._countdownAlmostDoneCallback is not None:
                self._countdownAlmostDoneCallback()
                self._countdownAlmostDoneCallback = None
        if task.time >= task.duration:
            return Task.done
        else:
            return Task.cont
        return

    def showTimer(self, duration):
        self.timer.setTime(duration)
        self.timer.countdown(duration, self._handleTimerExpired)
        self.timer.show()

    def hideTimer(self):
        self.timer.hide()
        self.timer.stop()

    def _handleTimerExpired(self):
        self.activity.handleGameTimerExpired()
Пример #42
0
class Keyboard (object):

    def __init__(self, state = None, *a, **k):
        super (Keyboard, self).__init__ (*a, **k)
        if state:
            self.state = state
        self.active = False
        self.cfg = GlobalConf ().path ('game.player0.keys')
        
        self.keys_txt = {
            'on_move_forward'   : (1, "Forward"),
            'on_move_backward'  : (2, "Backward"),
            'on_strafe_left'    : (3, "Strafe left"),
            'on_strafe_right'   : (4, "Strafe right"),
            'on_steer_left'     : (5, "Steer left"),
            'on_steer_right'    : (6, "Steer right"),
            'on_throw_weapon'   : (7, "Throw weapon"),
            'on_place_stick'    : (8, "Place stick"),
            'on_feed'           : (9, "Feed"),
            'on_jump'           : (10, "Jump"),
            'on_run'            : (11, "Run"),
            'on_hit'            : (12, "Hit")
            }

    def get_key_name (self, event):
        if event is None or event == 'no-event':
            return "?"
        else:
            return event [6:]
    
    def do_paint (self):
        tx_scale = (0.6, 0.6)
        init = -0.15
        dif = -0.06

        self.keys_btn = {}
        self.keys_lab = {}
        
        for func, (i, bt_text) in self.keys_txt.iteritems ():
            self.keys_btn [func] = DirectButton(
                text = bt_text,
                text_font = self.state.font,
                text_scale = tx_scale,
                text_align = TextNode.ARight,
                scale = .1,
                pos = (0.3, 0, init + dif*i),
                relief = None,
                command = lambda func=func: self.det_key (func)
            )
            self.keys_lab [func] = OnscreenText(text = self.get_key_name (
                    self.cfg.child (func).value),
                font = self.state.font,
                align = TextNode.ALeft,
                pos = (0.7, init+dif*i),
                scale = 0.07
            )
            self.cfg.child (func).on_conf_change += (self.on_key_change)
                
        self.info_txt = OnscreenText (text = 'Select action',
                font = self.state.font,
                pos = (0.4, init+dif*13-0.02),
                scale = 0.04
            )
        self.active = True

    def do_enable (self):
        if self.active:
            for n in self.keys_btn.itervalues ():
                n.setProp ('state', DGG.NORMAL)
        
    def do_disable (self):
        if self.active:
            for n in self.keys_btn.itervalues ():
                n.setProp ('state', DGG.DISABLED)
        
    def do_destroy (self):
        for n in self.keys_btn.itervalues ():
            n.destroy ()
        for n in self.keys_lab.itervalues ():
            n.destroy ()
        self.info_txt.destroy()
        self.active = False
        self.on_key_change.disconnect_sources ()
        
    def det_key (self, key):
        # Deactivate all buttons
        self.state.do_disable ()
        self.keys_lab [key].setText ('?')
        self.info_txt.setText ('Click any key to config')
        self.slot = self.state.events.on_any_event.connect (
            lambda ev, *a, **k: self.get_key (ev, key))
                
    def get_key (self, ev, key):
        if is_key_event (ev):
            self.state.do_enable ()
            self.state.events.on_any_event -= self.slot
            for c in self.cfg.childs ():
                if c.value == ev:
                    c.set_value ('no-event')        
            self.cfg.child (key).set_value (ev)

    @slot
    def on_key_change (self, cfg):
        if self.keys_lab [cfg.name]:
            self.keys_lab [cfg.name].setText (self.get_key_name (cfg.value))
            self.info_txt.setText ('Select button')
Пример #43
0
class PhilosophicalDiners(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        #
        self.wp = WindowProperties()
        self.wp.setSize(1280, 720)
        base.win.requestProperties(self.wp)
        self.fork_height = 2.3
        self.frame_time = 0.0
        self.textObject = OnscreenText(text='',
                                       pos=(-1.0, 0.9),
                                       scale=0.10,
                                       fg=(255, 255, 255, 200))

        # create sockets, get h constants
        self.p_constants = get_constants()
        self.context, self.socket = self._create_socket_context()

        # Load textures
        self.bowl_tex = self.loader.loadTexture(ASSETS_DIR + "marble.jpg")
        self.wood_tex = self.loader.loadTexture(ASSETS_DIR +
                                                "derevo_mebel.jpg")
        self.chair_tex = self.loader.loadTexture(ASSETS_DIR + "02_1.bmp")
        self.black_tex = self.loader.loadTexture(ASSETS_DIR + "black.png")

        # Load models
        # Load environment (really just a plane)
        self.environ = self._load_model("house",
                                        scale=[25, 25, 25],
                                        pos=[0, 0, -10])
        # Load the "table"
        self.table = self._load_model("round_table",
                                      scale=[27, 27, 14],
                                      pos=[0, 0, 0])
        # Load and place forks, chairs
        self._load_forks()
        self._load_chairs()
        self._load_bowls()

        # Apply textures to models
        self.environ.setTexture(self.black_tex)
        self.table.setTexture(self.wood_tex)
        self.table.setTexScale(TextureStage.getDefault(), 0.005, 0.005)

        # Start sim
        self.rnum = 0
        self.philos = subprocess.Popen("./philos", shell=True)

        # Tasks
        self.taskMgr.add(self.spin_camera, "spin_camera")
        self.taskMgr.add(self._comm, "comm")

    def _comm(self, task):
        """Communicate with sim

        This is a blocking function
        """
        if task.time - self.frame_time > 0.35:
            self.socket.send("Hello")  # Send generic request
            # Get message, if wait longer than timeout, quit
            try:
                message = self.socket.recv()
            except zmq.error.Again:
                for fork in self.forks:
                    fork.setZ(self.fork_height)
                raw_input(
                    "Looks like everyone is done! Press enter to exit . . .")
                exit(0)

            if self.p_constants["VERBOSE"]:
                print "Received reply ", self.rnum, "[", message, "]"
            self._anim_fork(int(message[0]), int(message[2]))
            self._anim_bowl(int(message[1]), int(message[2]))

            self.rnum += 1
            self.frame_time = task.time

        return Task.cont

    def _anim_bowl(self, bowl_num, fork_pos):

        bowl_num = (bowl_num + 1) % self.p_constants["NPHILOSOPHERS"]

        self.textObject.destroy()
        ost = "\n".join([
            "{} has eaten {} meals".format(n, self.bowls[n]["meals"])
            for n in xrange(self.p_constants["NPHILOSOPHERS"])
        ])
        self.textObject = OnscreenText(text=ost,
                                       pos=(-1.26, 0.9),
                                       scale=0.08,
                                       fg=(130, 130, 130, 125))

        if fork_pos:
            self.bowls[bowl_num]["num_up"] += 1
        else:
            self.bowls[bowl_num]["num_up"] -= 1

        if self.bowls[bowl_num]["num_up"] == 2:
            self.bowls[bowl_num]["meals"] += 1
            self.bowls[bowl_num]["bowl"].setPos(*self.bowls[bowl_num]["pos"])
        else:
            self.bowls[bowl_num]["bowl"].setPos(*[100, 100, 100])

    def _anim_fork(self, fork_num, fork_pos):
        curr_Z = self.forks[fork_num].getZ()
        self.forks[fork_num].setZ(curr_Z + 1 if fork_pos else curr_Z - 1)

    def _load_model(self, name, **kwargs):
        """Load name.egg as name as name in self.models

        Also sets scale, pos, and/or hpr as per kwargs
        """
        model = self.loader.loadModel(ASSETS_DIR + name)
        model.reparentTo(self.render)
        if kwargs.get("scale"):
            assert len(kwargs.get("scale")) == 3
            assert isinstance(kwargs.get("scale"), list)
            model.setScale(*kwargs.get("scale"))
        if kwargs.get("pos"):
            assert len(kwargs.get("pos")) == 3
            assert isinstance(kwargs.get("pos"), list)
            model.setPos(*kwargs.get("pos"))
        if kwargs.get("hpr"):
            assert len(kwargs.get("hpr")) == 3
            assert isinstance(kwargs.get("hpr"), list)
            model.setHpr(*kwargs.get("hpr"))
        if kwargs.get("H"):
            assert isinstance(kwargs.get("H"), float)
            model.setH(model, kwargs.get("H"))

        return model

    def _load_forks(self):
        """Load and place forks"""
        self.forks = self.p_constants["NPHILOSOPHERS"] * [0]
        for i in xrange(self.p_constants["NPHILOSOPHERS"]):
            x, y, angle = self._get_fork_coord(i)
            self.forks[i] = self._load_model("fork",
                                             scale=[3, 3, 3],
                                             pos=[x, y, self.fork_height],
                                             H=rad2deg(angle) + 90)

    def _load_chairs(self):
        """Load and place chairs"""
        self.chairs = self.p_constants["NPHILOSOPHERS"] * [0]
        for i in xrange(self.p_constants["NPHILOSOPHERS"]):
            x, y, angle = self._get_chair_coord(i, 5.0)
            self.chairs[i] = self._load_model("chair1",
                                              scale=[7, 7, 7],
                                              pos=[x, y - 1, 0],
                                              H=rad2deg(angle) + 15)
            self.chairs[i].setTexture(self.chair_tex)
            self.chairs[i].setTexScale(TextureStage.getDefault(), 0.005, 0.005)

    def _load_bowls(self):
        """Load and place bowls"""
        self.bowls = [{} for x in xrange(self.p_constants["NPHILOSOPHERS"])]
        for i in xrange(self.p_constants["NPHILOSOPHERS"]):
            x, y, angle = self._get_chair_coord(i, 3.6)
            self.bowls[i]["bowl"] = self._load_model("bowl",
                                                     scale=[2, 2, 2],
                                                     pos=[100, 100, 100],
                                                     H=rad2deg(angle))
            self.bowls[i]["pos"] = [x, y - 1, self.fork_height]
            self.bowls[i]["num_up"] = 0
            self.bowls[i]["meals"] = 0
            self.bowls[i]["bowl"].setTexture(self.bowl_tex)
            self.bowls[i]["bowl"].setTexScale(TextureStage.getDefault(), 0.005,
                                              0.005)

    def _get_chair_coord(self, num, diam):
        """Do mathemagics to get cartesian coordinates of a fork by its number
        on the table
        """
        circumf = pi * diam
        angle1 = num * 2 * pi / self.p_constants["NPHILOSOPHERS"]
        angle2 = (num + 1) * 2 * pi / self.p_constants["NPHILOSOPHERS"]
        ang_diff = angle1 - angle2
        angle = angle1 + ang_diff / 2
        return (circumf / 2 * cos(angle), circumf / 2 * sin(angle), angle)

    def _get_fork_coord(self, num):
        """Do mathemagics to get cartesian coordinates of a fork by its number
        on the table
        """
        circumf = pi * 3.6
        angle = num * 2 * pi / self.p_constants["NPHILOSOPHERS"]
        return (circumf / 2 * cos(angle), circumf / 2 * sin(angle), angle)

    def spin_camera(self, task):
        """Spin the camera around the table"""
        angleDegrees = 0  # task.time * 6.0
        angleRadians = angleDegrees * (pi / 180.0)
        self.camera.setPos(35 * sin(angleRadians) - 3.3,
                           -27.5 * cos(angleRadians), 16)
        self.camera.setHpr(angleDegrees, -30, 0)
        return Task.cont

    def _create_socket_context(self):
        """Creates context, socket and returns them"""
        # Find upper bound on ACTIME from constants and set timeout to double
        # that
        timeout = int(2000 * self.p_constants["ACTIME_UPPER"])

        context = zmq.Context()  # Create Context
        socket = context.socket(zmq.REQ)  # Create socket
        # Connect to dining philosophers
        socket.connect(self.p_constants["SERV_ADDR"])
        socket.RCVTIMEO = timeout  # Set timeout

        return context, socket
Пример #44
0
class Labryn(ShowBase):
    def setCamera(self, spin):
        # set camera spin state
        self.spin = spin

    def displayInformation(self):
        self.title = addTitle("Single Player")
        self.inst1 = addInstructions(0.95, "[ESC]: Quit")
        self.inst2 = addInstructions(0.90, "[wasd]: Move")
        self.inst3 = addInstructions(0.85, "[q/e]: spin camera")
        self.inst4 = addInstructions(0.80, "[z/c]: zoom in/out")
        self.inst5 = addInstructions(0.75, "[shift]: hold and pan")
        self.inst6 = addInstructions(0.70, "[1/2/3]: use moves")
        self.inst7 = addInstructions(0.65, "[h]: hide instructions")
        self.insts = [self.title, self.inst1, self.inst2, self.inst3,
                      self.inst4, self.inst5, self.inst6, self.inst7]

    def hideInstructions(self):
        if self.instStatus == "show":
            self.instStatus = "hide"
            groupHide(self.insts)
        else: # instructions are hidden
            self.instStatus = "show"
            groupShow(self.insts)        
        
    def loadNextMusic(self, task):
        # random load background music
        if (self.music.status()!=self.music.PLAYING):
            # not playing
            self.musicCounter += 1
            index = self.musicCounter % len(_BGMUSIC)
            self.music = load_bgmusic(_BGMUSIC[index])
            self.music.play()
        return task.cont
        
    def spinCamera(self, task):
        # deal with spinning the camera
        # _FOCUS: focus point, changed by panning the camera
        # CAM_R: radius, changed by zooming
        # cameraSpinCount: amount of spinning, changed by spinning
        if self.spin == 1: # spin counter-clockwise
            self.cameraSpinCount += 1
            angleDegrees = self.cameraSpinCount
            angleRadians =  angleDegrees * (pi/ 180)
            self.CAM_RAD = angleRadians
            camera.setPos(_FOCUS[0]+self.CAM_R*cos(-pi/2+self.CAM_RAD),
                          _FOCUS[1]+self.CAM_R*sin(-pi/2+self.CAM_RAD),
                          (25.0/12)*self.CAM_R) 
            camera.setHpr(angleDegrees,-65,0)
        elif self.spin == 2: # spin clockwise
            self.cameraSpinCount  -= 1
            angleDegrees = self.cameraSpinCount
            angleRadians =  angleDegrees * (pi/ 180)
            self.CAM_RAD = angleRadians
            camera.setPos(_FOCUS[0]+self.CAM_R*cos(-pi/2+self.CAM_RAD),
                          _FOCUS[1]+self.CAM_R*sin(-pi/2+self.CAM_RAD),
                          (25.0/12)*self.CAM_R)
            camera.setHpr(angleDegrees,-65,0)
        elif self.spin == 3: # ZOOM IN not spin
            self.cameraZoomCount += 1
            deltaR = self.cameraZoomCount * 0.1
            new_R = 12-deltaR
            self.CAM_R = new_R
            camera.setPos(_FOCUS[0] + self.CAM_R*cos(-pi/2+self.CAM_RAD),
                          _FOCUS[1] + self.CAM_R*sin(-pi/2+self.CAM_RAD),
                          (25.0/12)*new_R)
        elif self.spin == 4: # ZOOM OUT
            self.cameraZoomCount -= 1
            deltaR = self.cameraZoomCount * 0.1
            new_R = 12-deltaR
            self.CAM_R = new_R
            camera.setPos(_FOCUS[0] + self.CAM_R*cos(-pi/2+self.CAM_RAD),
                          _FOCUS[1] + self.CAM_R*sin(-pi/2+self.CAM_RAD),
                          (25.0/12)*self.CAM_R)
        return Task.cont

    def takeRecord(self):
        def myCMP(aString, bString):
            a = float(aString.split(',')[0])
            b = float(bString.split(',')[0])
            return int(10*(a - b))
        
        msg = "%.2f,%s\n" %(self.clock/100.0, time.ctime())
        with open('record.txt') as f:
            data = f.readlines()
        # if has no previous data
        if len(data) == 0:
            data.append(msg)
            with open('record.txt','w') as f:
                f.writelines(data)
        else:
            data.append(msg)
            processedData = sorted(data, myCMP)
            with open('record.txt', 'w') as f:
                f.writelines(processedData)

    def printResults(self):
        addEndMessage(self.clock)
        with open('record.txt') as f:
            data = f.readlines()
        for i in xrange(0, len(data)):
            if i < 5: # only print the top 5
                string = data[i]
                printRank(i, string)
        
    def checkForWin(self, task):
        if (checkWin(self.pikachu.getX(), self.pikachu.getY(),
                    self.ballRoot.getX(), self.ballRoot.getY()) and
            self.gameOver == False):
            self.takeRecord()
            self.printResults()
            self.gameOver = True
            # if top 10, if top 1,
            print "WIN"
            # print previous best 10 results
        return Task.cont
    
    def pikachuBark(self, task):
        if self.distance < 3:
            if random.randint(1,200) == 1:
            # randomly bark dangerous sound
                if self.dangerous.status() != self.dangerous.PLAYING:
                    self.dangerous.play()
        elif self.distance > 10:
            if random.randint(1,430) == 1:
                if self.safe.status() != self.safe.PLAYING:
                    self.safe.play()
        return Task.cont
            
    def checkMouse(self, task):
        # get mouse position 
        if base.mouseWatcherNode.hasMouse():
            self.mouseX=base.mouseWatcherNode.getMouseX()
            self.mouseY=base.mouseWatcherNode.getMouseY()
        return Task.cont

    def dropRock(self):
        # when the user clicks, rock is dropped
        if self.pokeMoveChoice == 1: # selected Geodude
            result = MAZE.canDropRock(self.rockX, self.rockY)
            if result != False: # can place rock here
                MAZE.dropRock(result[0],result[1])
                self.rock.setPos(self.rockX, self.rockY, 1)
                self.rockOnMaze = True
                self.pokeMoveChoice = None
                self.myPokeName.hide()
                self.myPokeName = None
                self.updateTwoD()
                self.playerCandyCount -= 1

    def restart(self):
        sys.exit()
                
    def useFlame(self):
        # use flame to Pikachu -> cannot move
        self.onFire = True # on fire
        self.playerCandyCount -= 1
        self.pokeStatus = 1
        self.flame = ParticleEffect()
        self.flame.loadConfig("fireish.ptf")
        self.flame.setPos(self.pikachu.getPos())
        self.flame.start(parent=render, renderParent=render)
        self.updateTwoD()

    def useStringShot(self):
        # use string shot -> speed goes down
        self.pokeStatus = 2
        self.updateTwoD()

    def useThunder(self):
        self.onThunder = True
        self.pokeCandyCount -= 1
        self.thunder = ParticleEffect()
        self.thunder.loadConfig("thunder.ptf")
        self.thunder.start(parent=render, renderParent=render)
        self.use.play()
                
    def placeRock(self, task):
        # rock moves with mouse cursor
        if self.pokeMoveChoice == 1: # selected Geodude
            dX,dY = ((self.mouseX-self.rockRefX),
                     (self.mouseY-self.rockRefY))
            self.rockX, self.rockY = MAZE.translateRockPosition(self.rockRefX,
                                                      self.rockRefY,
                                                      dX, dY)
            self.rock.show()
            self.rock.setPos(self.rockX, self.rockY, 1)
        self.updateTwoD()
        return Task.cont
    
    def placeRareCandy(self, task):
        # place rare candy with interval
        # needs to be improved
        if int(task.time) % 4 == 9 and self.candyOnBoard:
            self.candy.hide()
            self.candyOnBoard = False
            MAZE.clearCandy()
        if int(task.time) % 10 ==  0 and (self.candyOnBoard == False):
            # every 10 seconds
            self.candy.setPos(MAZE.generateCandyPos())
            self.candy.show()
            self.candyOnBoard = True
        return Task.cont

    def updateTwoD(self):
        # update player candy count
        self.playerCandyStatus.destroy()
        self.playerCandyStatus = candyStatus(0, self.playerCandyCount)
        self.pokeCandyStatus.destroy()
        self.pokeCandyStatus = candyStatus(1, self.pokeCandyCount)
        # update my pokes color     
        if self.playerCandyCount == 0 :
            groupHide(self.myPokesBright)
            groupShow(self.myPokesDark)
            # update name
            if self.myPokeName != None:
                self.myPokeName.destroy()

    def clearRock(self):
        # clear rock 
        self.rock.hide()
        self.rockOnMaze = False
        MAZE.clearRock() # clear it in 2D

    def clearFlame(self):
        # clear flame
        self.onFire = False
        self.flame.cleanup()
        self.pokeStatus = 0
        self.pokeMoveChoice = None
        try:
            self.myPokeName.destroy()
        except:
            pass
        self.myPokeName = None

    def clearString(self):
        # clear string shot
        self.pokeStatus = 0
        self.pokeMoveChoice = None
        try:
            self.myPokeName.destroy()
        except:
            pass
        self.myPokeName = None

    def clearThunder(self):
        self.onThunder = False
        try:
            self.thunder.cleanup()
        except:
            pass
        
    def timer(self, task): # deals with moves' lasting effects
        ##############################################################
        self.clock += 1
        if self.rockOnMaze: # rock on maze
            self.rockCounter += 1
        elif self.rockCounter != 1: # rock not on maze, counter not cleared
            self.rockCounter = 0

        if self.onFire:
            self.fireCounter += 1
        elif self.fireCounter != 1:
            self.fireCounter = 0

        if self.pokeStatus == 2: # string shot
            self.stringCounter += 1
        elif self.stringCounter != 1:
            self.stringCounter = 0

        if self.onThunder: # thunderbolt
            self.thunderCounter += 1
        elif self.thunderCounter != 1:
            self.thunderCounter = 0

        if self.gameOver == True: # game is over
            self.gameOverCounter += 1

        ##################################################################
        if self.rockCounter >= 100:
            self.clearRock()

        if self.fireCounter >= 80:
            self.clearFlame()

        if self.thunderCounter >= 150:
            self.clearThunder()
            
        if self.stringCounter >= 120:
            self.clearString()

        if self.gameOverCounter >= 800: # quit the game
            sys.exit()
            
        return Task.cont
    
    def usePokeMove(self, number):
        # use pokemon move
        if self.playerCandyCount > 0: # have more than one candy
            if number == 1 and self.rockOnMaze == False:
                if self.pokeMoveChoice == None: # no choice
                    # set to center position
                    centerx =  base.win.getProperties().getXSize()/2
                    centery =  base.win.getProperties().getYSize()/2
                    base.win.movePointer(0,centerx,centery)
                    self.pokeMoveChoice = 1 # placeRock called here
                    self.rockRefX, self.rockRefY = 0,0
                    self.rock.show()
                    self.rock.setPos(0,0,1)
                elif self.pokeMoveChoice != 1:
                    pass

                else: # self.pokeMoveChoice is already 1, cancel the choice
                    self.pokeMoveChoice = None
                    self.clearRock() # clear rock
            elif number == 2:
                if self.pokeMoveChoice == None:
                    self.pokeMoveChoice = 2
                    self.useFlame()
                elif self.pokeMoveChoice != 2:
                    pass
                else:
                    self.pokeMoveChoice = None

            elif number == 3:
                if self.pokeMoveChoice == None:
                    self.pokeMoveChoice = 3
                    self.useStringShot()
                elif self.pokeMoveChoice != 3:
                    pass
                else: # already 3
                    self.pokeMoveChoice = None

            if self.pokeMoveChoice == None: # no choice
                if self.myPokeName != None: # there is a name on board
                    self.myPokeName.destroy() # kill it
                else: # no name
                    pass
            else: # there is a choice
                if self.myPokeName != None:
                    self.myPokeName.destroy()
                self.myPokeName = writePokeName(self.pokeMoveChoice)
  
    def loadRareCandy(self):
        # load rare candy (a box)
        # needs to be improved
        self.candy = Model_Load.loadRareCandy()
        self.candy.reparentTo(render)
        self.candy.setScale(0.1)
        self.candy.hide()
        
    def eatRareCandy(self, task):
        # check who eats candy
        if self.candyOnBoard: # candy on board
            if checkEat(self.ballRoot.getX(), self.ballRoot.getY(),
                        self.candy.getX(), self.candy.getY()): # ball eats
                self.candy.hide() # eaten
                self.candyOnBoard = False
                if self.playerCandyCount < 3:
                    self.playerCandyCount += 1
                groupShow(self.myPokesBright)
                MAZE.clearCandy()
            elif checkEatPika(self.pikachu.getX(), self.pikachu.getY(),
                          self.candy.getX(), self.candy.getY()):
                self.candy.hide()
                self.candyOnBoard = False
                if self.pokeCandyCount < 3:
                    self.pokeCandyCount += 1
                MAZE.clearCandy()                
        return Task.cont

    def setFocus(self, changing):
        # set focus of the camera while panning
        self.changingFocus = changing
        if changing == True: # Just Pressed
            self.referenceX, self.referenceY = self.mouseX, self.mouseY
        else: # cursor moves up
            self.referenceX, self.referenceY = None, None

    def resetView(self):
        # reset the view to default
        self.CAM_R, self.CAM_RAD = 12, 0
        self.cameraSpinCount, self.cameraZoomCount = 0, 0
        # _FOCUS = [0,0,0] does not work WHY???
        _FOCUS[0], _FOCUS[1], _FOCUS[2] = 0,0,0
        self.changingFocus = False
        self.referenceX, self.referenceY = None, None
        camera.setPos(_FOCUS[0], _FOCUS[1]-self.CAM_R, 25)
        camera.setHpr(0, -65, 0)
        
    def changeFocus(self, task):
        # change focus with displacement of mouse cursor
        if (self.changingFocus == True and self.mouseX != None and
            self.mouseY != None ):
            dX, dY = ((self.mouseX - self.referenceX)*0.1,
                      (self.mouseY - self.referenceY)*0.1)
            _FOCUS[0] += dX
            _FOCUS[1] += dY
            camera.setPos(_FOCUS[0] + self.CAM_R*cos(-pi/2+self.CAM_RAD),
                          _FOCUS[1] + self.CAM_R*sin(-pi/2+self.CAM_RAD),
                          (25.0/12)*self.CAM_R)
        return Task.cont

    def thunderbolt(self, task):
        if self.onThunder == True:
            self.thunder.setPos(self.ballRoot.getPos())
        return Task.cont

    def displayClock(self, task):
        msg = "Time: %.2f" %(self.clock/100.0)
        if self.clockMSG == None:
            self.clockMSG = OnscreenText(text=msg, style=1, fg=(1,1,1,1),
                                         pos=(1.3, .95), align=TextNode.ALeft,
                                         scale = .05)
        else:
            self.clockMSG.destroy()
            self.clockMSG = OnscreenText(text=msg, style=1, fg=(1,1,1,1),
                                         pos=(1.3, .95), align=TextNode.ALeft,
                                         scale = .05)
        return task.cont
    
    def initialize(self):
        taskMgr.stop()
        self.musicCounter, self.clock = 0, 0
        self.gameOverCounter = 0
        self.clockMSG = None
        self.music = load_bgmusic(_BGMUSIC[0])
        self.background = loadBackground()
        base.cam2dp.node().getDisplayRegion(0).setSort(-20)
        self.candyOnBoard = False
        self.playerCandyCount, self.pokeCandyCount = 0, 0
        self.gameOver = False
        self.displayInformation()
        self.instStatus = "show"
        ######################Rare Candy###############################
        pokes=['caterpie', 'charmander', 'geodude']
        self.myPokesDark = loadMyPokemon_Dark(pokes) # my pokemons
        self.myPokesBright = loadMyPokemon_Bright()
        groupHide(self.myPokesBright)
        self.loadRareCandy() # load rare candy
        ######################Camera Initialization####################
        self.CAM_R, self.CAM_RAD = 12, 0
        camera.setPos(_FOCUS[0],_FOCUS[1]-12,_FOCUS[2]+25)
        camera.setHpr(0, -65, 0)
        self.cameraSpinCount, self.cameraZoomCount = 0, 0
        self.changingFocus = False
        self.spin = 0
        #######################ICONS###################################
        self.myIcon = loadMyIcon()
        self.pokeIcon = loadPokeIcon()
        self.playerCandyStatus = candyStatus(0, self.playerCandyCount)
        self.pokeCandyStatus = candyStatus(1, self.pokeCandyCount)
        self.rareCandyImage = loadRareCandyImage()
        self.pokeRareCandyImage = loadRareCandyImage(pos=(-.3,0,-.75))
        #######################FLAMES##################################
        base.enableParticles()
        self.fireCounter = 0
        self.onFire = False
        #######################STRINGSHOT#############################
        self.stringCounter = 0
        #######################THUNDER################################
        self.thunderCounter = 0
        #######################SOUND##################################
        self.dangerous = load_sound("pikachu_d.wav")
        self.safe = load_sound("pikachu_s1.wav")
        self.use = load_sound("pikachu_u.wav")
        #######################"GLOBALS"##############################
        self.speedCounter = 0
        self.onThunder = False
        self.direction = 's'
        self.myDirection = ['zx', 'zy']
        self.rockCounter  = 0
        self.rockX, self.rockY = None, None
        self.rockOnMaze = False
        self.pokeMoveChoice = None
        self.myPokeName = None
        self.arrowKeyPressed = False
        self.pokemonDirection = 'd'
        self.mouseX, self.mouseY = None, None
        # direction the ball is going
        self.jerkDirection = None
        base.disableMouse()
        self.jerk = Vec3(0,0,0)
        self.MAZE = Model_Load.loadLabyrinth()
        Control.keyControl(self)
        self.loadPokemonLevel1()
        self.light()
        self.loadBall()
        self.pokeStatus = 0 # 0 is normal, 1 is burned, 2 is slow-speed
        ########################################ROCK###################
        self.rock = Model_Load.loadRock()
        self.rock.reparentTo(render)
        self.rock.hide() # Do not show, but load beforehand for performance
        
    def loadPokemonLevel1(self):
        self.pikachu = load_model("pikachu.egg")
        self.pikachu.reparentTo(render)
        self.pikachu.setScale(0.3)
        endPos = self.MAZE.find("**/end").getPos()
        self.pikachu.setPos(endPos)
        
    def light(self):
        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 loadBall(self):
        self.ballRoot = render.attachNewNode("ballRoot")
        self.ball = load_model("ball")
        self.ball.reparentTo(self.ballRoot)
        self.ball_tex = load_tex("pokeball.png")
        self.ball.setTexture(self.ball_tex,1)
        self.ball.setScale(0.8)
        # Find the collision sphere for the ball in egg.
        self.ballSphere = self.ball.find("**/ball")
        self.ballSphere.node().setFromCollideMask(BitMask32.bit(0))
        self.ballSphere.node().setIntoCollideMask(BitMask32.allOff())
        #self.ballSphere.show()
        # Now we create a ray to cast down at the ball.
        self.ballGroundRay = CollisionRay()
        self.ballGroundRay.setOrigin(0,0,10)
        self.ballGroundRay.setDirection(0,0,-1)

        # Collision solids go in CollisionNode
        self.ballGroundCol =  CollisionNode('groundRay')
        self.ballGroundCol.addSolid(self.ballGroundRay)
        self.ballGroundCol.setFromCollideMask(BitMask32.bit(1))
        self.ballGroundCol.setIntoCollideMask(BitMask32.allOff())
        self.ballGroundColNp = self.ballRoot.attachNewNode(self.ballGroundCol)
        
        # light
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor(Vec4(.55, .55, .55, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(Vec3(0,0,-1))
        directionalLight.setColor(Vec4(0.375,0.375,0.375,1))
        directionalLight.setSpecularColor(Vec4(1,1,1,1))
        self.ballRoot.setLight(render.attachNewNode(ambientLight))
        self.ballRoot.setLight(render.attachNewNode(directionalLight))
        # material to the ball
        m = Material()
        m.setSpecular(Vec4(1,1,1,1))
        m.setShininess(96)
        self.ball.setMaterial(m,1)
        
    def __init__(self):

        self.initialize()
        self.WALLS = self.MAZE.find("**/Wall.004")
        self.WALLS.node().setIntoCollideMask(BitMask32.bit(0))
        # collision with the ground. different bit mask
        #self.mazeGround = self.maze.find("**/ground_collide")
        #self.mazeGround.node().setIntoCollideMask(BitMask32.bit(1))
        self.MAZEGROUND = self.MAZE.find("**/Cube.004")
        self.MAZEGROUND.node().setIntoCollideMask(BitMask32.bit(1))

        # add collision to the rock
        cs = CollisionSphere(0, 0, 0, 0.5)
        self.cnodePath = self.rock.attachNewNode(CollisionNode('cnode'))
        self.cnodePath.node().addSolid(cs)
        self.cnodePath.node().setIntoCollideMask(BitMask32.bit(0))
        
        # CollisionTraversers calculate collisions
        self.cTrav = CollisionTraverser()
        #self.cTrav.showCollisions(render)
        #self.cTrav.showCollisions(render)
        # A list collision handler queue
        self.cHandler = CollisionHandlerQueue()
        # add collision nodes to the traverse.
        # maximum nodes per traverser: 32
        self.cTrav.addCollider(self.ballSphere,self.cHandler)
        self.cTrav.addCollider(self.ballGroundColNp,self.cHandler)
        self.cTrav.addCollider(self.cnodePath, self.cHandler)
        # collision traversers have a built-in tool to visualize collisons
        #self.cTrav.showCollisions(render)
        self.start()

    def pokemonTurn(self, pokemon, direction):
        if direction  == 'l' and self.pokemonDirection != 'l':
            self.pokemonDirection = 'l'
            pokemon.setH(-90)
        if direction  == 'r' and self.pokemonDirection != 'r':
            self.pokemonDirection = 'r'
            pokemon.setH(90)
        if direction  == 'd' and self.pokemonDirection != 'd':
            self.pokemonDirection = 'd'
            pokemon.setH(0)
        if direction  == 'u' and self.pokemonDirection != 'u':
            self.pokemonDirection = 'u'
            pokemon.setH(180)
                        
    def pokemonMove(self, pokemon, direction):
        self.pokemonTurn(pokemon, direction)
        if self.pokeStatus == 0: speed = _SPEED
        elif self.pokeStatus == 1: speed = 0
        else: # self.pokeStatus == 2
            speed = _SPEED/2.0
        if direction == 'l':
            newX = pokemon.getX() - speed
            pokemon.setX(newX)
        elif direction == 'r':
            newX = pokemon.getX() + speed
            pokemon.setX(newX)
        elif direction == 'u':
            newY = pokemon.getY() + speed
            pokemon.setY(newY)
        elif direction == 'd':
            newY = pokemon.getY() - speed
            pokemon.setY(newY)
        elif direction == "s": # stop
            pass
        
    def whereToGo(self, task):
        # this returns the direction pokemon should go
        # tell MAZE pokemon and ball's board position
        self.pokemonMove(self.pikachu, self.direction)
        MAZE.setPokeCoord(self.pikachu.getX(), self.pikachu.getY(),
                          self.pokemonDirection)
        MAZE.setBallCoord(self.ballRoot.getX(), self.ballRoot.getY())
        MAZE.sendInformation(self.myDirection, self.rockOnMaze,
                             self.onThunder, self.playerCandyCount,
                             self.pokeCandyCount, self.distance)
        # find out which direction to go
        self.direction = MAZE.getDecision()
        self.pokemonMove(self.pikachu,self.direction)
        return Task.cont

    def whatToDo(self, task):
        # determines when to use thunder
        if self.pokeCandyCount > 0: # Pikachu has candies
            decision = MAZE.useThunderDecision()
            if decision == True:
                self.useThunder()
        return Task.cont
    
    def getInformation(self, task):
        # get information on the board
        self.speedCounter += 1 # sample every other call to avoid 
        if self.speedCounter % 2 == 0:
            dX = self.ballRoot.getX() - self.oldPos[0]
            dY = self.ballRoot.getY() - self.oldPos[1]
            if dX < 0 :
                # print "going left"
                self.myDirection[0] = 'l'
            elif abs(dX) < _EPSILON:
                # print "not moving horiz"
                self.myDirection[0] = 'zx'
            else:
                # print "going right"
                self.myDirection[0] = 'r'
            if dY < 0 :
                # print "going down"
                self.myDirection[1] = 'd'
            elif abs(dY) < _EPSILON:
                # print "not moving verti"
                self.myDirection[1] = 'zy'
            else:
                # print "going up"
                self.myDirection[1] = 'u'
            self.oldPos = self.ballRoot.getPos()
        # calculate distance
        self.distance = MAZE.getDistance()
        return Task.cont
    
    def start(self):
        # maze model has a locator in it
        # self.ballRoot.show()
        self.startPos = self.MAZE.find("**/start").getPos()
        self.oldPos = self.MAZE.find("**/start").getPos()
        self.ballRoot.setPos(self.startPos) # set the ball in the pos
        self.ballV = Vec3(0,0,0) # initial velocity
        self.accelV = Vec3(0,0,0) # initial acceleration

        # for a traverser to work, need to call traverser.traverse()
        # base has a task that does this once a frame
        base.cTrav = self.cTrav

        # create the movement task, make sure its not already running
        taskMgr.remove("rollTask")
        taskMgr.add(self.placeRock, "placeRock")
        taskMgr.add(self.displayClock, "displayClock")
        taskMgr.add(self.timer, "timer")
        taskMgr.add(self.loadNextMusic, "loadNextMusic")
        taskMgr.add(self.getInformation, "getInformation")
        taskMgr.add(self.eatRareCandy, "eatRareCandy")
        taskMgr.add(self.placeRareCandy, "placeRareCandy")
        taskMgr.add(self.checkMouse, "checkMouse")
        taskMgr.add(self.spinCamera, "spinCamera")
        taskMgr.add(self.changeFocus, "changeFocus")
        taskMgr.add(self.whereToGo, "whereToGo")
        taskMgr.add(self.whatToDo, "whatToDo")
        taskMgr.add(self.moveBall, "moveBall")
        taskMgr.add(self.thunderbolt, "thunderbolt")
        taskMgr.add(self.checkForWin, "checkForWin")
        taskMgr.add(self.pikachuBark, "pikachuBark")
        self.mainLoop = taskMgr.add(self.rollTask, "rollTask")
        self.mainLoop.last = 0

    def moveBallWrapper(self, direction):
        # wrapper for moving the ball
        # needs to be improved
        if direction == False:
            self.arrowKeyPressed = False
        else:
            self.arrowKeyPressed = True
            self.jerkDirection = direction
    
    def moveBall(self, task):
        # move the ball
        # a key press changes the jerk
        direction = self.jerkDirection
        if self.arrowKeyPressed == True and self.onThunder == False:
            if direction == "u":
                self.jerk = Vec3(0,_JERK,0)
            elif direction == "d":
                self.jerk = Vec3(0,-_JERK,0)
            elif direction == "l":
                self.jerk = Vec3(-_JERK,0,0)
            elif direction == "r":
                self.jerk = Vec3(_JERK,0,0)
        elif self.onThunder == True:
            self.jerk = self.jerk
        return Task.cont        

    # collision between ray and ground
    # info about the interaction is passed in colEntry
    
    def groundCollideHandler(self,colEntry):
        # set the ball to the appropriate Z for it to be on the ground
        newZ = colEntry.getSurfacePoint(render).getZ()
        self.ballRoot.setZ(newZ+.4)

        # up vector X normal vector
        norm = colEntry.getSurfaceNormal(render)
        accelSide = norm.cross(UP)
        self.accelV = norm.cross(accelSide)

    # collision between the ball and a wall
    def wallCollideHandler(self,colEntry):
        # some vectors needed to do the calculation
        norm = colEntry.getSurfaceNormal(render) * -1
        norm.normalize()
        curSpeed = self.ballV.length()
        inVec = self.ballV/curSpeed
        velAngle = norm.dot(inVec) # angle of incidance
        hitDir = colEntry.getSurfacePoint(render) - self.ballRoot.getPos()
        hitDir.normalize()
        hitAngle = norm.dot(hitDir)
    # deal with collision cases
        if velAngle > 0 and hitAngle >.995:
            # standard reflection equation
            reflectVec = (norm * norm.dot(inVec*-1)*2) + inVec
            # makes velocity half of hitting dead-on
            self.ballV = reflectVec * (curSpeed * (((1-velAngle)*.5)+.5))
            # a collision means the ball is already a little bit buried in
            # move it so exactly touching the wall
            disp = (colEntry.getSurfacePoint(render) -
                    colEntry.getInteriorPoint(render))
            newPos = self.ballRoot.getPos() + disp
            self.ballRoot.setPos(newPos)
            
    def rollTask(self,task):
        # standard technique for finding the amount of time
        # since the last frame
        dt = task.time - task.last
        task.last = task.time
        # If dt is large, then there is a HICCUP
        # ignore the frame
        if dt > .2: return Task.cont
        # dispatch which function to handle the collision based on name
        for i in range(self.cHandler.getNumEntries()):
            entry = self.cHandler.getEntry(i)
            name = entry.getIntoNode().getName()
            if name == "Wall.004":
                self.wallCollideHandler(entry)
            elif name=="Cube.004":
                self.groundCollideHandler(entry)
            else:
                if self.rockOnMaze == True:
                    self.wallCollideHandler(entry)
                    
        self.accelV += self.jerk
        # move the ball, update the velocity based on accel
        self.ballV += self.accelV * dt * ACCELERATION
        # clamp the velocity to the max speed
        if self.ballV.lengthSquared() > MAX_SPEED_SQ:
            self.ballV.normalize()
            self.ballV *= MAX_SPEED
        # update the position
        self.ballRoot.setPos(self.ballRoot.getPos() + (self.ballV*dt))

        # uses quaternion to rotate the ball
        prevRot = LRotationf(self.ball.getQuat())
        axis = UP.cross(self.ballV)
        newRot = LRotationf(axis, 45.5 * dt * self.ballV.length())
        self.ball.setQuat(prevRot * newRot)
        return Task.cont # continue the task     
Пример #45
0
class Pose3dViz(ShowBase):
    """ Initialize the ShowBase class from which we inherit, which will
        create a window and set up everything we need for rendering into it."""
    def __init__(self,
                 body_props,
                 face_pos,
                 cam,
                 args,
                 pifpaf,
                 pose3d,
                 with_azure=False):

        ShowBase.__init__(self)

        # Set up Panda3d environment
        self.disableMouse()
        self.setBackgroundColor(0.5, 0.6, 0.9)
        self.setupLights()

        ### initialize all the required variables ###

        # set face and body proportions to construct the avatar
        self.body_props = body_props
        self.face_pos = face_pos

        # set the input video capture
        self.cam = cam

        # initialise the predictive models
        self.pifpaf = pifpaf
        self.pose3d = pose3d

        self.args = args

        # moving average variables and parameters
        self.buffer_counter = 0
        self.buffer_size = 5
        self.buffer = np.zeros((17, self.buffer_size))

        #kinect azure boolean
        self.with_azure = with_azure

        # variables to estimate frame rate
        self.iter_count = 0
        self.frame_rate = 0
        self.previous_time = time.time()

        # error text initializing
        if self.with_azure:
            self.text = OnscreenText(text='my text string',
                                     pos=(-0.5, 0.02),
                                     scale=0.07)

        # recording attributes
        self.stored_vals = {
            "azure": {
                "head": [],
                "back": [],
                "orient": []
            },
            "pose3d": {
                "head": [],
                "back": [],
                "orient": []
            }
        }
        self.stored_kinect_data = []
        self.stored_pifpaf = []
        self.record_id = str(int(time.time()))

        # create the folders to store the recorded results of the session
        os.mkdir("posture-app/results/" + self.record_id)
        os.mkdir("posture-app/results/" + self.record_id + "/images")
        self.record_count = 0
        self.is_recording = False

        # initialize the angle dicts
        angles = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, math.pi / 2, math.pi / 2,
                  math.pi / 2, 0, 0, 0, 0, 0, 0, 0, 0)

        self.angle_dic = {
            'head': angles[:3],
            'back': angles[3:6],
            'x': [angles[6]],
            'y': [angles[7]],
            'z': [angles[8]],
            'left arm': angles[9:13],
            'right arm': angles[13:]
        }
        self.azure_angle_dic = {}

        # create the pose skeleton
        self.create_pose(self.body_props, self.face_pos, self.angle_dic,
                         self.with_azure)

        # necessary to read blender 3D objects
        gltf.patch_loader(self.loader)

        # adds the body part blender models to the skeleton
        self.create_avatar()

        # creates 3D points for each joints (used only for debugging angle conversions)
        self.points = [Create3DPoint() for _ in range(21)]

        # adds the update function as a thread to be called at every step of the game engine
        self.taskMgr.add(self.update, "change_angles")

    def setupLights(self):
        """setup the lighting"""

        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor((.3, .3, .3, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(LVector3(0, 0, -2.5))
        directionalLight.setColor((0.9, 0.8, 0.9, 1))
        render.setLight(render.attachNewNode(ambientLight))
        render.setLight(render.attachNewNode(directionalLight))

    def create_pose(self, body_props, face_pos, angle_dic, with_azure=True):
        """creates the skeleton of the avatar with given proportions and initial angles"""

        #check if azure is connected
        segments_dic = {}
        if with_azure:
            segments_azure_dic = {}

        #define the eye distance and rotation
        len_eye = np.linalg.norm(face_pos['eye'])
        eye_z_rot = (180 / np.pi) * math.acos(face_pos['eye'][1] / len_eye)
        eye_y_rot = (180 / np.pi) * math.acos(face_pos['eye'][0] / len_eye)

        #define all the skeleton segments data as follow:

        #   (segment_name,      segment_length,          parent_name,      distance_from_parent,    rotation_angles)
        seg_data = [
            ('left_hip', 0.5 * body_props['hip'], render, 0, [0, 0, 270]),
            ('right_hip', 0.5 * body_props['hip'], 'left_hip', 0, [0, 180, 0]),
            ('lower_back', body_props['back'], 'left_hip', 0, [0, 90, 0]),
            ('upper_back', body_props['back'], 'lower_back',
             body_props['back'], [0, 0, 0]),
            ('left_shoulder', body_props['shoulder'], 'upper_back',
             body_props['back'], [0, 90, 0]),
            ('left_biceps', body_props['biceps'], 'left_shoulder',
             body_props['shoulder'], [0, 90, 0]),
            ('left_forearm', body_props['forearm'], 'left_biceps',
             body_props['biceps'], [0, 0, 90]),
            ('right_shoulder', body_props['shoulder'], 'upper_back',
             body_props['back'], [0, 270, 0]),
            ('right_biceps', body_props['biceps'], 'right_shoulder',
             body_props['shoulder'], [0, 270, 0]),
            ('right_forearm', body_props['forearm'], 'right_biceps',
             body_props['biceps'], [0, 0, 90]),
            ('lower_neck', body_props['neck'], 'upper_back',
             body_props['back'], [0, 0, 0]),
            ('upper_neck', body_props['neck'], 'lower_neck',
             body_props['neck'], [0, 0, 0]),
            ('nose', face_pos['nose'][2], 'upper_neck', body_props['neck'],
             [0, 0, 90]),
            ('r_eye', len_eye, 'upper_neck', body_props['neck'],
             [0, eye_y_rot, eye_z_rot]),
            ('l_eye', len_eye, 'upper_neck', body_props['neck'],
             [0, -eye_y_rot, eye_z_rot]),
            ('r_ear', face_pos['ear'][0], 'upper_neck', body_props['neck'],
             [0, 90, 0]),
            ('l_ear', face_pos['ear'][0], 'upper_neck', body_props['neck'],
             [0, -90, 0])
        ]

        # generate the skeleton for both pose3d and azure if azure is connected
        for name, length, parent, z_displacement, rots in seg_data:
            segments_dic[name] = Segment(length=AVATAR_SCALE_FACTOR *
                                         length).draw()
            if with_azure:
                segments_azure_dic[name] = Segment(length=AVATAR_SCALE_FACTOR *
                                                   length).draw()

            if type(parent) == str:
                parent_obj = segments_dic[parent]
                if with_azure:
                    parent_azure_obj = segments_azure_dic[parent]
            else:
                parent_obj = parent
                if with_azure:
                    parent_azure_obj = parent

            segments_dic[name].reparentTo(parent_obj)
            segments_dic[name].setPosHprScale(
                0, 0, AVATAR_SCALE_FACTOR * z_displacement, rots[0], rots[1],
                rots[2], 1., 1., 1.)

            if with_azure:
                segments_azure_dic[name].reparentTo(parent_azure_obj)
                segments_azure_dic[name].setPosHprScale(
                    0, 0, AVATAR_SCALE_FACTOR * z_displacement, rots[0],
                    rots[1], rots[2], 1., 1., 1.)

        self.segments_dic = segments_dic
        if with_azure:
            self.segments_azure_dic = segments_azure_dic
        else:
            self.segments_azure_dic = None

    def create_avatar(self):
        """connect the different body part models to the skeleton"""

        ##  (part name,         parent name,        [angles, scaling])
        avatar_data = [
            ('head', 'upper_neck', [270, 0 + 180, 180, 20, 20, 20]),
            ('neck', 'lower_neck', [270, 30 + 180, 180, 15, 15, 15]),
            ('torso', 'upper_back', [270, 0 + 180, 180, 25, 15, 25]),
            ('rightarm', 'right_biceps', [270, 0, 90, 20, 15, 15]),
            ('rightforearm', 'right_forearm', [270, 180, 90, 20, 15, 15]),
            ('leftarm', 'left_biceps', [270, 180, 90, 20, 15, 15]),
            ('leftforearm', 'left_forearm', [270, 0, 90, 20, 15, 15]),
            ('spine', 'lower_back', [270, 0 + 180, 180, 15, 15, 45]),
            ('pelvis', 'lower_back', [270, 0 + 180, 180, 25, 15, 15])
        ]

        # attach each model part to the corresponding skeleton for pose3d and azure
        avatar_dic = {}
        for name, parent, rs in avatar_data:
            avatar_dic[name] = self.loader.loadModel(
                'visuals/models3d/man3D.' + name + '.glb')
            avatar_dic[name].reparentTo(self.segments_dic[parent])
            avatar_dic[name].setHprScale(rs[0], rs[1], rs[2], rs[3], rs[4],
                                         rs[5])
        self.avatar_dic = avatar_dic

        if self.segments_azure_dic:

            # change the skeleton color for azure and move the skeleton and camera
            self.segments_azure_dic['left_hip'].setColor(0.0, 0.9, 0.9, 0.0)
            self.segments_azure_dic['left_hip'].setPos(50, 0, 0)
            self.segments_dic['left_hip'].setPos(-50, 0, 0)
            camera.setPosHpr(25, -20, 200, 0, -90, 180)

            avatar_azure_dic = {}
            for name, parent, rs in avatar_data:
                avatar_azure_dic[name] = self.loader.loadModel(
                    'visuals/models3d/man3D.' + name + '.glb')
                avatar_azure_dic[name].reparentTo(
                    self.segments_azure_dic[parent])
                avatar_azure_dic[name].setHprScale(rs[0], rs[1], rs[2], rs[3],
                                                   rs[4], rs[5])
            self.avatar_azure_dic = avatar_azure_dic

    def process_azure_data(self, azure_data):
        """process the azure data to convert it into a corresponding format for the avatar
            (works well for the head, back and absolute orientation but can still not working perfectly for arms)"""
        def angle_from_3pts(a, b, c):
            """get the acute angle between 3 3D points (used for the elbow angle)"""
            ba = a - b
            bc = c - b

            cosine_angle = np.dot(
                ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))
            angle = np.arccos(cosine_angle)

            return np.degrees(angle)

        azure_angles_dic = {}

        #find absolute xyz
        xyz = azure_data[0, 3:7]
        xyz = R.from_quat(xyz).as_euler('xyz', degrees=True) + np.array(
            [90, 0, 0])

        azure_angles_dic['x'] = -xyz[0]
        azure_angles_dic['y'] = xyz[1]
        azure_angles_dic['z'] = xyz[2]

        #find the back angles
        key_rots = R.from_quat(azure_data[1:3, 3:7])
        key_times = [0, 1]
        back_slerp = Slerp(key_times, key_rots)
        back_azure = back_slerp([0.5])[0].as_euler(
            'xyz', degrees=True) + np.array([90, 0, 90])
        back_azure = np.array([-back_azure[2], back_azure[0], -back_azure[1]])

        azure_angles_dic['back'] = back_azure

        #find the head angles
        head_azure = azure_data[26, 3:7]
        head_azure = R.from_quat(head_azure).as_euler(
            'xyz', degrees=True) + np.array([90, 45, 90])
        head_azure = [-head_azure[2], -head_azure[0], -head_azure[1]]

        azure_angles_dic['head'] = head_azure

        #find the left shoulder angles

        left_shoulder_azure = Quaternion(
            azure_data[5, 3:7])  #*Quaternion(azure_data[4,3:7]).inverse
        left_shoulder_azure = R.from_quat(
            left_shoulder_azure.elements).as_euler(
                'zyx', degrees=True) + np.array([0, 0, 180])
        left_shoulder_azure = [
            left_shoulder_azure[0], -left_shoulder_azure[2],
            left_shoulder_azure[1]
        ]
        azure_angles_dic['left arm'] = left_shoulder_azure

        #find the right shoulder angles

        right_shoulder_azure = Quaternion(
            azure_data[12, 3:7])  #*Quaternion(azure_data[11,3:7]).inverse
        right_shoulder_azure = R.from_quat(
            right_shoulder_azure.elements).as_euler(
                'zyx', degrees=True) + np.array([0, 0, 180])
        right_shoulder_azure = [
            -right_shoulder_azure[0], -right_shoulder_azure[2],
            -right_shoulder_azure[1]
        ]
        azure_angles_dic['right arm'] = right_shoulder_azure

        #find the left elbow angles
        left_elbow_azure = -angle_from_3pts(
            azure_data[5, :3], azure_data[6, :3], azure_data[7, :3]) + 180
        azure_angles_dic['left arm'].append(left_elbow_azure)

        #find the right elbow angles
        right_elbow_azure = angle_from_3pts(
            azure_data[12, :3], azure_data[13, :3], azure_data[14, :3]) + 180
        azure_angles_dic['right arm'].append(right_elbow_azure)

        #change the reference
        azure_angles_dic['back'] = np.array(back_azure) + np.array([
            azure_angles_dic['z'], azure_angles_dic['x'], azure_angles_dic['y']
        ]) + np.array([90, 0, 0])
        azure_angles_dic['head'] = np.array(head_azure) - np.array(
            [back_azure[0], -back_azure[1], back_azure[2]])

        return azure_angles_dic

    def process_pose3d_data(self, pose3d_outputs):
        """convert from pose3d angles format to avatar angles"""

        a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17 = pose3d_outputs[
            0]

        a0, a1, a2, a3, a4, a5, a6, a7, a8 = ( pose3d_outputs[0][0], -pose3d_outputs[0][1], -pose3d_outputs[0][2], pose3d_outputs[0][3], -pose3d_outputs[0][4],\
            -pose3d_outputs[0][5], -pose3d_outputs[0][8], pose3d_outputs[0][7]+math.pi/2, -pose3d_outputs[0][6])

        a9, a10, a11, a12, a13, a14, a15, a16 = (pose3d_outputs[0][9], pose3d_outputs[0][10], pose3d_outputs[0][11], pose3d_outputs[0][12], pose3d_outputs[0][13],\
            pose3d_outputs[0][14], pose3d_outputs[0][15], pose3d_outputs[0][16])

        self.buffer[:, self.buffer_counter %
                    self.buffer_size] = (a0, a1, a2, a3, a4, a5, a6, a7, a8,
                                         a9, a10, a11, a12, a13, a14, a15, a16)
        self.buffer_counter += 1

        a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 = np.mean(
            self.buffer, axis=1)

        self.angle_dic = {
            'head': [a0, a1, a2],
            'back': [a3, a4, a5],
            'x': [a6],
            'y': [a7],
            'z': [a8],
            'left arm': [a9, a10, a11, a12],
            'right arm': [a13, a14, a15, a16]
        }


        self.angle_dic['head'][0], self.angle_dic['head'][1], self.angle_dic['head'][2] = (180/np.pi)*self.angle_dic['head'][1],\
            -(180/np.pi)*self.angle_dic['head'][2], -(180/np.pi)*self.angle_dic['head'][0]
        self.angle_dic['back'][0], self.angle_dic['back'][1], self.angle_dic['back'][2] = (180/np.pi)*self.angle_dic['back'][1],\
            -(180/np.pi)*self.angle_dic['back'][2], -(180/np.pi)*self.angle_dic['back'][0]
        self.angle_dic['x'], self.angle_dic['y'], self.angle_dic['z'] = -(180/np.pi)*self.angle_dic['x'][0], -(180/np.pi)*self.angle_dic['z'][0]+20,\
                 -(180/np.pi)*self.angle_dic['y'][0]
        self.angle_dic['left arm'][0], self.angle_dic['left arm'][1], self.angle_dic['left arm'][2], self.angle_dic['left arm'][3] =\
             ((180/np.pi)*self.angle_dic['left arm'][0])-90,(180/np.pi)*self.angle_dic['left arm'][1],\
             (180/np.pi)*self.angle_dic['left arm'][2], (180/np.pi)*self.angle_dic['left arm'][3]
        self.angle_dic['right arm'][0], self.angle_dic['right arm'][1], self.angle_dic['right arm'][2], self.angle_dic['right arm'][3] = \
             ((180/np.pi)*self.angle_dic['right arm'][0])-90, (180/np.pi)*self.angle_dic['right arm'][1],\
                  (180/np.pi)*self.angle_dic['right arm'][2], (180/np.pi)*self.angle_dic['right arm'][3]

    def keyboard_action_check(self):
        """Check for actions and update the object accordingly"""
        ### recording ###
        # for start and stop recording you press a then r
        if keyboard.is_pressed('a'):
            keyboard.wait('r')
            self.recording_text = OnscreenText(text='',
                                               pos=(0.0, -0.4),
                                               scale=0.07)
            if self.is_recording:
                self.recording_text.destroy()
                saving_text = OnscreenText(text='saving',
                                           pos=(0.0, -0.4),
                                           scale=0.07)

                # if previous state was recording then we store the data in json tables and reset the variables
                json.dump(
                    self.stored_vals,
                    open(
                        'posture-app/results/' + self.record_id +
                        '/pose3d_data.txt', 'w'))
                json.dump(
                    np.array(self.stored_kinect_data).tolist(),
                    open(
                        'posture-app/results/' + self.record_id +
                        '/kinect_data.txt', 'w'))
                json.dump(
                    self.stored_pifpaf,
                    open(
                        'posture-app/results/' + self.record_id +
                        '/pifpaf_data.txt', 'w'))

                self.stored_vals = {
                    "azure": {
                        "head": [],
                        "back": [],
                        "orient": []
                    },
                    "pose3d": {
                        "head": [],
                        "back": [],
                        "orient": []
                    }
                }
                self.stored_kinect_data = []
                self.stored_pifpaf = []
                self.record_id = str(int(time.time()))
                self.record_count = 0
                saving_text.destroy()
            else:
                self.recording_text = OnscreenText(text='recording',
                                                   pos=(0.0, -0.4),
                                                   scale=0.07)

            self.is_recording = not self.is_recording

    def get_frame_rate(self):
        """gives back the frame rate of the model"""
        if time.time() > (self.previous_time + 1):
            self.frame_rate = self.iter_count
            self.iter_count = 0
            self.previous_time = time.time()

        self.iter_count += 1

    def update_segment_dic(self, segments_dic, angles_dic):
        """Update the angles of a segment dictionary with new angles"""

        segments_dic['upper_neck'].setPosHprScale(0, 0, AVATAR_SCALE_FACTOR*(self.body_props['neck']), angles_dic['head'][0],\
        angles_dic['head'][1], angles_dic['head'][2], 1., 1., 1.)

        segments_dic['upper_back'].setPosHprScale(0, 0, AVATAR_SCALE_FACTOR*(self.body_props['back']), angles_dic['back'][0],\
        angles_dic['back'][1], angles_dic['back'][2], 1., 1., 1.)

        segments_dic['left_hip'].setHpr(angles_dic['x'], angles_dic['y'],
                                        angles_dic['z'])

        segments_dic['left_biceps'].setPosHprScale(0, 0, AVATAR_SCALE_FACTOR*(self.body_props['shoulder']),\
            angles_dic['left arm'][0], angles_dic['left arm'][1], angles_dic['left arm'][2], 1., 1., 1.)

        segments_dic['left_forearm'].setPosHprScale(0, 0, AVATAR_SCALE_FACTOR*(self.body_props['biceps']), 0, 0,\
                angles_dic['left arm'][3], 1., 1., 1.)

        segments_dic['right_biceps'].setPosHprScale(0, 0, AVATAR_SCALE_FACTOR*(self.body_props['shoulder']),\
            angles_dic['right arm'][0], angles_dic['right arm'][1], angles_dic['right arm'][2], 1., 1., 1.)

        segments_dic['right_forearm'].setPosHprScale(0, 0, AVATAR_SCALE_FACTOR*(self.body_props['biceps']), 0, 0,\
                angles_dic['right arm'][3], 1., 1., 1.)

    def get_pifpaf_values(self, args, pifpaf):
        """Process the cam image and get the main pifpaf detection and the intrinsic matrix"""
        # get the camera image and process it
        _, frame = self.cam.read()

        image = cv2.resize(frame, None, fx=args.scale, fy=args.scale)
        height, width, _ = image.shape

        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        processed_image_cpu = image_transform(image.copy())
        processed_image = processed_image_cpu.contiguous().to(
            args.device, non_blocking=True)

        # run the pifpaf model
        fields = pifpaf.fields(torch.unsqueeze(processed_image, 0))[0]
        _, _, pifpaf_out = pifpaf.forward(image, processed_image_cpu, fields)

        if pifpaf_out:
            # will only leave the largest person detected in the frame
            pifpaf_out = [
                pifpaf_out[np.argmax(
                    list(
                        map(
                            lambda pp: max(pp['keypoints'][1::3]) - min(pp[
                                'keypoints'][1::3]), pifpaf_out)))]
            ]

        # define the intrinsic camera parameters
        kk = [[x * width for x in LOGI_KK[0]],
              [x * height for x in LOGI_KK[1]], LOGI_KK[2]]

        return pifpaf_out, kk, frame

    def store_data(self, azure_data, pifpaf_out, frame):
        """Calculate the error and store the values for the data recording"""
        if self.with_azure:
            azure_angles_dic = self.azure_angles_dic
            head_error = abs(self.angle_dic['head'] - azure_angles_dic['head'])
            back_error = abs(self.angle_dic['back'] - azure_angles_dic['back'])
            orient_error = np.array([
                abs(self.angle_dic['x'] - azure_angles_dic['x']),
                abs(self.angle_dic['y'] - azure_angles_dic['y']),
                abs(self.angle_dic['z'] - azure_angles_dic['z'])
            ])

        if self.is_recording:
            self.stored_vals['pose3d']['head'].append(
                list(self.angle_dic['head']))
            self.stored_vals['pose3d']['back'].append(
                list(self.angle_dic['back']))
            self.stored_vals['pose3d']['orient'].append([
                self.angle_dic['x'], self.angle_dic['y'], self.angle_dic['z']
            ])
            self.record_count += 1
            print("saving")
            cv2.imwrite(
                "posture-app/results/" + self.record_id +
                "/images/frame{}.jpg".format(self.record_count), frame)

            if self.with_azure:
                self.stored_vals['azure']['head'].append(
                    list(azure_angles_dic['head']))
                self.stored_vals['azure']['back'].append(
                    list(azure_angles_dic['back']))
                self.stored_vals['azure']['orient'].append([
                    azure_angles_dic['x'], azure_angles_dic['y'],
                    azure_angles_dic['z']
                ])
                self.stored_kinect_data.append(azure_data)
                self.stored_pifpaf.append(pifpaf_out[0])

        if self.with_azure:
            self.text.destroy()

            text_2_show = 'head: '+str(head_error.astype(int))+\
                        '\nback: '+str(back_error.astype(int))+\
                        '\norient: '+str(orient_error.astype(int))

            self.text = OnscreenText(text=text_2_show,
                                     pos=(0., -0.2),
                                     scale=0.07)

    def update(self, task):
        """Function to update the visualization and run the model"""

        self.keyboard_action_check()

        self.get_frame_rate()
        print("frame rate:", self.frame_rate)

        #############get Azure Values###########################################
        if self.with_azure:
            azure_data = np.array(get_data()).reshape((32, 8))

            self.azure_angles_dic = self.process_azure_data(azure_data)

            self.update_segment_dic(self.segments_azure_dic,
                                    self.azure_angles_dic)

        # get the models and parameters
        args = self.args
        pifpaf = self.pifpaf
        pose3d = self.pose3d

        # get the pifpaf values and the intrinsic matrix
        pifpaf_out, kk, frame = self.get_pifpaf_values(args, pifpaf)

        if pifpaf_out:

            # set camera position if kinect model is available
            if self.with_azure == False:
                camera.setPosHpr(0, -30, 300, 0, -90, 180)

            # preprocess the pifpaf outputs for the pose3d model
            pose3d_inputs = preprocess_pifpaf(pifpaf_out, self.body_props,
                                              self.face_pos, kk, True)

            # run the pose3d model
            pose3d_outputs = pose3d.forward(
                pose3d_inputs).cpu().detach().numpy()

            ########################process and store the angles for comparaison###################################

            self.process_pose3d_data(pose3d_outputs)

            self.segments_dic['left_hip'].setPos(0, 0, 0)

            self.update_segment_dic(self.segments_dic, self.angle_dic)

            self.store_data(azure_data, pifpaf_out, frame)

        return Task.cont
Пример #46
0
class Network(object):
    def __init__(self, cars, time, map, players, playername):
        self.carHitSound = base.loader.loadSfx("Sounds/CRASH2.wav")
        self.startSound = base.loader.loadSfx("Sounds/ENGINESTART.wav")
        
        self.time = time
        self.map = map
        self.players = players
        self.playername = playername
        self.playername += " (0)"
        self.playerscores = []
        self.timer = -1
        
        world_loader = w_loader()
        world_loader.load_world(map)
        
        self.textWaitObject = OnscreenText(text="Waiting for players...", style=1, fg=(1,1,1,1), pos=(0.7,-0.95), scale = .07)
        
        global spawn_locations
        
        self.carData = cars
        self.carData.spos = spawn_locations
        self.carData.addCar()
        self.carData.index = 0
        self.carUpdates = [() for c in self.carData.carlist]
        self.ignore = []
        
        self.cManager = QueuedConnectionManager()
        self.cListener = QueuedConnectionListener(self.cManager, 0)
        self.cReader = QueuedConnectionReader(self.cManager, 0)
        self.cWriter = ConnectionWriter(self.cManager,0)
        self.activeConnections = []
        
        self.port_address = 9099 #No-other TCP/IP services are using this port
        self.backlog = 1000 #If we ignore 1,000 connection attempts, something is wrong!
        self.tcpSocket = self.cManager.openTCPServerRendezvous(self.port_address, self.backlog)
        
        self.cListener.addConnection(self.tcpSocket)
        
        taskMgr.add(self.tskListenerPolling,"Poll the connection listener",-39)
        taskMgr.add(self.tskReaderPolling,"Poll the connection reader",-40)

    def tskListenerPolling(self, taskdata):
        # if a new connection is made, add it to the list
        if self.cListener.newConnectionAvailable():
         
            rendezvous = PointerToConnection()
            netAddress = NetAddress()
            newConnection = PointerToConnection()
         
            if self.cListener.getNewConnection(rendezvous,netAddress,newConnection):
                newConnection = newConnection.p()
                self.activeConnections.append(newConnection) # Remember connection
                self.cReader.addConnection(newConnection)     # Begin reading connection
        return Task.cont
    
    def tskReaderPolling(self, taskdata):
        # every frame, read messages, and then send out updates to all clients
        selfCarDatagram = self.getCarPosDatagramFromCar(self.carData.index) # add self to list of updates
        self.myProcessDataFunction(selfCarDatagram)
        # loop through all messages recieved
        while self.cReader.dataAvailable():
            datagram=NetDatagram()  # catch the incoming data in this instance
            if self.cReader.getData(datagram):
                self.myProcessDataFunction(datagram) # handle the message
        #send out car and collision messages
        carPosDatagrams = self.getCarPosDatagrams()
        collisionDatagrams = self.getCollisionDatagrams()
        for aClient in self.activeConnections:
            for data in carPosDatagrams:
                self.cWriter.send(data, aClient)
            for data in collisionDatagrams:
                self.cWriter.send(data, aClient)
        # start game if enough players have joined
        if self.timer == -1 and self.carData.go == False and len(self.carData.carlist) >= self.players:
            startDatagram = self.startDatagram()
            for aClient in self.activeConnections:
                self.cWriter.send(startDatagram, aClient)
            self.carData.go = True
            self.textWaitObject.destroy()
            self.timer = taskdata.time
            self.startSound.play()
        # run collisions
        for pair in self.carData.collisionlist:
            if pair[0] < pair[1]:
                if pair[0] == 0:
                    self.carHitSound.play()
                collisions.collideCars(self.carData.carlist[pair[0]], self.carData.carlist[pair[1]])
        # if time is up, end game and print scores
        if self.timer >= 0 and taskdata.time > self.timer + self.time * 60:
            if self.carData.go:
                self.carData.go = False
                self.playerscores.append((self.playername, self.carData.carlist[self.carData.index].deaths))
                stopDatagram = self.stopDatagram()
                for aClient in self.activeConnections:
                    self.cWriter.send(stopDatagram, aClient)
            elif len(self.playerscores) >= len(self.carData.carlist) or (taskdata.time > self.timer + self.time * 60 + 15 and self.playerscores != []):
                self.playerscores = pairsort(self.playerscores)
                textytext = "Most Numerous Deaths:"
                for pair in self.playerscores:
                    textytext += "\n\n%s: %d"%pair
                self.textScore = OnscreenText(text=textytext, style=1, fg=(1,1,1,1), pos=(0,0.9), scale = .08)
                scoreDatagram = self.scoreDatagram()
                for aClient in self.activeConnections:
                    self.cWriter.send(scoreDatagram, aClient)
                self.playerscores = []
                
        self.carData.collisionlist = []
        self.clearCarData() #This is to prevent redundant messages from being sent
        return Task.cont
    
    def myProcessDataFunction(self, netDatagram):
        # check a message and do what it says
        myIterator = PyDatagramIterator(netDatagram)
        msgID = myIterator.getUint8()
        if msgID == PRINT_MESSAGE: # This is a debugging message
            messageToPrint = myIterator.getString()
            print messageToPrint
        elif msgID == CAR_MESSAGE: # This updates a car
            carNum = myIterator.getUint8()
            for num in self.ignore: # if the car message is out of date, ignore it
                if num == carNum:
                    break
            else: # else update the car
                carXpos = myIterator.getFloat32()
                carYpos = myIterator.getFloat32()
                carXvel = myIterator.getFloat32()
                carYvel = myIterator.getFloat32()
                carHeading = myIterator.getFloat32()
                carInput = []
                for i in range(5):
                    carInput.append(myIterator.getBool())
                carLights = myIterator.getBool()
                carHp = myIterator.getInt32()
                self.updatePositions(carNum, (carXpos, carYpos, carXvel, carYvel, carHeading, carInput, carLights, carHp))
        elif msgID == NEW_PLAYER_MESSAGE: # This creates a new player
            if len(self.carData.carlist) >= self.players:
                self.cWriter.send(self.startDatagram(), netDatagram.getConnection())
            self.cWriter.send(self.mapDatagram(), netDatagram.getConnection())
            self.cWriter.send(self.addNewCar(), netDatagram.getConnection())
            self.returnAllCars(netDatagram.getConnection())
        elif msgID == COLLIDED_MESSAGE: # This verifies that a car has recieved its collision message and is now up to date
            carNum = myIterator.getUint8()
            self.ignore.remove(carNum)
        elif msgID == END_MESSAGE: # This recieves a player score
            self.playerscores.append((myIterator.getString(), myIterator.getInt32()))
            

    def myNewPyDatagram(self):
        # Send a test message
        myPyDatagram = PyDatagram()
        myPyDatagram.addUint8(PRINT_MESSAGE)
        myPyDatagram.addString("Hello, world!")
        return myPyDatagram
    
    def startDatagram(self):
        # Send a test message
        myPyDatagram = PyDatagram()
        myPyDatagram.addUint8(BEGIN_MESSAGE)
        return myPyDatagram
        
    def stopDatagram(self):
        # Send a test message
        myPyDatagram = PyDatagram()
        myPyDatagram.addUint8(END_MESSAGE)
        myPyDatagram.addInt32(-1)
        return myPyDatagram
    
    def scoreDatagram(self):
        # Send a test message
        myPyDatagram = PyDatagram()
        myPyDatagram.addUint8(END_MESSAGE)
        myPyDatagram.addInt32(len(self.playerscores))
        for pair in self.playerscores:
            myPyDatagram.addString(pair[0])
            myPyDatagram.addInt32(pair[1])
        return myPyDatagram
    
    def mapDatagram(self):
        # Send a test message
        myPyDatagram = PyDatagram()
        myPyDatagram.addUint8(MAP_MESSAGE)
        myPyDatagram.addString(self.map)
        return myPyDatagram
    
    def updatePositions(self, carNum, data):
        if len(self.carUpdates) > carNum:
            self.carUpdates[carNum] = data
        else:
            for i in range(len(self.carUpdates),carNum+1):
                self.carUpdates.append(())
            self.carUpdates[carNum] = data
        if len(self.carData.carlist) > carNum:
            if carNum != self.carData.index:
                self.carData.carlist[carNum].model.setPos(data[0], data[1], 0)
                self.carData.carlist[carNum].vel.setXY(data[2], data[3])
                self.carData.carlist[carNum].model.setH(data[4])
                self.carData.carlist[carNum].input = data[5]
                self.carData.carlist[carNum].setHeadlights(data[6])
                self.carData.carlist[carNum].hp = data[7]
        else:
            for i in range(len(self.carData.carlist), carNum+1):
                self.carData.addCar()
            self.carData.carlist[carNum].model.setPos(data[0], data[1], 0)
            self.carData.carlist[carNum].vel.setXY(data[2], data[3])
            self.carData.carlist[carNum].model.setH(data[4])
            self.carData.carlist[carNum].input = data[5]
            self.carData.carlist[carNum].setHeadlights(data[6])
            self.carData.carlist[carNum].hp = data[7]
            
          
    def finalizeUpdates(self): #currently unused
        for i in range(len(self.carUpdates)):
            if self.carUpdates[i] != ():
                if len(self.carData.carData) > i:
                    self.carData.carlist[i].model.setPos(self.carUpdates[i][0], self.carUpdates[i][1], 0)
                    self.carData.carlist[i].vel.setXY(self.carUpdates[i][2], self.carUpdates[i][3])
                else:
                    for j in range(len(self.carData.carData), i+1):
                        self.carData.carData.append(())
                    self.carData.carData[i] = self.carUpdates[i]
    
    def clearCarData(self):
        self.carUpdates = [() for c in self.carData.carlist]
    
    def getCarPosDatagrams(self):
        # makes a list of datagrams for each car that updated this frame
        myDatagrams = []
        for i in range(len(self.carUpdates)):
            if self.carUpdates[i] != ():
                newDatagram = self.getCarPosDatagram(i, self.carUpdates[i])
                myDatagrams.append(newDatagram)
        return myDatagrams
    
    def getCarPosDatagram(self, num, data):
        # creates a car_message datagram from data
        newDatagram = PyDatagram()
        newDatagram.addUint8(CAR_MESSAGE)
        newDatagram.addUint8(num)
        for j in range(5):
            newDatagram.addFloat32(float(data[j]))
        for j in range(5):
            newDatagram.addBool(data[5][j])
        newDatagram.addBool(data[6])
        newDatagram.addInt32(data[7])
        return newDatagram
    
    def getCarPosDatagramFromCar(self, num):
        # creates a car_message datagram from the entry in carData (used to get new cars up to date)
        newDatagram = PyDatagram()
        newDatagram.addUint8(CAR_MESSAGE)
        newDatagram.addUint8(num)
        newDatagram.addFloat32(self.carData.carlist[num].model.getX())
        newDatagram.addFloat32(self.carData.carlist[num].model.getY())
        vel = self.carData.carlist[num].vel.getXY()
        newDatagram.addFloat32(vel[0])
        newDatagram.addFloat32(vel[1])
        newDatagram.addFloat32(self.carData.carlist[num].model.getH())
        for j in range(5):
            newDatagram.addBool(self.carData.carlist[num].input[j])
        newDatagram.addBool(self.carData.carlist[num].lightsOn)
        newDatagram.addInt32(self.carData.carlist[num].hp)
        return newDatagram
    
    def getNewCarPosDatagram(self, num):
        # same as getCarPosDatagramFromCar, but is a player_assignment_message
        newDatagram = PyDatagram()
        newDatagram.addUint8(PLAYER_ASSIGNMENT_MESSAGE)
        newDatagram.addUint8(num)
        newDatagram.addFloat32(self.carData.carlist[num].model.getX())
        newDatagram.addFloat32(self.carData.carlist[num].model.getY())
        vel = self.carData.carlist[num].vel.getXY()
        newDatagram.addFloat32(vel[0])
        newDatagram.addFloat32(vel[1])
        newDatagram.addFloat32(self.carData.carlist[num].model.getH())
        for j in range(5):
            newDatagram.addBool(self.carData.carlist[num].input[j])
        newDatagram.addBool(self.carData.carlist[num].lightsOn)
        newDatagram.addInt32(self.carData.carlist[num].hp)
        return newDatagram
    
    def getCollisionDatagrams(self):
        # returns a list of collision datagrams
        myDatagrams = []
        for data in self.carData.collisionlist:
            newDatagram = PyDatagram()
            newDatagram.addUint8(COLLIDED_MESSAGE)
            newDatagram.addUint8(data[0])
            newDatagram.addUint8(data[1])
            myDatagrams.append(newDatagram)
            if data[0] != 0:
                self.ignore.append(data[0])
        return myDatagrams
    
    def returnAllCars(self, connection):
        # sends a car_message for each car in carData to a new connection
        carPosDatagrams = [self.getCarPosDatagramFromCar(i) for i in range(len(self.carData.carlist))]
        for data in carPosDatagrams:
            self.cWriter.send(data, connection)
    
    def addNewCar(self):
        num = len(self.carData.carlist)
        self.carData.addCar()
        return self.getNewCarPosDatagram(num)
Пример #47
0
class login(DirectObject):
    TEXT_COLOR = (1,1,1,1)
    FONT_TYPE_01 = 0
    TEXT_SHADOW_COLOR = (0,0,0,0.5)
    usernameInput = ""
    passwordInput = ""
    frame = DirectFrame()
    window = OnscreenImage()
    username = OnscreenText()
    password = OnscreenText()
    cpassword = OnscreenText()
    failed = OnscreenText()
    userTextbox = DirectEntry()
    passTextbox = DirectEntry()
    submitBtn = DirectButton()
    registerBtn = DirectButton()
    cancelBtn = DirectButton()
    
    
    registerUsername = ""
    registerPassword = ""
    registerCPassword = ""
    
    regInputUser = DirectEntry()
    regInputPass = DirectEntry()
    regInputCPass = DirectEntry()
    
    regRegisterBtn = DirectButton()
    regCancelBtn = DirectButton()
    
    def __init__(self, world):
        self.world = world
        print 'Loading Login...'
        frame = DirectFrame(frameColor=(0, 0, 0, 1), #(R,G,B,A)
                            frameSize=(-1, 1, -1, 1),#(Left,Right,Bottom,Top)
                            pos=(-0.5, 0, 0.5))
        self.createLoginWindow()
    

    def clearPassText(self):
        self.passTextbox.enterText('')
    def clearUserText(self):
        self.userTextbox.enterText('')
    def clearRegUserText(self):
        self.regInputUser.enterText('')
    def clearRegPassText(self):
        self.regInputPass.enterText('')
    def clearRegCPassText(self):
        self.regInputCPass.enterText('')

    def getUserText(self):
        self.usernameInput = self.userTextbox.get()
    def getPassText(self):
        self.passwordInput = self.passTextbox.get()
    def setUserText(self, textEntered):
        print "username: "******"password: "******"" and self.passwordInput is not ""):
            print "You pressed Submit", self.usernameInput, " ; ",self.passwordInput
            self.destroyLoginWindow()
            self.world.cManager.sendRequest(Constants.CMSG_AUTH, self.usernameInput+" "+self.passwordInput);
        else:
            print "Please enter in a username and password"
    def clickedCancel(self):
        print "You pressed Cancel"
        exit()
    def clickedRegister(self):
        print "You pressed Register"
        self.createRegisterWindow()
    def clickedRegRegister(self):
        self.registerUsername = self.regInputUser.get()
        self.registerPassword = self.regInputPass.get()
        self.registerCPassword = self.regInputCPass.get()
        if self.registerPassword == self.registerCPassword:
            print "Success (",self.registerUsername, ", ",self.registerPassword,", ",self.registerCPassword,")"
            self.world.cManager.sendRequest(Constants.CMSG_REGISTER, self.registerUsername+" "+self.registerPassword)
            self.createLoginWindow()
        else:
            self.failed = OnscreenText(text="Your password does not match Confirm Password.", pos=(-0.5, 0.5), scale=0.06,fg=(1,0.1,0.1,1), align=TextNode.ALeft,mayChange=0)
            print "Failed (",self.registerUsername, ", ",self.registerPassword,", ",self.registerCPassword,")"
    def clickedRegCancel(self):
        self.destroyRegisterWindow()
        self.createLoginWindow()
    def destroyLoginWindow(self):
        self.frame.destroy()
        self.username.destroy()
        self.password.destroy()
        self.userTextbox.destroy()
        self.passTextbox.destroy()
        self.submitBtn.destroy()
        self.registerBtn.destroy()
        self.cancelBtn.destroy()
    def destroyRegisterWindow(self):
        self.frame.destroy()
        self.username.destroy()
        self.password.destroy()
        self.cpassword.destroy()
        self.regInputUser.destroy()
        self.regInputPass.destroy()
        self.regInputCPass.destroy()
        self.cancelBtn.destroy()
        self.registerBtn.destroy()
        self.failed.destroy();
    def createLoginWindow(self):
        

        self.window = OnscreenImage(image = "Interface/login_window.png", pos = (0,0,0), scale = (2, 1, 2) )
        self.window.setTransparency(TransparencyAttrib.MAlpha)

        self.userTextbox = DirectEntry(text = "" ,scale=.05, pos = (-0.3, 0, 0.3),command=self.setUserText,initialText="Username",  numLines = 2,focus=0,focusInCommand=self.clearUserText, focusOutCommand=self.getUserText)
        self.passTextbox = DirectEntry(text = "" ,scale=.05, pos = (-0.3, 0, 0.1),command=self.setPassText,initialText="password", numLines = 2,focus=0,focusInCommand=self.clearPassText, focusOutCommand=self.getPassText)
        
        self.username = OnscreenText(text = "Username:"******"Password: "******"Interface/submitBtn.png", command=self.clickedSubmit, pos = (0.35, 0, -0.2),scale = (0.1, 1, 0.07))
        self.submitBtn.setTransparency(TransparencyAttrib.MAlpha)
        self.registerBtn = DirectButton(image = "Interface/registerBtn.png", command=self.clickedRegister, pos = (0.1, 0, -0.2),scale = (0.1, 1, 0.07))
        self.registerBtn.setTransparency(TransparencyAttrib.MAlpha)
        self.cancelBtn = DirectButton(image = "Interface/cancelBtn.png", command=self.clickedCancel, pos = (-0.35, 0, -0.2),scale = (0.1, 1, 0.07))
        self.cancelBtn.setTransparency(TransparencyAttrib.MAlpha)

    def createRegisterWindow(self):
        


        self.window = OnscreenImage(image = "Interface/login_window.png", pos = (0,0,0), scale = (2, 1, 2) )
        self.window.setTransparency(TransparencyAttrib.MAlpha)


        self.username = OnscreenText(text = "Username:"******"Password: "******"Confirm Password: "******"" ,scale=.05, pos = (-0.3, 0, 0.3), command=self.setUserText,initialText="username", numLines = 1,focus=0,focusInCommand=self.clearRegUserText, focusOutCommand=self.getUserText)
        self.regInputPass = DirectEntry(text = "" ,scale=.05, pos = (-0.3, 0, 0.1),command=self.setPassText,initialText="password", numLines = 1,focus=0,focusInCommand=self.clearRegPassText, focusOutCommand=self.getPassText)
        self.regInputCPass = DirectEntry(text = "" ,scale=.05, pos = (-0.3, 0, -0.1),command=self.setPassText,initialText="confirm password", numLines = 1,focus=0,focusInCommand=self.clearRegCPassText, focusOutCommand=self.getPassText)
       

        self.registerBtn = DirectButton(image = "Interface/registerBtn.png", command=self.clickedRegRegister, pos = (0.1, 0, -0.4),scale = (0.1, 1, 0.07))
        self.registerBtn.setTransparency(TransparencyAttrib.MAlpha)
        self.cancelBtn = DirectButton(image = "Interface/cancelBtn.png", command=self.clickedRegCancel, pos = (-0.35, 0, -0.4),scale = (0.1, 1, 0.07))
        self.cancelBtn.setTransparency(TransparencyAttrib.MAlpha)

    def processingLoginResponse(self, data):

        self.msg1 = data.getInt32()
        if self.msg1:
            self.pl_list = []
            self.welcome = data.getString()
            self.pl_count = data.getInt32()
            print "ResponseLogin - ", self.msg1
            print "ResponseLogin msg- ", self.pl_count
            for num in range (0,self.pl_count):
                self.pl_list.append([num+1,data.getString()])
                print self.pl_list
            #h(self,self.welcome,self.pl_list)
            self.world.CharSelect(self.welcome,self.pl_list)

        else :
            print "login error"
Пример #48
0
class Menu():
    def __init__(self, parent):
        self.parent = parent
        
        self.whichfrom = "" #For telling backClicked which menu it came from
        self.font = loader.loadFont("../assets/font/Orbitron Light.otf")
        self.back = OnscreenImage(image = "../assets/2d/title_bg01.png", pos = (0, 0, 0), scale=(1.4,1,1))
        self.startButton = DirectButton(image = "../assets/2d/buttons/start_on.png", image_scale = (.8, 1, .14), image_pos = (0, 0, .2), relief = None, command = self.startClicked)
        self.rulesButton = DirectButton(image = "../assets/2d/buttons/rules_on.png", image_scale = (.8, 1, .14), image_pos = (0, 0, -.2), relief = None, command = self.rulesClicked)
        #self.optButton = DirectButton(image = "../assets/2d/buttons/opt_on.png", image_scale = (.8, 1, .14), image_pos = (0, 0, -.4), relief = None, command = self.optClicked)
        self.exitButton = DirectButton(image = "../assets/2d/buttons/exit_on.png", image_scale = (.8, 1, .14), image_pos = (0, 0, -.6), relief = None, command = self.exitClicked)

    def startClicked(self):
        self.startButton.destroy()
        self.rulesButton.destroy()
        #self.optButton.destroy()
        self.exitButton.destroy()
        self.back.destroy()
        self.parent.beginGame() #This will make the rest of the game happen!
        
    def rulesClicked(self):
        self.startButton.destroy()
        self.rulesButton.destroy()
        #self.optButton.destroy()
        self.exitButton.destroy()
        self.back.destroy()
        self.back = OnscreenImage(image = "../assets/2d/title_bg02.png", pos = (0, 0, 0), scale=(1.4,1,1))
        self.line1 = OnscreenText(text = "Defeat enemy players by pushing them into the arena wall!", fg = (0,1,1,1), pos = (0, .8), scale = .07, font = self.font)
        self.line2 = OnscreenText(text = "Use traps to snag them, and throw balls to push them!", fg = (0,1,1,1), pos = (0, .6), scale = .07, font = self.font)
        self.line3 = OnscreenText(text = "Controls:", fg = (0,1,1,1), pos = (0, .4), scale = .1, font = self.font)
        self.line4 = OnscreenText(text = "Left Click: Throw Ball/Place Trap", fg = (0,1,1,1), pos = (0, .2), scale = .07, font = self.font)
        self.line5 = OnscreenText(text = "Scroll: Select Item", fg = (0,1,1,1), pos = (0, 0), scale = .07, font = self.font)
        self.line6 = OnscreenText(text = "W/S: Jet Forward/Backward", fg = (0,1,1,1), pos = (0, -.2), scale = .07, font = self.font)
        self.line7 = OnscreenText(text = "The more hits you take, the greater your momentum!", fg = (0,1,1,1), pos = (0, -.6), scale = .07, font = self.font)
        self.whichfrom = "rules"
        self.backButton = DirectButton(image = "../assets/2d/buttons/back_on.png", image_scale = (.4,1,.1), image_pos = (-.9, 0, -.87), relief = None, command = self.backClicked)
        
    def optClicked(self):
        print "options click!"
        
    def backClicked(self):
        self.backButton.destroy()
        self.back.destroy()
        if self.whichfrom == "rules":
            self.line1.destroy()
            self.line2.destroy()
            self.line3.destroy()
            self.line4.destroy()
            self.line5.destroy()
            self.line6.destroy()
            self.line7.destroy()
        self.__init__(self.parent) #Redoes the menu
        
    def exitClicked(self):
        sys.exit()
Пример #49
0
class EscenaMundo(DirectObject):
    """
    * escena del mundo virtual
    """

    Nombre = "mundo"  # world

    def __init__(self, contexto):
        DirectObject.__init__(self)
        # referencias
        self.contexto = contexto
        # componentes
        self.mundo_fisica = BulletWorld()  # physics world
        self.debug_fisica = None
        self.input = None
        self.terreno = None  # terrain
        self.estaticos = None  # static (model instances)
        self.animados = list()  # animated (model instances, actors)
        self.items = None
        self.atmosfera = None  # atmosphere
        self.cntrlcam = None  # camera controller
        self.texto_info = None  # info text
        self.debug_hud = None
        # parametros
        self.cargar_terreno = True
        self.cargar_atmosfera = True

    def iniciar(self):
        log.info("iniciar")
        self._establecer_parametros()
        #
        b = self.contexto.base
        # física
        self.mundo_fisica.setGravity(Vec3(0, 0, -9.81))
        df = BulletDebugNode("debug_fisica")
        self.mundo_fisica.setDebugNode(df)
        self.debug_fisica = b.render.attachNewNode(df)
        self.debug_fisica.hide()
        self.accept("f11", self._toggle_debug_fisica)
        # input
        self.input = Input(self.contexto)
        if not self.input.iniciar():
            return False
        # terreno
        if self.cargar_terreno:
            self.terreno = Terreno(self.contexto, self.mundo_fisica)
            if not self.terreno.iniciar():
                return False
        # animados (actors)
        self._iniciar_animados()
        # atmosfera
        if self.cargar_atmosfera:
            self.atmosfera = Atmosfera(self.contexto)
            if not self.atmosfera.iniciar():
                return False
        # controlador camara
        self.cntrlcam = ControladorCamara(self.contexto)
        if not self.cntrlcam.iniciar():
            return False
        # info texto
        self.info_texto = OnscreenText(
            text="cámara: f1:libre f2:1ºpers f3:3ºpers\n"
            "debug física: f11")
        # debug hud
        self.debug_hud = OnscreenText(parent=b.a2dTopLeft,
                                      text="Debug?",
                                      pos=(0, -0.1),
                                      scale=0.05,
                                      align=TextNode.ALeft,
                                      bg=(1, 1, 1, 0.3))
        # pelota (ball)
        pelota = b.loader.loadModel("modelos/items/pelota.egg")
        pelota.reparentTo(b.render)
        pelota.setPos(0, 0.5, 15)
        b.messenger.send("establecer_objetivo", [pelota])
        # eventos
        self.accept("escape-up", self._salir)
        # tasks
        b.taskMgr.doMethodLater(0.1, self._update_debug_hud,
                                "Mundo_update_debug_hud")
        b.taskMgr.add(self._update, "Mundo_update")
        #
        return True

    def terminar(self):
        log.info("terminar")
        # tasks
        self.contexto.base.taskMgr.remove("Mundo_update_debug_hud")
        self.contexto.base.taskMgr.remove("Mundo_update")
        # eventos
        self.ignoreAll()
        # camara
        if self.cntrlcam:
            self.cntrlcam.terminar()
            self.cntrlcam = None
        # debug hud
        if self.debug_hud:
            self.debug_hud.destroy()
            self.debug_hud = None
        # info texto
        if self.info_texto:
            self.info_texto.destroy()
            self.info_texto = None
        # atmosfera
        if self.atmosfera:
            self.atmosfera.terminar()
            self.atmosfera = None
        # animados
        for animado in self.animados:
            animado.terminar()
        self.animados = list()
        # terreno
        if self.terreno:
            self.terreno.terminar()
            self.terreno = None
        # input
        if self.input:
            self.input.terminar()
            self.input = None
        # física
        self.mundo_fisica.clearDebugNode()
        self.debug_fisica.removeNode()

    def _establecer_parametros(self):
        log.info("_establecer_parametros")
        try:
            cfg = self.contexto.config["mundo"]
            self.cargar_terreno = cfg.getboolean("terreno")
            self.cargar_atmosfera = cfg.getboolean("atmosfera")
        except ValueError as e:
            log.exception("error en el análisis de la configuración: " +
                          str(e))

    def _iniciar_animados(self):  # init animated (actors)
        log.info("_iniciar_animados")
        actor = Persona(self.contexto, self.input)
        if actor.iniciar():
            self.animados.append(actor)

    def _toggle_texto_info(self):
        pass

    def _toggle_debug_fisica(self):
        if self.debug_fisica.isHidden():
            self.debug_fisica.show()
        else:
            self.debug_fisica.hide()

    def _salir(self):
        self.contexto.base.messenger.send("cambiar_escena", ["inicio"])

    def _update_debug_hud(self, task):
        info = "Debug\n"
        #
        info += self.input.obtener_info() + "\n"
        if self.atmosfera:
            info += self.atmosfera.obtener_info() + "\n"
        #
        self.debug_hud["text"] = info
        return task.again

    def _update(self, task):
        # física
        dt = self.contexto.base.taskMgr.globalClock.getDt()
        self.mundo_fisica.doPhysics(dt, 10, 1.0 / 180.0)
        #
        return task.cont
Пример #50
0
class characterSelection(DirectObject):
    TEXT_COLOR = (1, 1, 1, 1)
    FONT_TYPE_01 = 0
    TEXT_SHADOW_COLOR = (0, 0, 0, 0.5)
    characterSelectionInput = ""
    output = ""
    frame = DirectFrame()

    # character selection varaiables
    createCharacter = DirectButton()
    deleteCharacter = DirectButton()
    selectCharacter = OnscreenText()
    selectCharacterTextbox = DirectEntry()
    selectCharacterInput = ""
    referenceForSelection = OnscreenText()
    myScrolledList = DirectScrolledList()
    submitBtn = DirectButton()
    cancelBtn = DirectButton()

    # character deletion varaiables
    selectCharactertodelete = OnscreenText()
    deleteBtn = DirectButton()
    delCancelBtn = DirectButton()
    CharacterToDeleteTextbox = DirectEntry()
    referenceForDeletion = OnscreenText()
    CharacterToDeleteInput = " "

    # character creation varaiables
    v = [0]
    v1 = [0]
    nameOfChar = OnscreenText()
    nameOfCharTextbox = DirectEntry()
    factionSelection = OnscreenText()
    nameOfCharInput = ""

    def __init__(self):
        print "Loading character selection..."
        self.cManager = ConnectionManager()
        self.startConnection()
        frame = DirectFrame(
            frameColor=(0, 0, 0, 1),  # (R,G,B,A)
            frameSize=(-3, 3, -3, 3),  # (Left,Right,Bottom,Top)
            pos=(-0.5, 0, 0.5),
        )
        self.createSelectionWindow()

    def startConnection(self):
        """Create a connection to the remote host.

        If a connection cannot be created, it will ask the user to perform
        additional retries.

        """
        if self.cManager.connection == None:
            if not self.cManager.startConnection():
                return False

        return True

    # character Creation
    def createCreateCharWindow(self):
        self.frame = DirectFrame(
            frameColor=(0, 0, 0, 1),  # (R,G,B,A)
            frameSize=(-3, 3, -3, 3),  # (Left,Right,Bottom,Top)
            pos=(-0.5, 0, 0.9),
        )
        self.buttons = [
            DirectRadioButton(
                text=" Sword ", variable=self.v, value=[0], scale=0.07, pos=(-0.4, 0, 0.32), command=self.setText
            ),
            DirectRadioButton(
                text=" Axe ", variable=self.v, value=[1], scale=0.07, pos=(0.2, 0, 0.32), command=self.setText
            ),
        ]

        for button in self.buttons:
            button.setOthers(self.buttons)

        self.nameOfChar = OnscreenText(
            text="Name The Character :",
            pos=(-0.2, -0.75),
            scale=0.08,
            fg=(1, 0.5, 0.5, 1),
            align=TextNode.ACenter,
            mayChange=0,
        )
        self.nameOfChar.reparentTo(self.frame)
        self.nameOfCharTextbox = DirectEntry(
            text="",
            scale=0.07,
            pos=(0.25, 0, -0.75),
            command=self.setnameOfChar,
            initialText="name of character",
            numLines=1,
            focus=0,
            focusInCommand=self.clearnameOfChar,
            focusOutCommand=self.getnameOfChar,
        )
        self.nameOfCharTextbox.reparentTo(self.frame)

        self.factionSelection = OnscreenText(
            text="Faction Selection :",
            pos=(-0.15, -0.95),
            scale=0.08,
            fg=(1, 0.5, 0.5, 1),
            align=TextNode.ACenter,
            mayChange=0,
        )
        self.factionSelection.reparentTo(self.frame)

        self.factionBtns = [
            DirectRadioButton(
                text=" Blue ", variable=self.v1, value=[0], scale=0.07, pos=(-0.05, 0, -0.05), command=self.setfaction
            ),
            DirectRadioButton(
                text=" Red ", variable=self.v1, value=[1], scale=0.07, pos=(0.3, 0, -0.05), command=self.setfaction
            ),
        ]

        for button1 in self.factionBtns:
            button1.setOthers(self.factionBtns)
        self.okForCreateBtn = DirectButton(
            text=("Ok", "Ok", "Ok", "disabled"), scale=0.08, command=self.clickedOkForCreateBtn, pos=(-0.05, 0.0, -1.25)
        )
        self.cancelForCreateBtn = DirectButton(
            text=("Cancel", "Cancel", "Cancel", "disabled"),
            scale=0.08,
            command=self.clickedCancelForCreateBtn,
            pos=(0.4, 0.0, -1.25),
        )
        self.okForCreateBtn.reparentTo(self.frame)
        self.cancelForCreateBtn.reparentTo(self.frame)

    def destroyCreateCharWindow(self):
        self.frame.destroy()
        self.nameOfChar.destroy()
        self.nameOfCharTextbox.destroy()
        self.factionSelection.destroy()
        self.okForCreateBtn.destroy()
        self.cancelForCreateBtn.destroy()

    def clearnameOfChar(self):
        self.nameOfCharTextbox.enterText("")

    def getnameOfChar(self):
        self.nameOfCharInput = self.nameOfCharTextbox.get()

    def setnameOfChar(self, textEntered):
        print "name Of Char: ", textEntered
        self.nameOfChar = textEntered

    def clickedOkForCreateBtn(self):
        print "you have pressed the ok button for creating a character"

    def clickedCancelForCreateBtn(self):
        print "you have press the cancel button from the create character frame"
        self.destroyCreateCharWindow()
        self.createSelectionWindow()

    def setText(status=None):
        bk_text = "CurrentValue "

    def setfaction(status=None):
        bk_text = "CurrentValue "

    # character deletion
    def createDeleteCharWindow(self):
        self.frame = DirectFrame(
            frameColor=(0, 0, 0, 1),  # (R,G,B,A)
            frameSize=(-3, 3, -3, 3),  # (Left,Right,Bottom,Top)
            pos=(-0.5, 0, 0.9),
        )

        self.selectCharactertodelete = OnscreenText(
            text="Select Character :",
            pos=(-0.02, -0.35),
            scale=0.08,
            fg=(1, 0.5, 0.5, 1),
            align=TextNode.ACenter,
            mayChange=0,
        )
        self.selectCharactertodelete.reparentTo(self.frame)
        self.selectCharacterToDeleteTextbox = DirectEntry(
            text="",
            scale=0.07,
            pos=(0.45, 0, -0.35),
            command=self.setselectCharacterToDelete,
            initialText="name of character",
            numLines=1,
            focus=0,
            focusInCommand=self.clearselectCharacterToDelete,
            focusOutCommand=self.getselectCharacterToDelete,
        )
        self.selectCharacterToDeleteTextbox.reparentTo(self.frame)
        self.referenceForDeletion = OnscreenText(
            text="Reference to Character List:",
            pos=(-0.15, -0.75),
            scale=0.08,
            fg=(1, 0.5, 0.5, 1),
            align=TextNode.ACenter,
            mayChange=0,
        )
        self.referenceForDeletion.reparentTo(self.frame)
        self.deleteScrolledList = DirectScrolledList(
            decButton_pos=(0.35, 0, 0.53),
            decButton_text="Dec",
            decButton_text_scale=0.04,
            decButton_borderWidth=(0.005, 0.005),
            incButton_pos=(0.35, 0, -0.02),
            incButton_text="Inc",
            incButton_text_scale=0.04,
            incButton_borderWidth=(0.005, 0.005),
            pos=(0.7, 0, -0.99),
            numItemsVisible=4,
            forceHeight=0.11,
            itemFrame_frameSize=(-0.6, 0.6, -0.37, 0.11),
            itemFrame_pos=(0.35, 0, 0.4),
        )

        for playerchar in ["xxxbluesword", "xxxblueaxe", "xxxredsword", "xxxredsword01", "xxx_red_sword04"]:
            l = DirectLabel(text=playerchar, text_scale=0.1)
            self.deleteScrolledList.addItem(l)

        self.deleteScrolledList.reparentTo(self.frame)
        self.deleteBtn = DirectButton(
            text=("Delete", "Delete", "Delete", "disabled"),
            scale=0.08,
            command=self.clickedDelete,
            pos=(-0.2, 0.0, -1.25),
        )

        self.delCancelBtn = DirectButton(
            text=("Cancel", "Cancel", "Cancel", "disabled"),
            scale=0.08,
            command=self.clickedDelCancel,
            pos=(0.3, 0.0, -1.25),
        )
        self.deleteBtn.reparentTo(self.frame)
        self.delCancelBtn.reparentTo(self.frame)

    def destroyDeleteCharWindow(self):
        self.frame.destroy()
        self.selectCharactertodelete.destroy()
        self.deleteBtn.destroy()
        self.delCancelBtn.destroy()
        self.selectCharacterToDeleteTextbox.destroy()
        self.referenceForDeletion.destroy()

    def clearselectCharacterToDelete(self):
        self.selectCharacterToDeleteTextbox.enterText("")

    def getselectCharacterToDelete(self):
        self.selectCharacterToDeleteInput = self.nameOfCharTextbox.get()

    def setselectCharacterToDelete(self, textEntered):
        print "name Of Char: ", textEntered
        self.selectCharacterToDelete = textEntered

    def clickedDelete(self):
        print "You pressed delete a character"

    def clickedDelCancel(self):
        print "to go back to slection menu"
        self.destroyDeleteCharWindow()
        self.createSelectionWindow()

    # character Selection
    def createSelectionWindow(self):
        self.frame = DirectFrame(
            frameColor=(0, 0, 0, 1),  # (R,G,B,A)
            frameSize=(-3, 3, -3, 3),  # (Left,Right,Bottom,Top)
            pos=(-0.5, 0, 0.9),
        )

        self.createCharacter = DirectButton(
            text=("Create Character", "Create Character", "Create Character", "disabled"),
            scale=0.08,
            command=self.clickedCreateChar,
            pos=(-0.14, 0.0, -0.25),
        )
        self.deleteCharacter = DirectButton(
            text=("Delete Character", "Delete Character", "Delete Character", "disabled"),
            scale=0.08,
            command=self.clickedDeleteChar,
            pos=(-0.14, 0.0, -0.40),
        )
        self.createCharacter.reparentTo(self.frame)
        self.deleteCharacter.reparentTo(self.frame)
        self.selectCharacter = OnscreenText(
            text="Select Character :",
            pos=(-0.12, -0.55),
            scale=0.08,
            fg=(1, 0.5, 0.5, 1),
            align=TextNode.ACenter,
            mayChange=0,
        )
        self.selectCharacter.reparentTo(self.frame)

        self.myScrolledList = DirectScrolledList(
            decButton_pos=(0.35, 0, 0.53),
            decButton_text="Dec",
            decButton_text_scale=0.04,
            decButton_borderWidth=(0.005, 0.005),
            incButton_pos=(0.35, 0, -0.02),
            incButton_text="Inc",
            incButton_text_scale=0.04,
            incButton_borderWidth=(0.005, 0.005),
            pos=(0.05, 0, -0.3),
            numItemsVisible=4,
            forceHeight=0.11,
            itemFrame_frameSize=(-0.6, 0.6, -0.37, 0.11),
            itemFrame_pos=(0.35, 0, 0.4),
        )

        self.selectCharacterTextbox = DirectEntry(
            text="",
            scale=0.07,
            pos=(0.28, 0, -0.55),
            command=self.setselectCharacterTextbox,
            initialText="name of character",
            numLines=1,
            focus=0,
            focusInCommand=self.clearselectCharacterTextbox,
            focusOutCommand=self.getselectCharacterTextbox,
        )
        self.selectCharacterTextbox.reparentTo(self.frame)
        self.referenceForSeletion = OnscreenText(
            text="Reference to Character List:\n that already exists",
            pos=(-0.30, -0.75),
            scale=0.08,
            fg=(1, 0.5, 0.5, 1),
            align=TextNode.ACenter,
            mayChange=0,
        )
        self.referenceForSeletion.reparentTo(self.frame)

        for playerchar in ["xxxbluesword", "xxxblueaxe", "xxxredsword", "xxxredsword01", "xxx_red_sword04"]:
            l = DirectLabel(text=playerchar, text_scale=0.1)
            self.myScrolledList.addItem(l)

        self.submitBtn = DirectButton(
            text=("Start", "Start", "Start", "disabled"), scale=0.08, command=self.clickedSubmit, pos=(-0.2, 0.0, -1.45)
        )

        self.cancelBtn = DirectButton(
            text=("Cancel", "Cancel", "Cancel", "disabled"),
            scale=0.08,
            command=self.clickedCancel,
            pos=(0.3, 0.0, -1.45),
        )
        self.submitBtn.reparentTo(self.frame)
        self.cancelBtn.reparentTo(self.frame)

    def destroySelectionWindow(self):
        self.frame.destroy()
        self.selectCharacter.destroy()
        self.createCharacter.destroy()
        self.deleteCharacter.destroy()
        self.submitBtn.destroy()
        self.cancelBtn.destroy()

    def clearselectCharacterTextbox(self):
        self.selectCharacterTextbox.enterText("")

    def getselectCharacterTextbox(self):
        self.selectCharacterTextbox = self.selectCharacterTextbox.get()

    def setselectCharacterTextbox(self, textEntered):
        print "name Of Char: ", textEntered
        self.selectCharacterTextbox = textEntered

    def clickedCreateChar(self):
        print "You pressed create a new character"
        self.destroySelectionWindow()
        self.createCreateCharWindow()

    def clickedDeleteChar(self):
        print "You pressed delete a character"
        self.destroySelectionWindow()
        self.createDeleteCharWindow()

    def clickedSubmit(self):
        print "you pressed start button"

    def clickedCancel(self):
        print "You pressed Cancel"
Пример #51
0
class TeamActivityGui:
    COUNTDOWN_TASK_NAME = 'updateCountdownTask'
    timer = None
    statusText = None
    countdownText = None
    exitButton = None
    switchButton = None

    def __init__(self, activity):
        self.activity = activity

    def load(self):
        buttonModels = loader.loadModel('phase_3.5/models/gui/inventory_gui')
        upButton = buttonModels.find('**//InventoryButtonUp')
        downButton = buttonModels.find('**/InventoryButtonDown')
        rolloverButton = buttonModels.find('**/InventoryButtonRollover')
        self.exitButton = DirectButton(
            relief=None,
            text=TTLocalizer.PartyTeamActivityExitButton,
            text_fg=(1, 1, 0.65, 1),
            text_pos=(0, -0.15),
            text_scale=0.5,
            image=(upButton, downButton, rolloverButton),
            image_color=(1, 0, 0, 1),
            image_scale=(14.5, 1, 9),
            pos=(0, 0, 0.8),
            scale=0.15,
            command=self.handleExitButtonClick)
        self.exitButton.hide()
        if self.activity.toonsCanSwitchTeams():
            self.switchButton = DirectButton(
                relief=None,
                text=TTLocalizer.PartyTeamActivitySwitchTeamsButton,
                text_fg=(1, 1, 1, 1),
                text_pos=(0, 0.1),
                text_scale=0.5,
                image=(upButton, downButton, rolloverButton),
                image_color=(0, 1, 0, 1),
                image_scale=(15, 1, 15),
                pos=(0, 0, 0.5),
                scale=0.15,
                command=self.handleSwitchButtonClick)
            self.switchButton.hide()
        else:
            self.switchButton = None
        buttonModels.removeNode()
        self.countdownText = OnscreenText(
            text='',
            pos=(0.0, -0.2),
            scale=PartyGlobals.TeamActivityTextScale * 1.2,
            fg=(1.0, 1.0, 0.65, 1.0),
            align=TextNode.ACenter,
            font=ToontownGlobals.getSignFont(),
            mayChange=True)
        self.countdownText.hide()
        self.statusText = OnscreenText(
            text='',
            pos=(0.0, 0.0),
            scale=PartyGlobals.TeamActivityTextScale,
            fg=PartyGlobals.TeamActivityStatusColor,
            align=TextNode.ACenter,
            font=ToontownGlobals.getSignFont(),
            mayChange=True)
        self.statusText.hide()
        self.timer = PartyUtils.getNewToontownTimer()
        self.timer.hide()
        return

    def unload(self):
        self.hideWaitToStartCountdown()
        if self.exitButton is not None:
            self.exitButton.destroy()
            self.exitButton = None
        if self.switchButton is not None:
            self.switchButton.destroy()
            self.switchButton = None
        if self.countdownText is not None:
            self.countdownText.destroy()
            self.countdownText.removeNode()
            self.countdownText = None
        if self.statusText is not None:
            self.statusText.destroy()
            self.statusText.removeNode()
            self.statusText = None
        if self.timer is not None:
            self.timer.destroy()
            del self.timer
        return

    def showStatus(self, text):
        self.statusText.setText(text)
        self.statusText.show()

    def hideStatus(self):
        self.statusText.hide()

    def enableExitButton(self):
        self.exitButton.show()

    def disableExitButton(self):
        self.exitButton.hide()

    def handleExitButtonClick(self):
        self.disableExitButton()
        self.disableSwitchButton()
        self.activity.d_toonExitRequest()

    def enableSwitchButton(self):
        self.switchButton.show()

    def disableSwitchButton(self):
        if self.switchButton is not None:
            self.switchButton.hide()
        return

    def handleSwitchButtonClick(self):
        self.disableSwitchButton()
        self.disableExitButton()
        self.activity.d_toonSwitchTeamRequest()

    def showWaitToStartCountdown(self,
                                 duration,
                                 waitToStartTimestamp,
                                 almostDoneCallback=None):
        self._countdownAlmostDoneCallback = almostDoneCallback
        currentTime = globalClock.getRealTime()
        waitTimeElapsed = currentTime - waitToStartTimestamp
        if duration - waitTimeElapsed > 1.0:
            countdownTask = Task(self._updateCountdownTask)
            countdownTask.duration = duration - waitTimeElapsed
            self.countdownText.setText(str(int(countdownTask.duration)))
            self.countdownText.show()
            taskMgr.remove(TeamActivityGui.COUNTDOWN_TASK_NAME)
            taskMgr.add(countdownTask, TeamActivityGui.COUNTDOWN_TASK_NAME)

    def hideWaitToStartCountdown(self):
        taskMgr.remove(TeamActivityGui.COUNTDOWN_TASK_NAME)
        self._countdownAlmostDoneCallback = None
        if self.countdownText is not None:
            self.countdownText.hide()
        return

    def _updateCountdownTask(self, task):
        countdownTime = int(task.duration - task.time)
        seconds = str(countdownTime)
        if self.countdownText['text'] != seconds:
            self.countdownText['text'] = seconds
            if countdownTime == 3 and self._countdownAlmostDoneCallback is not None:
                self._countdownAlmostDoneCallback()
                self._countdownAlmostDoneCallback = None
        if task.time >= task.duration:
            return Task.done
        else:
            return Task.cont
        return

    def showTimer(self, duration):
        self.timer.setTime(duration)
        self.timer.countdown(duration, self._handleTimerExpired)
        self.timer.show()

    def hideTimer(self):
        self.timer.hide()
        self.timer.stop()

    def _handleTimerExpired(self):
        self.activity.handleGameTimerExpired()
Пример #52
0
class Player(GameObject):
    def __init__(self,
                 modelName,
                 model_anims,
                 max_health,
                 speed,
                 collider_name,
                 base,
                 pos,
                 hpr=Vec3(0, 0, 0),
                 scale=1.0):
        GameObject.__init__(self, modelName, model_anims, max_health, speed,
                            collider_name, base, pos, hpr, scale)
        self.player_init()

    def player_init(self):
        self.base.pusher.addCollider(self.collider, self.actor)
        self.base.cTrav.addCollider(self.collider, self.base.pusher)
        self.collider.setPythonTag("player", self)

        self.score = 0
        self.score_string = str(self.score)

        # self.base.camLens.setFov(150) #----------------------------------------------
        # self.base.camLens.setFov(5)

        self.textObject = OnscreenText(text='Score:' + self.score_string,
                                       pos=(-1.15, -0.95),
                                       scale=0.1)

        self.ray = CollisionRay(0, 0, 0, 0, -1, 0)

        rayNode = CollisionNode("playerRay")
        rayNode.addSolid(self.ray)

        self.rayNodePath = self.actor.attachNewNode(rayNode)
        self.rayQueue = CollisionHandlerQueue()

        self.base.cTrav.addCollider(self.rayNodePath, self.rayQueue)

        # self.damagePerSecond = -5.0
        self.beamModel = self.base.loader.loadModel("models/frowney")
        self.beamModel.reparentTo(self.actor)
        self.beamModel.setZ(10)

        self.beamModel.setLightOff()
        self.beamModel.hide()

    def move(self, movement_vector):
        anim_controller = self.actor.getAnimControl("walk")
        if not anim_controller.isPlaying():
            self.actor.play("walk")
        self.actor.setPos(self.actor, movement_vector * self.speed)

    def stop(self):
        anim_controller = self.actor.getAnimControl("walk")
        anim_controller.stop()

    def change_health(self, dHealth):
        GameObject.change_health(self, dHealth)
        if self.health == 0:
            #     imageOnject = OnscreenImage(image = "game_over.png")
            self.cleanup()
            sys.exit()

    def update_score(self):
        self.score_string = str(self.score)
        self.textObject.destroy()
        self.textObject = OnscreenText(text='Score:' + self.score_string,
                                       pos=(-1.15, -0.95),
                                       scale=0.1)

    def shoot(self):
        dt = globalClock.getDt()
        # print(self.rayQueue.getNumEntries())
        # print(self.rayQueue)
        if self.rayQueue.getNumEntries() > 0:
            self.rayQueue.sortEntries()
            rayHit = self.rayQueue.getEntry(1)
            hitPos = rayHit.getSurfacePoint(self.base.render)
            # print(hitPos, "hitpos")
            # print(rayHit, "rayhit")
            # beamLength = (hitPos - self.actor.getPos()).length()
            # print("length: ", beamLength)

            hitNodePath = rayHit.getIntoNodePath()
            # print(hitNodePath)
            # print(hitNodePath.getPythonTag)
            # print(hitPos)
            # print(hitNodePath.getTag)
            # print(hitNodePath.hasPythonTag("enemy"))
            # print(rayHit.getFrom())
            if hitNodePath.hasPythonTag("enemy"):
                # print("here")
                hitObject = hitNodePath.getPythonTag("enemy")
                hitObject.change_health(-1)

                # Find out how long the beam is, and scale the
                # beam-model accordingly.
                # print(self.actor.getPos())
                beamLength = (hitPos - (self.actor.getPos())).length()
                self.beamModel.setSy(-beamLength)
                self.score += 1
                self.update_score()
                self.beamModel.show()
            else:
                # If we're not shooting, don't show the beam-model.
                self.beamModel.hide()
Пример #53
0
class DeveloperConsole(InteractiveInterpreter, DirectObject):
    """The name says it all."""
    def __init__(self, manager, xml):
        sys.stdout = PseudoFile(self.writeOut)
        sys.stderr = PseudoFile(self.writeErr)
        tpErr = TextProperties()
        tpErr.setTextColor(1, 0.5, 0.5, 1)
        TextPropertiesManager.getGlobalPtr().setProperties("err", tpErr)
        self.manager = manager
        font = loader.loadFont("cmss12")
        self.frame = DirectFrame(parent=base.a2dTopCenter,
                                 text_align=TextNode.ALeft,
                                 text_pos=(-base.getAspectRatio() +
                                           TEXT_MARGIN[0], TEXT_MARGIN[1]),
                                 text_scale=0.05,
                                 text_fg=(1, 1, 1, 1),
                                 frameSize=(-2.0, 2.0, -0.5, 0.0),
                                 frameColor=(0, 0, 0, 0.5),
                                 text='',
                                 text_font=font)
        self.entry = DirectEntry(parent=base.a2dTopLeft,
                                 command=self.command,
                                 scale=0.05,
                                 width=1000.0,
                                 pos=(-0.02, 0, -0.48),
                                 relief=None,
                                 text_pos=(1.5, 0, 0),
                                 text_fg=(1, 1, 0.5, 1),
                                 rolloverSound=None,
                                 clickSound=None,
                                 text_font=font)
        self.otext = OnscreenText(parent=self.entry,
                                  scale=1,
                                  align=TextNode.ALeft,
                                  pos=(1, 0, 0),
                                  fg=(1, 1, 0.5, 1),
                                  text=':',
                                  font=font)
        self.lines = [''] * 9
        self.commands = []  # All previously sent commands
        self.cscroll = None  # Index of currently navigated command, None if current
        self.command = ''  # Currently entered command
        self.block = ''  # Temporarily stores a block of commands
        self.hide()
        self.initialized = False

    def prevCommand(self):
        if self.hidden: return
        if len(self.commands) == 0: return
        if self.cscroll == None:
            self.cscroll = len(self.commands)
            self.command = self.entry.get()
        elif self.cscroll <= 0:
            return
        else:
            self.commands[self.cscroll] = self.entry.get()
        self.cscroll -= 1
        self.entry.set(self.commands[self.cscroll])
        self.entry.setCursorPosition(len(self.commands[self.cscroll]))

    def nextCommand(self):
        if self.hidden: return
        if len(self.commands) == 0: return
        if self.cscroll == None: return
        self.commands[self.cscroll] = self.entry.get()
        self.cscroll += 1
        if self.cscroll >= len(self.commands):
            self.cscroll = None
            self.entry.set(self.command)
            self.entry.setCursorPosition(len(self.command))
        else:
            self.entry.set(self.commands[self.cscroll])
            self.entry.setCursorPosition(len(self.commands[self.cscroll]))

    def writeOut(self, line, copy=True):
        if copy: sys.__stdout__.write(line)
        lines = line.split('\n')
        firstline = lines.pop(0)
        self.lines[-1] += firstline
        self.lines += lines
        self.frame['text'] = '\n'.join(self.lines[-9:])

    def writeErr(self, line, copy=True):
        if copy: sys.__stderr__.write(line)
        line = '\1err\1%s\2' % line
        lines = line.split('\n')
        firstline = lines.pop(0)
        self.lines[-1] += firstline
        self.lines += lines
        self.frame['text'] = '\n'.join(self.lines[-9:])

    def command(self, text):
        if not self.hidden:
            self.cscroll = None
            self.command = ''
            self.entry.set('')
            self.entry['focus'] = True
            self.writeOut(self.otext['text'] + ' ' + text + '\n', False)
            if text != '' and (len(self.commands) == 0
                               or self.commands[-1] != text):
                self.commands.append(text)

            # Insert plugins into the local namespace
            locals = __main__.__dict__
            locals['manager'] = self.manager
            for plugin in self.manager.named.keys():
                locals[plugin] = self.manager.named[plugin]
            locals['panda3d'] = panda3d

            # Run it and print the output.
            if not self.initialized:
                InteractiveInterpreter.__init__(self, locals=locals)
                self.initialized = True
            try:
                if self.runsource(self.block + '\n' + text) and text != '':
                    self.otext['text'] = '.'
                    self.block += '\n' + text
                else:
                    self.otext['text'] = ':'
                    self.block = ''
            except Exception:  # Not just "except", it will also catch SystemExit
                # Whoops! Print out a traceback.
                self.writeErr(traceback.format_exc())

    def toggle(self):
        if self.hidden:
            self.show()
        else:
            self.hide()

    def show(self):
        self.accept('arrow_up', self.prevCommand)
        self.accept('arrow_up-repeat', self.prevCommand)
        self.accept('arrow_down', self.nextCommand)
        self.accept('arrow_down-repeat', self.nextCommand)
        self.hidden = False
        self.entry['focus'] = True
        self.frame.show()
        self.entry.show()
        self.otext.show()

    def hide(self):
        self.ignoreAll()
        self.hidden = True
        self.entry['focus'] = False
        self.frame.hide()
        self.entry.hide()
        self.otext.hide()

    def destroy(self):
        sys.stdout = sys.__stdout__
        sys.stderr = sys.__stderr__
        self.ignoreAll()
        self.frame.destroy()
        self.entry.destroy()
        self.otext.destroy()
Пример #54
0
class RaceDrone(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        # initalize the window
        base.disableMouse()
        self.win.setClearColor((0, 0, 0, 1))
        props = WindowProperties()
        props.setCursorHidden(True)
        props.setSize(1700,1000)
        base.win.requestProperties(props)

        # store keys
        self.keyMap = {
            "left": 0, "right": 0, "forward": 0, "backward": 0, 
            "drift-left": 0, "drift-right": 0, "up": 0, "down": 0,
            "restart": 0, "firstPerson": 0, "gravity": 0}

        #instructions
        self.ins2 = addInstructions(0.12, "[Left/Right Arrow]: Rotate Left/Right")
        self.ins3 = addInstructions(0.18, "[Up/Down Arrow]: Fly Forward/Backward")
        self.ins4 = addInstructions(0.24, "[A, D]: Move Camera")
        self.ins5 = addInstructions(0.30, "[W, S]: Lift / Descent")
        self.ins6 = addInstructions(0.36, "[F]: Toggle First Person/ Third Person")
        self.ins7 = addInstructions(0.42, "[G]: Toggle Gravity")
        self.ins8 = addInstructions(0.48, "[R]: Restart")

        # Set up the playground
        # other maps:
        # models/toon/phase_15/hood/toontown_central.bam
        # models/world
        # CS_Map/myCSMAP.egg
        # Race/RaceTrack/FullTrack.blend

        self.environ = loader.loadModel("models/world")
        self.environ.reparentTo(render)
        self.mapScale = 1

        """
        self.environ = loader.loadModel("The City/The City.obj")
        self.environ.reparentTo(render)
        myTexture = loader.loadTexture("The City/Maps/cty1.jpg")
        self.environ.setTexture(myTexture)
        self.environ.setHpr(0,90,0)
        self.environ.setScale(.1)
        """

        # Create drone and initalize drone position
        self.Drone = Actor("models/mydrone.egg")
        self.Drone.reparentTo(render)

        # resize and reposition the drone
        self.Drone.setScale(.1)
        self.Drone.setPos(5,5,8)
        self.Drone.setH(180)
        # initial position is saved for restarting the game
        self.DroneStartPos = self.Drone.getPos()


        # User Controls
        self.accept('escape', __import__('sys').exit, [0])
        self.accept("arrow_left", self.setKey, ["left", True])
        self.accept("arrow_right", self.setKey, ["right", True])
        self.accept("arrow_up", self.setKey, ["forward", True])
        self.accept("arrow_down", self.setKey, ["backward", True])
        self.accept("a", self.setKey, ["drift-left", True])
        self.accept("d", self.setKey, ["drift-right", True])
        self.accept("arrow_left-up", self.setKey, ["left", False])
        self.accept("arrow_right-up", self.setKey, ["right", False])
        self.accept("arrow_up-up", self.setKey, ["forward", False])
        self.accept("arrow_down-up", self.setKey, ["backward", False])
        self.accept("a-up", self.setKey, ["drift-left", False])
        self.accept("d-up", self.setKey, ["drift-right", False])
        self.accept("w", self.setKey, ["up", True])
        self.accept("w-up", self.setKey, ["up", False])
        self.accept("s", self.setKey, ["down", True])
        self.accept("s-up", self.setKey, ["down", False])
        self.accept("r", self.setKey, ["restart", True])
        self.accept("r-up", self.setKey, ["restart", False])
        self.accept("f", self.setKey, ["firstPerson", True])
        self.accept("f-up", self.setKey, ["firstPerson", False])
        self.accept("g", self.setKey, ["gravity", True])
        self.accept("g-up", self.setKey, ["gravity", False])

        taskMgr.add(self.move, "moveTask")

        # Disable Mouse
        self.disableMouse()

        # Camera settings
        self.cameraDistance = 5
        self.cameraPitch = -10

        # create the collision box for the drone 
        # this collision box will be used for collision detection
        self.droneBox = CollisionBox((0,0,2.5), 3, 3, 0.7)
        self.cnodePath = self.Drone.attachNewNode(CollisionNode('cnode'))
        self.cnodePath.node().addSolid(self.droneBox)

        # collision detection set up
        self.cTrav = CollisionTraverser()
        self.queue = CollisionHandlerQueue()
        self.cTrav.addCollider(self.cnodePath, self.queue)
        self.cTrav.traverse(render)


        # Lighting portion are modified from an example provided by Panda3d – Roaming Ralph 
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor((1, 1, 1, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection((-5, -5, -5))
        directionalLight.setColor((1, 1, 1, 1))
        directionalLight.setSpecularColor((1, 1, 1, 1))
        render.setLight(render.attachNewNode(ambientLight))
        render.setLight(render.attachNewNode(directionalLight))

        # Crashed Text
        self.crashed = OnscreenText()
        self.firstPerson = False

        # HPR setting
        self.angle = 0
        self.angleChange = 0.5
        self.maxAngle = 15

        # Speed Control
        self.FBSpeed = self.mapScale * 6
        self.LRSpeed = self.mapScale * 4
        self.turnSpeed = 80
        self.liftSpeed = self.mapScale * 80
        self.downSpeed = self.mapScale * 80


        # AI set up
        self.AI = True
        if self.AI:
            self.droneAI = Actor("models/mydrone.egg")
            self.droneAI.reparentTo(render)
            self.droneAI.setScale(.1)
            self.droneAI.setPos(5,5,5)
            self.AI_actions = open("AI/RoamingRalph/AI_easy.txt", "r").readlines()

        #######################
        # additional features #
        #######################

        # acceleration
        self.FBacceleration = 0
        self.LRacceleration = 0
        self.accelMax = 40
        self.accelIncrement = 2

        # gravity 
        self.gravity = True
        self.gravity_value = 15 * self.mapScale


    # Record user inputs
    def setKey(self, key, value):
        self.keyMap[key] = value


    # Main Function (Deal with user interface and collision detection)
    def move(self, task):

        #debug
        #print(self.queue.getEntries())
        #print(self.drone.getPos())
        #print(self.FBacceleration, self.LRacceleration)

        # crash message
        self.crashed.destroy()
        self.crashed = OnscreenText(text="Crashed!!!" if len(self.queue.getEntries()) != 0 else "", pos = (-0.5, 0.02), 
                                scale = 0.07, mayChange = True, fg = (255,255,255,1))

        # Get the time that elapsed since last frame.  
        dt = globalClock.getDt()


        # control the movement of AI
        if self.AI:
            if self.AI_actions != []:
                curAction = self.AI_actions[0].split(" ")
                self.droneAI.setX(float(curAction[0]))
                self.droneAI.setY(float(curAction[1]))
                self.droneAI.setZ(float(curAction[2]))
                self.droneAI.setH(float(curAction[3]))
                self.droneAI.setP(float(curAction[4]))
                self.droneAI.setR(float(curAction[5]))
                self.AI_actions.pop(0)

        # Drone is movable only when it's not crashed
        if len(self.queue.getEntries()) == 0:

            # initial height
            curHeight = self.Drone.getZ()

            # move by acceleration
            if self.FBacceleration != 0:
                self.Drone.setX(self.Drone, self.FBSpeed * self.FBacceleration * dt)
                self.FBacceleration += 1 if self.FBacceleration < 0 else -1
            if self.LRacceleration != 0:
                self.Drone.setY(self.Drone, self.LRSpeed * self.LRacceleration * dt)
                self.LRacceleration += 1 if self.LRacceleration < 0 else -1
                self.Drone.setZ(curHeight)

            # tilting while drift left and right
            if self.keyMap["drift-left"]:
                #self.Drone.setY(self.Drone, self.LRSpeed * dt)
                # tilt left when drift left
                if self. angle > -self.maxAngle:
                    self.angle -= self.angleChange
                self.Drone.setP(self.angle)
                if self.LRacceleration < self.accelMax:
                    self.LRacceleration += self.accelIncrement
            elif self.keyMap["drift-right"]:
                #self.Drone.setY(self.Drone, -self.LRSpeed * dt)
                # tilt right when drift right
                if self. angle < self.maxAngle:
                    self.angle += self.angleChange
                self.Drone.setP(self.angle)
                if self.LRacceleration > -self.accelMax:
                    self.LRacceleration -= self.accelIncrement
            # gradually stablize itself while drift-keys are not pressed
            else:
                if self.angle >=self.angleChange:
                    self.angle -= self.angleChange
                elif self.angle <=-self.angleChange:
                    self.angle +=self.angleChange
                self.Drone.setP(self.angle)

            # turn left
            if self.keyMap["left"]:
                self.Drone.setH(self.Drone.getH() + self.turnSpeed * dt)
            # turn right
            if self.keyMap["right"]:
                self.Drone.setH(self.Drone.getH() - self.turnSpeed * dt)

            # go forward
            if self.keyMap["forward"]:
                #self.Drone.setX(self.Drone, self.FBSpeed * dt)
                if self.FBacceleration < self.accelMax:
                    self.FBacceleration += self.accelIncrement
            elif self.keyMap["backward"]:
                #self.Drone.setX(self.Drone, -self.FBSpeed * dt)
                if self.FBacceleration > -self.accelMax:
                    self.FBacceleration -= self.accelIncrement

            # lift up
            if self.keyMap["up"]:
                self.Drone.setZ(self.Drone, self.liftSpeed * dt)
            # go down
            if self.keyMap["down"]:
                self.Drone.setZ(self.Drone, -self.downSpeed * dt)

            # gravity
            if self.gravity:
                self.Drone.setZ(self.Drone, -self.gravity_value * dt)


        # restart game / reset position
        if self.keyMap["restart"]:
            self.Drone.setPos(self.DroneStartPos + (0, 0, 5))
            self.collisionCount = False
            self.crashed.destroy()
            self.Drone.setH(180)

        # First Person View / Third Person View Toggle 
        if self.keyMap["firstPerson"]:
            self.firstPerson = not self.firstPerson

        # Gravity Toggle
        if self.keyMap["gravity"]:
            self.gravity = not self.gravity

        # uncomment the following code to see the collision box
        ########################
        #self.cnodePath.show() #
        ########################


        # set the position and HPR of the camera according to the position of the drone
        # First Person View
        if self.firstPerson:
            base.camera.setH(self.Drone.getH()-90)
            base.camera.setP(self.Drone.getR())
            base.camera.setR(self.Drone.getP())
            base.camera.setPos(self.Drone.getPos())
        # Third Person View
        else:
            base.camera.setHpr(self.Drone.getHpr()+(180,0,0))
            h,p,r = self.Drone.getHpr()
            base.camera.setPos(self.Drone.getPos() + (math.cos(math.pi * h / 180) * -self.cameraDistance, \
                math.sin(math.pi * h / 180) * -self.cameraDistance, 0.5))

            viewTarget = Point3(self.Drone.getPos() + (0,0,0)) # the look-at point can be changed

            base.camera.lookAt(viewTarget)

        return task.cont
Пример #55
0
class Menu:
    def __init__(self):
        self.count = 0
        self.x = {}
        self.y = {}
        self.z = {}
        self.Gstart = 0
        self.slist = False
        self.nlist = False
        self.connected = False
        self.music = loader.loadSfx("sounds/music/menu.wav")
        self.engine = loader.loadSfx("sounds/sfx/engine5.wav")

        self.engine.setLoop(True)
        self.engine.setVolume(.7)
        self.music.setLoop(True)
        self.music.setVolume(.7)
        self.music.play()

        self.name = ""
        self.font = loader.loadFont("cmr12.egg")
        self.myImage = OnscreenImage(image='bg.jpg',
                                     pos=(0, 0, 0),
                                     scale=(2, 2, 1))

        self.myImage.setTransparency(TransparencyAttrib.MAlpha)
        self.welcome = OnscreenText(
            text="Welcome to 3d multiplayer Racing Game",
            fg=Vec4(1, 1, 1, 1),
            shadow=Vec4(0, 0, 0, 1),
            scale=0.10,
            pos=(0, .8, 0))
        self.bk_text = " "
        self.textObject = OnscreenText(text=self.bk_text,
                                       pos=(0.95, -0.95),
                                       scale=0.07,
                                       fg=(1, 0.5, 0.5, 0),
                                       align=TextNode.ACenter,
                                       mayChange=1,
                                       font=self.font,
                                       shadow=Vec4(0, 0, 0, 1),
                                       bg=(1, 1, 1, .2))

        self.b = DirectEntry(scale=.05,
                             command=self.setText,
                             initialText="Enter your name",
                             numLines=1,
                             focus=0,
                             focusInCommand=self.clearText,
                             entryFont=self.font,
                             width=20,
                             pos=(-0.5, 0, 0),
                             borderWidth=(0.5, 0.5),
                             color=(1, 1, 1, 0.5),
                             autoCapitalize=1)
        self.b.setTransparency(TransparencyAttrib.MDual)

    def setText(self, textEntered):

        self.name = textEntered
        cl.SetName(self.name)

        self.textObject.setText("Welcome  " + textEntered)
        self.client()

    def createDirectlist(self):

        numItemsVisible = 4
        itemHeight = 0.11
        myScrolledList = DirectScrolledList(
            decButton_pos=(0.35, 0, 0.53),
            decButton_text="Dec",
            decButton_text_scale=0.04,
            decButton_borderWidth=(0.005, 0.005),
            incButton_pos=(0.35, 0, -0.02),
            incButton_text="Inc",
            incButton_text_scale=0.04,
            incButton_borderWidth=(0.005, 0.005),
            frameSize=(0.0, 0.7, -0.05, 0.59),
            frameColor=(1, 0, 0, 0.5),
            pos=(-1, 0, 0),
            numItemsVisible=numItemsVisible,
            forceHeight=itemHeight,
            itemFrame_frameSize=(-0.2, 0.2, -0.37, 0.11),
            itemFrame_pos=(0.35, 0, 0.4),
        )
        return myScrolledList

    def clearText(self):
        self.b['color'] = Vec4(1, 1, 1, 1)
        self.b.enterText('')

    def client(self):
        self.b.destroy()
        self.textObject['fg'] = Vec4(1, 1, 1, 1)

        self.refresh = DirectButton(text=("", "", "", "disabled"),
                                    scale=.05,
                                    command=self.refresh,
                                    pos=(0.95, -0.95, 0),
                                    image="refresh.png",
                                    image_scale=2)
        self.refresh.setTransparency(TransparencyAttrib.MAlpha)

    def refresh(self):
        if self.slist:
            self.slist.destroy()

        if self.nlist:
            self.nlist.destroy()

        if self.connected:
            self.getMembers()
        else:
            for k, v in cl.servers.iteritems():
                self.addserver(k, v)

    def addserver(self, k, v):
        print "inside addserver()"
        self.slist = self.createDirectlist()

        self.x[self.count] = k
        self.y[self.count] = v
        self.z[self.count] = DirectButton(text=v,
                                          scale=.05,
                                          command=self.connectServer,
                                          extraArgs=str(self.count))
        self.slist.addItem(self.z[self.count])
        self.count = self.count + 1

    def clearServers(self):
        for i in range(0, self.count):
            self.z[i].destroy()

        self.slist.destroy()
        self.count = 0

    def connectServer(self, count):
        #print count
        #print self.x[int(count)]
        self.slist.destroy()
        self.connected = True

        self.clearServers()

        cl.connectServer(str(self.x[int(count)]))

        self.getMembers()

    def getMembers(self):

        self.nlist = self.createDirectlist()
        cl.RequestServer()
        x = int(cl.getTotalUsers())
        cl.RequestServer()
        cl.getUsers()
        for i in range(0, x):
            l = cl.getInput(1)
            k = cl.getInput(int(l))
            l = DirectLabel(text=str(k), text_scale=0.05)
            self.nlist.addItem(l)
        if x > 1:
            self.start = DirectButton(text=("", "", "", "disabled"),
                                      scale=.05,
                                      command=self.destroy,
                                      pos=(0.2, -0.95, 0),
                                      image="start.jpg",
                                      image_scale=2)
            self.start.setTransparency(TransparencyAttrib.MAlpha)
        cl.ExitReqServer()
        #self.c.RequestServer()
        #self.c.getTotalUsers()
        #self.c.getTotalUsers(s)
    def sendY(self, Y):
        cl.sendY(Y)

    def sendH(self, H):
        cl.sendH(H)

    def destroy(self):
        self.Gstart = 1
        self.nlist.destroy()
        self.myImage.destroy()
        self.welcome.destroy()
        self.b.destroy()
        self.textObject.destroy()
        self.start.destroy()
        self.start.destroy()
        self.refresh.destroy()

        self.self = None

        return
Пример #56
0
class cApplication(DirectObject):
    def __init__(self):
        # create world
        self.world = cWorld()
        # setup controls
        self.setupControls()
        # display title information
        self.title = OnscreenText(text='BOIDS.PY - SEEK & ARRIVE',
                                  fg=(1.0, 1.0, 1.0, 1.0),
                                  pos=(-.98, .9),
                                  scale=0.06)
        # display copright information
        self.copyRight = OnscreenText(text='Copyright (C) 2016 David Lettier.',
                                      fg=(1.0, 1.0, 1.0, 1.0),
                                      pos=(.98, -.98),
                                      scale=0.05)
        # display panda version text
        self.pandaVersion = OnscreenText(text='Panda Version 1.9.2',
                                         fg=(1.0, 1.0, 1.0, 1.0),
                                         pos=(-1.18, -.98),
                                         scale=0.04)
        # display print debug button
        # this button calls the prntDebug function
        self.prntDebugButton = DirectButton(text="Print Debug",
                                            relief=DGG.RAISED,
                                            scale=.1,
                                            pad=(.5, .5),
                                            pos=Vec3(-1.0, 0.0, -.8),
                                            command=self.prntDebug)

    def setupControls(self):
        # accept the esc key to exit application
        self.accept('escape', sys.exit)

    def prntDebug(self):
        # destory debug button
        self.prntDebugButton.destroy()
        # create new clear debug button
        # this button calls the clearDebug function
        self.clearDebugButton = DirectButton(text="Clear Debug",
                                             relief=DGG.RAISED,
                                             scale=.1,
                                             pad=(.5, .5),
                                             pos=Vec3(-1.0, 0.0, -.8),
                                             command=self.clearDebug)
        # create green target position text
        self.greenPos = OnscreenText(
            text='Green Target Pos: ' + str(int(self.world.target.getX())) +
            ", " + str(int(self.world.target.getY())) + ", " +
            str(int(self.world.target.getZ())),
            fg=(1.0, 1.0, 1.0, 1.0),
            pos=(-.8, .8),
            scale=0.05,
            mayChange=True)
        # create blue boid position text
        self.bluePos = OnscreenText(
            text='Blue Boid (Arrive) Pos: ' +
            str(int(self.world.blueBoid.boidModel.getX())) + ", " +
            str(int(self.world.blueBoid.boidModel.getY())) + ", " +
            str(int(self.world.blueBoid.boidModel.getZ())),
            fg=(1.0, 1.0, 1.0, 1.0),
            pos=(-.8, .7),
            scale=0.05,
            mayChange=True)
        # create green boid position text
        self.redPos = OnscreenText(
            text='Red Boid (Seek) Pos: ' +
            str(int(self.world.redBoid.boidModel.getX())) + ", " +
            str(int(self.world.redBoid.boidModel.getY())) + ", " +
            str(int(self.world.redBoid.boidModel.getZ())),
            fg=(1.0, 1.0, 1.0, 1.0),
            pos=(-.8, .6),
            scale=0.05,
            mayChange=True)
        # add the update on screen text task
        taskMgr.add(self.updateOSTxt, 'updateOSTxt')

    def updateOSTxt(self, Task):
        # update green target position text
        self.greenPos.setText('Green Target Pos: ' +
                              str(int(self.world.target.getX())) + ", " +
                              str(int(self.world.target.getY())) + ", " +
                              str(int(self.world.target.getZ())))
        # update blue boid position text
        self.bluePos.setText('Blue Boid (Arrive) Pos: ' +
                             str(int(self.world.blueBoid.boidModel.getX())) +
                             ", " +
                             str(int(self.world.blueBoid.boidModel.getY())) +
                             ", " +
                             str(int(self.world.blueBoid.boidModel.getZ())))
        # update red boid position text
        self.redPos.setText('Red Boid (Seek) Pos: ' +
                            str(int(self.world.redBoid.boidModel.getX())) +
                            ", " +
                            str(int(self.world.redBoid.boidModel.getY())) +
                            ", " +
                            str(int(self.world.redBoid.boidModel.getZ())))
        # call task next frame
        return Task.cont

    def clearDebug(self):
        # destory button
        self.clearDebugButton.destroy()
        # destory all debug on screen text
        self.greenPos.destroy()
        self.bluePos.destroy()
        self.redPos.destroy()
        # remove task
        taskMgr.remove('updateOSTxt')
        # create again the print debug button to start the cycle all over again
        self.prntDebugButton = DirectButton(text="Print Debug",
                                            relief=DGG.RAISED,
                                            scale=.1,
                                            pad=(.5, .5),
                                            pos=Vec3(-1.0, 0.0, -.8),
                                            command=self.prntDebug)