Esempio n. 1
0
class Text(Billboard):
    def __init__(self,
                 name,
                 nodePath,
                 offset,
                 text,
                 stencilId,
                 scale=0.025000000000000001,
                 *args,
                 **kwargs):
        Billboard.__init__(self, name, nodePath, *args, **kwargs)
        self.setBin('fixed', 110)
        self.scale = scale
        self.textNode = OnscreenText(text=text,
                                     fg=Vec4(0, 0, 0, 1),
                                     scale=scale,
                                     shadow=Vec4(0, 0, 0, 0),
                                     mayChange=True,
                                     font=PiratesGlobals.getPirateFont())
        self.textNode.detachNode()
        sNode = self.attachNewNode('stencil')
        sNode.setY(-offset)
        self.textNode.instanceTo(sNode)
        sNode.setDepthTest(False)

    def setBold(self, bold):
        self.textNode.setShadow(Vec4(0, 0, 0, bold))

    def setTextScale(self, scale):
        self.textNode.setScale(self.scale * scale)
Esempio n. 2
0
class Text(Billboard):

    def __init__(self, name, nodePath, offset, text, stencilId, scale = 0.025000000000000001, *args, **kwargs):
        Billboard.__init__(self, name, nodePath, *args, **kwargs)
        self.setBin('fixed', 110)
        self.scale = scale
        self.textNode = OnscreenText(text = text, fg = Vec4(0, 0, 0, 1), scale = scale, shadow = Vec4(0, 0, 0, 0), mayChange = True, font = PiratesGlobals.getPirateFont())
        self.textNode.detachNode()
        sNode = self.attachNewNode('stencil')
        sNode.setY(-offset)
        self.textNode.instanceTo(sNode)
        sNode.setDepthTest(False)


    def setBold(self, bold):
        self.textNode.setShadow(Vec4(0, 0, 0, bold))


    def setTextScale(self, scale):
        self.textNode.setScale(self.scale * scale)
class DebugOptions(DirectObject):
    def __init__(self, parent):
        self.parent = parent
        self.textPlayerPos = OnscreenText(text = '', parent=base.a2dTopLeft, pos = (0, -0.1), scale = 0.04,fg=(1, 1, 1, 1),align=TextNode.ALeft)
        
        self.showFps = True
        base.setFrameRateMeter(True)
        
        self.ambientLight = True
        self.parent.alight.setColor(VBase4(0.43, 0.43, 0.43, 1.0))
        
        self.flashlightFrustum = False
        
        self.autoShader = True
        render.setShaderAuto()
        
        self.playerPos = True
        taskMgr.add(self.refreshPlayerPos, 'RefreshPlayerPosTask')
        self.textPlayerPos.reparentTo(base.a2dTopLeft)
        
        self.bloom = False
        self.blur = False
        self.ao = False
        
        self.walls = True
        
        #spotlightpanel
        self.spot_light_panel = SpotlightPanel(self, self.parent.player.slight)
        
        base.accept('f1', self.toggleFps)
        base.accept('f2', self.toggleAmbientLight)
        base.accept('f3', self.toggleFlashlightFrustum)
        base.accept('f4', self.parent.player.getDamage)
        base.accept('f5', self.toggleAutoShader)
        base.accept('f6', self.togglePlayerPos)
        base.accept('f7', self.toggleBloom)
        base.accept('f8', self.toggleBlur)
        base.accept('f9', self.toggleAO)
        base.accept('f10', self.toggleWalls)
        base.accept('f11', render.analyze)
        base.accept('f12', self.debugPrint)
    
    def toggleFps(self):
        if self.showFps == False:
            self.showFps = True
            base.setFrameRateMeter(True)
        else:
            self.showFps = False
            base.setFrameRateMeter(False)
    
    def toggleAmbientLight(self):
        if self.ambientLight == False:
            self.ambientLight = True
            self.parent.alight.setColor(VBase4(0.43, 0.43, 0.43, 1.0))
        else:
            self.ambientLight = False
            self.parent.alight.setColor(VBase4(0.03, 0.03, 0.03, 1.0))
            
    def toggleFlashlightFrustum(self):
        if self.flashlightFrustum == False:
            self.flashlightFrustum = True
            self.parent.slight.showFrustum()
        else:
            self.flashlightFrustum = False
            self.parent.slight.hideFrustum()            
    
    def toggleAutoShader(self):
        if self.autoShader == False:
            self.autoShader = True
            render.setShaderAuto()
        else:
            self.autoShader = False
            render.setShaderOff()
            
    def toggleWalls(self):
        if self.walls == False:
            self.walls = True
            self.parent.level.wall_node.reparentTo(self.parent.level.node)
        else:
            self.walls = False
            self.parent.level.wall_node.detachNode()
    
    def togglePlayerPos(self): 
        if self.playerPos == False:
            self.playerPos = True
            taskMgr.add(self.refreshPlayerPos, 'RefreshPlayerPosTask')
            self.textPlayerPos.reparentTo(base.a2dTopLeft)
        else:
            self.playerPos = False
            taskMgr.remove('RefreshPlayerPosTask')
            self.textPlayerPos.detachNode() 
            
    def toggleBloom(self):
        if self.bloom == False:
            self.bloom = True
            self.parent.filters.setBloom()
        else:
            self.bloom = False
            self.parent.filters.delBloom()   
            
    def toggleBlur(self):
        if self.blur == False:
            self.blur = True
            self.parent.filters.setBlurSharpen()
        else:
            self.blur = False
            self.parent.filters.delBlurSharpen() 
            
    def toggleAO(self):
        if self.ao == False:
            self.ao = True
            self.parent.filters.setAmbientOcclusion()
        else:
            self.ao = False
            self.parent.filters.delAmbientOcclusion()             
        
    def refreshPlayerPos(self, task):
        px, py, pz = self.parent.player.node.getPos()
        self.textPlayerPos.setText('Player pos: (%0.3f, %0.3f, %0.3f)' % (px, py, pz))
        return task.cont         

    def debugPrint(self):
        print taskMgr
Esempio n. 4
0
class InputControlStim(ShowBase):
    """
    Generic input-controll stimulus class: takes in list of texture classes, and stimulus parameters.
    Stimulus shown, in real-time, depends on events produced by utils.Monitor() class.
    
    Inputs:
        Positional
            tex_classes: m-element list of texture classes
            stim_params: m-element list of dictionaries: each contains parameters (e.g., velocity)
        
        Keyword 
            initial_tex_ind (0): index for first stim to show
            window_size (512): size of the panda3d window (pixels)
            window_name ('InputControlStim'): title of window in gui
            profile_on (False): will show actual fps, profiler, and little x at center if True
            fps (30): controls frame rate of display
            save_path (None): if set to a file path, will save data about stimuli, and time they are delivered
    """
    def __init__(self,
                 tex_classes,
                 stim_params,
                 initial_tex_ind=0,
                 window_size=512,
                 window_name="InputControlStim",
                 profile_on=False,
                 fps=30,
                 save_path=None):
        super().__init__()

        self.current_tex_num = initial_tex_ind
        self.previous_tex_num = None
        self.tex_classes = tex_classes
        self.stim_params = stim_params
        self.window_size = window_size
        self.stimulus_initialized = False  # for setting up first stim (don't clear cards they don't exist)
        self.fps = fps
        self.profile_on = profile_on
        self.save_path = save_path
        if self.save_path:
            self.filestream = utils.save_initialize(save_path, tex_classes,
                                                    stim_params)
        else:
            self.filestream = None
        self.scale = np.sqrt(
            8)  #so it can handle arbitrary rotations and shifts
        self.window_name = window_name

        #Window properties
        self.window_props = WindowProperties()
        self.window_props.setSize(self.window_size, self.window_size)
        self.set_title(self.window_name)

        # Set frame rate
        ShowBaseGlobal.globalClock.setMode(ClockObject.MLimited)
        ShowBaseGlobal.globalClock.setFrameRate(self.fps)

        #Set up profiling if desired
        if self.profile_on:
            PStatClient.connect()  # this will only work if pstats is running
            ShowBaseGlobal.base.setFrameRateMeter(True)  #Show frame rate

        #Set initial texture(s)
        self.set_stimulus(str(self.current_tex_num))

        # Set up event handlers (accept) and tasks (taskMgr) for dynamics
        self.accept('stim0', self.set_stimulus, ['0'])
        self.accept('stim1', self.set_stimulus, ['1'])
        self.accept('stim2', self.set_stimulus, ['2'])
        # Wrinkle: should we set this here or there?
        self.taskMgr.add(self.move_textures, "move textures")

    def set_tasks(self):
        if self.current_stim_params['stim_type'] == 'b':
            self.taskMgr.add(self.textures_update, "move_both")

    #Move textures
    def move_textures(self, task):
        if self.current_stim_params['stim_type'] == 'b':
            left_tex_position = -task.time * self.current_stim_params[
                'velocities'][0]  #negative b/c texture stage
            right_tex_position = -task.time * self.current_stim_params[
                'velocities'][1]
            try:
                self.left_card.setTexPos(self.left_texture_stage,
                                         left_tex_position, 0, 0)
                self.right_card.setTexPos(self.right_texture_stage,
                                          right_tex_position, 0, 0)
            except Exception as e:
                logger.error(e)
        elif self.current_stim_params['stim_type'] == 's':
            if self.current_stim_params['velocity'] == 0:
                pass
            else:
                new_position = -task.time * self.current_stim_params['velocity']
                # Sometimes setting position fails when the texture stage isn't fully set
                try:
                    self.card.setTexPos(self.texture_stage, new_position, 0,
                                        0)  #u, v, w
                except Exception as e:
                    logger.error(e)
        return task.cont

    @property
    def texture_size(self):
        return self.tex_classes[self.current_tex_num].texture_size

    @property
    def current_stim_params(self):
        """ 
        Parameters of current texture (e.g., velocity, stim_type) 
        """
        return self.stim_params[self.current_tex_num]

    def create_cards(self):
        """ 
        Create cards: these are panda3d objects that are required for displaying textures.
        You can't just have a disembodied texture. In pandastim (at least for now) we are
        only showing 2d projections of textures, so we use cards.       
        """
        cardmaker = CardMaker("stimcard")
        cardmaker.setFrameFullscreenQuad()
        #Binocular cards
        if self.current_stim_params['stim_type'] == 'b':
            self.setBackgroundColor(
                (0, 0, 0, 1))  # without this the cards will appear washed out
            self.left_card = self.aspect2d.attachNewNode(cardmaker.generate())
            self.left_card.setAttrib(
                ColorBlendAttrib.make(
                    ColorBlendAttrib.M_add))  # otherwise only right card shows

            self.right_card = self.aspect2d.attachNewNode(cardmaker.generate())
            self.right_card.setAttrib(
                ColorBlendAttrib.make(ColorBlendAttrib.M_add))
            if self.profile_on:
                self.center_indicator = OnscreenText(
                    "x",
                    style=1,
                    fg=(1, 1, 1, 1),
                    bg=(0, 0, 0, .8),
                    pos=self.current_stim_params['position'],
                    scale=0.05)
        # Tex card
        elif self.current_stim_params['stim_type'] == 's':
            self.card = self.aspect2d.attachNewNode(cardmaker.generate())
            self.card.setColor((1, 1, 1, 1))  #?
            self.card.setScale(self.scale)
        return

    def create_texture_stages(self):
        """
        Create the texture stages: these are basically textures that you can apply
        to cards (sometimes mulitple textures at the same time -- is useful with
        masks).
        
        For more on texture stages:
        https://docs.panda3d.org/1.10/python/programming/texturing/multitexture-introduction
        """
        #Binocular cards
        if self.current_stim_params['stim_type'] == 'b':
            #TEXTURE STAGES FOR LEFT CARD
            # Texture itself
            self.left_texture_stage = TextureStage('left_texture_stage')
            # Mask
            self.left_mask = Texture("left_mask_texture")
            self.left_mask.setup2dTexture(self.texture_size, self.texture_size,
                                          Texture.T_unsigned_byte,
                                          Texture.F_luminance)
            self.left_mask_stage = TextureStage('left_mask_array')

            #TEXTURE STAGES FOR RIGHT CARD
            self.right_texture_stage = TextureStage('right_texture_stage')
            #Mask
            self.right_mask = Texture("right_mask_texture")
            self.right_mask.setup2dTexture(self.texture_size,
                                           self.texture_size,
                                           Texture.T_unsigned_byte,
                                           Texture.F_luminance)
            self.right_mask_stage = TextureStage('right_mask_stage')
        # Tex card
        elif self.current_stim_params['stim_type'] == 's':
            self.texture_stage = TextureStage("texture_stage")
        return

    def set_stimulus(self, data):
        """ 
        Uses events from zmq to set the stimulus value. 
        """
        logger.debug("\tset_stimulus(%s)", data)
        if not self.stimulus_initialized:
            # If this is first stim, then toggle initialization to on, and
            # do not clear previous texture (there is no previous texture).
            self.stimulus_initialized = True
            self.data_previous = data
        elif data == self.data_previous:
            return
        else:
            self.data_previous = data
            self.clear_cards()  #clear the textures before adding new ones

        # This assumes data streaming is string numbers 0, 1, etc.
        self.current_tex_num = int(data)

        # Set new texture stages/cards etc
        self.tex = self.tex_classes[self.current_tex_num]

        logger.debug("\t%d: %s", self.current_tex_num, self.tex)
        self.create_texture_stages()
        self.create_cards()
        self.set_texture_stages()
        self.set_transforms()
        #Save stim to file (put this last as you want to set transforms quickly)
        if self.filestream:
            self.filestream.write(f"{str(datetime.now())}\t{data}\n")
            self.filestream.flush()
        return

    def clear_cards(self):
        """ 
        Clear cards when new stimulus: stim-class sensitive
        """
        if self.current_stim_params['stim_type'] == 'b':
            self.left_card.detachNode()
            self.right_card.detachNode()
            if self.profile_on:
                self.center_indicator.detachNode()
        elif self.current_stim_params['stim_type'] == 's':
            self.card.detachNode()
        return

    def set_transforms(self):
        """ 
        Set up the transforms to apply to textures/cards (e.g., rotations/scales)
        This is different from the framewise movement handled by the task manager
        """
        if self.current_stim_params['stim_type'] == 'b':
            #masks
            self.mask_transform = self.trs_transform()
            self.left_card.setTexTransform(self.left_mask_stage,
                                           self.mask_transform)
            self.right_card.setTexTransform(self.right_mask_stage,
                                            self.mask_transform)
            #Left texture
            self.left_card.setTexScale(self.left_texture_stage, 1 / self.scale)
            self.left_card.setTexRotate(self.left_texture_stage,
                                        self.current_stim_params['angles'][0])

            #Right texture
            self.right_card.setTexScale(self.right_texture_stage,
                                        1 / self.scale)
            self.right_card.setTexRotate(self.right_texture_stage,
                                         self.current_stim_params['angles'][1])

        if self.current_stim_params['stim_type'] == 's':
            self.card.setTexRotate(self.texture_stage,
                                   self.current_stim_params['angle'])
        return

    def set_texture_stages(self):
        """ 
        Add texture stages to cards
        """
        if self.current_stim_params['stim_type'] == 'b':
            self.mask_position_uv = (
                utils.card2uv(self.current_stim_params['position'][0]),
                utils.card2uv(self.current_stim_params['position'][1]))

            #CREATE MASK ARRAYS
            self.left_mask_array = 255 * np.ones(
                (self.texture_size, self.texture_size), dtype=np.uint8)
            self.left_mask_array[:, self.texture_size // 2 -
                                 self.current_stim_params['strip_width'] //
                                 2:] = 0
            self.right_mask_array = 255 * np.ones(
                (self.texture_size, self.texture_size), dtype=np.uint8)
            self.right_mask_array[:, :self.texture_size // 2 +
                                  self.current_stim_params['strip_width'] //
                                  2] = 0

            #ADD TEXTURE STAGES TO CARDS
            self.left_mask.setRamImage(self.left_mask_array)
            self.left_card.setTexture(self.left_texture_stage,
                                      self.tex.texture)
            self.left_card.setTexture(self.left_mask_stage, self.left_mask)
            #Multiply the texture stages together
            self.left_mask_stage.setCombineRgb(TextureStage.CMModulate,
                                               TextureStage.CSTexture,
                                               TextureStage.COSrcColor,
                                               TextureStage.CSPrevious,
                                               TextureStage.COSrcColor)
            self.right_mask.setRamImage(self.right_mask_array)
            self.right_card.setTexture(self.right_texture_stage,
                                       self.tex.texture)
            self.right_card.setTexture(self.right_mask_stage, self.right_mask)
            #Multiply the texture stages together
            self.right_mask_stage.setCombineRgb(TextureStage.CMModulate,
                                                TextureStage.CSTexture,
                                                TextureStage.COSrcColor,
                                                TextureStage.CSPrevious,
                                                TextureStage.COSrcColor)

        elif self.current_stim_params['stim_type'] == 's':
            self.card.setTexture(self.texture_stage, self.tex.texture)
        return

    def trs_transform(self):
        """ 
        trs = translate-rotate-scale transform for mask stage
        panda3d developer rdb contributed to this code
        """
        pos = 0.5 + self.mask_position_uv[0], 0.5 + self.mask_position_uv[1]
        center_shift = TransformState.make_pos2d((-pos[0], -pos[1]))
        scale = TransformState.make_scale2d(1 / self.scale)
        rotate = TransformState.make_rotate2d(
            self.current_stim_params['strip_angle'])
        translate = TransformState.make_pos2d((0.5, 0.5))
        return translate.compose(rotate.compose(scale.compose(center_shift)))

    def set_title(self, title):
        self.window_props.setTitle(title)
        ShowBaseGlobal.base.win.requestProperties(
            self.window_props)  #base is a panda3d global
Esempio n. 5
0
class StabilityExperiment(ViewTowers):

    def __init__(self, *args, **kwargs):
        ViewTowers.__init__(self, *args, **kwargs)

        # ignore keys set by viewer
        for key in self.getAllAccepting():
            if key in ("s", "escape"):
                continue
            self.ignore(key)
        self.permanent_events = self.getAllAccepting()

        # global variables
        self.text_bg = (1, 1, 1, 0.7)
        self.font = self.loader.loadFont('cmr12.egg')
        self.question = [
            "Will this tower fall?",
            [[1, "definitely will not fall"],
             [2, "probably will not fall"],
             [3, "might not fall"],
             [4, "don't know"],
             [5, "might fall"],
             [6, "probably will fall"],
             [7, "definitely will fall"]]]
        self.question_keys = ["1", "2", "3", "4", "5", "6", "7"]
        self.choice_text_start = 0.65
        self.feedback_time = 3.0
        self.buffer_time = 0.75

        # create text
        self.create_all_text()

    def run(self):
        # Show the start screen
        self.toggle_task("show_start_screen")
        # Call parent's run().
        ShowBase.run(self)

    def create_all_text(self):
        self.continue_text = OnscreenText(**{
            "text": (
                "In a moment, you will be asked the question displayed on "
                "the left.  When you are ready, press the spacebar to begin."),
            "style": 1,
            "fg": (.75, 0, 0, 1),
            "bg": self.text_bg,
            "pos": (.4, .4),
            "align": TextNode.ACenter,
            "scale": .08,
            "font": self.font,
            "wordwrap": 20
        })
        self.text_parent = self.continue_text.getParent()
        self.continue_text.detachNode()

        xpos = -1.25
        skip = .15
        self.question_text = OnscreenText(**{
            "text": self.question[0],
            "style": 1,
            "fg": (0, 0, .8, 1),
            "bg": self.text_bg,
            "pos": ((xpos + .05), .8),
            "align": TextNode.ALeft,
            "scale": .075,
            "font": self.font,
            "wordwrap": 35})

        self.question_choice_text = []
        for i in xrange(len(self.question[1])):
            n = len(self.question[1]) - i - 1
            ypos = self.choice_text_start - (skip * n)

            t1 = OnscreenText(**{
                "text": "%s" % self.question[1][i][0],
                "style": 1,
                "fg": (0, .1, 0, 1),
                "bg": self.text_bg,
                "pos": ((xpos + .1), ypos),
                "align": TextNode.ALeft,
                "scale": .075,
                "font": self.font})

            t2 = OnscreenText(**{
                "text": "%s" % self.question[1][i][1],
                "style": 1,
                "fg": (0, .1, 0, 1),
                "bg": self.text_bg,
                "pos": ((xpos + 0.17), ypos),
                "align": TextNode.ALeft,
                "scale": .05,
                "font": self.font})

            t = NodePath("choice_%s" % i)
            t.reparentTo(self.text_parent)
            t1.reparentTo(t)
            t2.reparentTo(t)
            self.question_choice_text.append(t)

        for t in self.question_choice_text:
            t.detachNode()

        self.trials_remaining_text = OnscreenText(**{
            "text": "",
            "style": 1,
            "fg": (0, 0, 0, 1),
            "bg": self.text_bg,
            "pos": (-xpos, -.95),
            "align": TextNode.ARight,
            "scale": .05,
            "font": self.font})

    def show_start_screen(self, task):
        self.continue_text.reparentTo(self.text_parent)
        for t in self.question_choice_text:
            t.reparentTo(self.text_parent)
        self.accept("space", self.toggle_task, ["show_trial"])

    def show_trial(self, task):
        if self.sso is None:
            self.goto_sso(0)
        elif self.ssos.index(self.sso) == (self.n_ssos - 1):
            self.exit()
        else:
            self.next()

        n = self.n_ssos - self.ssos.index(self.sso)
        self.trials_remaining_text.setText("Trials remaining: %d" % n)

        self.continue_text.detachNode()
        for t in self.question_choice_text:
            t.detachNode()

        self.camera_rot.setH(np.random.randint(0, 360))
        self.cam_spin = 270

        self.taskMgr.doMethodLater(self.buffer_time, self.rotate, "rotate")

    def rotate(self, task):
        """ Task: rotate camera."""
        H = (self.camera_rot.getH() + 1) % 360
        self.camera_rot.setH(H)
        self.cam_spin -= 1
        if self.cam_spin == 0:
            self.toggle_task("show_question")
            return task.done
        else:
            return task.cont

    def show_question(self, task):
        for t in self.question_choice_text:
            t.reparentTo(self.text_parent)
        for key in self.question_keys:
            self.accept(key, self.record_response, [key])

    def record_response(self, key):
        for k in self.question_keys:
            self.ignore(k)
        for i, t in enumerate(self.question_choice_text):
            if i != (int(key) - 1):
                t.detachNode()
        self.toggle_task("physics")

    def physics(self, task):
        """ Task: simulate physics."""
        # Elapsed time.
        dt = self._get_elapsed() - self.old_elapsed
        # Update amount of time simulated so far.
        self.old_elapsed += dt
        # Step the physics dt time.
        size_sub = self.bbase.sim_par["size_sub"]
        n_subs = int(dt / size_sub)
        self.bbase.step(dt, n_subs, size_sub)

        if self.old_elapsed >= self.feedback_time:
            self.toggle_task("show_trial")
            return task.done
        else:
            return task.cont
Esempio n. 6
0
class DirectionExperiment(ViewTowers):

    def __init__(self, *args, **kwargs):
        ViewTowers.__init__(self, *args, **kwargs)

        # ignore keys set by viewer
        for key in self.getAllAccepting():
            if key in ("s", "escape"):
                continue
            self.ignore(key)
        self.permanent_events = self.getAllAccepting()

        # global variables
        self.text_bg = (1, 1, 1, 0.7)
        self.font = self.loader.loadFont('cmr12.egg')
        self.question = (
            "Use the mouse to indicate the direction that "
            "the tower will fall.")
        self.feedback_time = 3.0
        self.buffer_time = 0.75

        # create text
        self.create_all_text()

        # create direction line
        self.line = LineSegs()
        self.line_node = None
        self.angle = None

        alight = AmbientLight('alight3')
        alight.setColor((0.8, 0.8, 0.8, 1))
        self.line_light = self.lights.attachNewNode(alight)

    def place_camera(self):
        self.cameras.setPos(0, -12, 2.5)
        self.look_at.setPos(0, 0, 1.5)
        self.cameras.lookAt(self.look_at)

    def run(self):
        # Show the start screen
        self.toggle_task("show_start_screen")
        # Call parent's run().
        ShowBase.run(self)

    def create_all_text(self):
        self.continue_text = OnscreenText(**{
            "text": (
                "In a moment, you will be asked the question displayed on "
                "the left.  When you are ready, press the spacebar to begin."),
            "style": 1,
            "fg": (.75, 0, 0, 1),
            "bg": self.text_bg,
            "pos": (.4, .4),
            "align": TextNode.ACenter,
            "scale": .08,
            "font": self.font,
            "wordwrap": 20
        })
        self.text_parent = self.continue_text.getParent()
        self.continue_text.detachNode()

        xpos = -1.25
        self.question_text = OnscreenText(**{
            "text": self.question,
            "style": 1,
            "fg": (0, 0, .8, 1),
            "bg": self.text_bg,
            "pos": ((xpos + .05), .8),
            "align": TextNode.ALeft,
            "scale": .075,
            "font": self.font,
            "wordwrap": 35})

        self.trials_remaining_text = OnscreenText(**{
            "text": "",
            "style": 1,
            "fg": (0, 0, 0, 1),
            "bg": self.text_bg,
            "pos": (-xpos, -.95),
            "align": TextNode.ARight,
            "scale": .05,
            "font": self.font})

    def show_start_screen(self, task):
        self.continue_text.reparentTo(self.text_parent)
        self.accept("space", self.toggle_task, ["show_trial"])

    def show_trial(self, task):
        if self.line_node is not None:
            self.line_node.removeNode()
            self.line_node = None

        if self.sso is None:
            self.goto_sso(0)
        elif self.ssos.index(self.sso) == (self.n_ssos - 1):
            self.exit()
        else:
            self.next()

        n = self.n_ssos - self.ssos.index(self.sso)
        self.trials_remaining_text.setText("Trials remaining: %d" % n)

        self.continue_text.detachNode()

        self.camera_rot.setH(np.random.randint(0, 360))
        self.cam_spin = 270

        self.taskMgr.doMethodLater(self.buffer_time, self.rotate, "rotate")

    def rotate(self, task):
        """ Task: rotate camera."""
        H = (self.camera_rot.getH() + 1) % 360
        self.camera_rot.setH(H)
        self.cam_spin -= 1
        if self.cam_spin == 0:
            self.toggle_task("show_question")
            return task.done
        else:
            return task.cont

    def show_question(self, task):
        self.toggle_task("draw_direction")
        self.accept("mouse1", self.record_response)

    def record_response(self):
        self.ignore("mouse1")
        self.taskMgr.remove("draw_direction")
        self.toggle_task("physics")

    def physics(self, task):
        """ Task: simulate physics."""
        # Elapsed time.
        dt = self._get_elapsed() - self.old_elapsed
        # Update amount of time simulated so far.
        self.old_elapsed += dt
        # Step the physics dt time.
        size_sub = self.bbase.sim_par["size_sub"]
        n_subs = int(dt / size_sub)
        self.bbase.step(dt, n_subs, size_sub)

        if self.old_elapsed >= self.feedback_time:
            self.toggle_task("show_trial")
            return task.done
        else:
            return task.cont

    def draw_direction(self, task):
        if self.mouseWatcherNode.hasMouse():
            cv = self._get_collision(self.floor)
            cv = cv / np.linalg.norm(cv)
            self.angle = np.arctan2(cv[1], cv[0])

            sx, sy, sz = self.floor.getScale() / 2.0
            gx, gy, gz = self.floor.getPos()
            gz += sz + 0.01

            if self.line_node is not None:
                self.line_node.removeNode()
                self.line_node = None

            self.line.reset()
            self.line.setColor(1, 1, 1, 1)
            self.line.setThickness(5)
            self.line.moveTo(gx, gy, gz)
            self.line.drawTo(cv[0] * sx, cv[1] * sy, gz)
            self.line_node = self.render.attachNewNode(self.line.create())
            self.line_node.setLight(self.line_light)

        return task.cont

    def _get_collision(self, node, debug=False):
        mx = self.mouseWatcherNode.getMouseX()
        my = self.mouseWatcherNode.getMouseY()
        if debug:
            print "mouse:", (mx, my)

        # get the origin and direction of the ray extending from the
        # camera to the mouse pointer
        cm = np.array(self.cam.getNetTransform().getMat())
        cr = CollisionRay()
        cr.setFromLens(self.cam.node(), (mx, my))
        cp = np.hstack([cr.getOrigin(), 1])
        cd = np.hstack([cr.getDirection(), 0])
        cp = np.dot(cm.T, cp)[:3]
        cd = np.dot(cm.T, cd)[:3]
        if cd[2] > -1:
            cd[2] = -1
        if debug:
            print "direction:", cd
            print "origin:", cp

        # point on the plane, z-axis
        pz = node.getPos(self.render)[2]
        sz = node.getScale(self.render)[2] / 2.0
        p0 = np.array([0, 0, pz + sz])
        if debug:
            print "p0:", p0

        # this is the intersection equation that we want to solve,
        # where s is the point on the line that intersects
        #     e_z(cp + s*cd - p0) = 0
        s = (p0[2] - cp[2]) / cd[2]
        if debug:
            print "s:", s

        # transform the collision point from line coordinates to world
        # coordinates
        cv = cp + s * cd
        if debug:
            print "collision:", cv

        return cv
Esempio n. 7
0
class Lvl03(DirectObject):
    def start(self):
        base.disableMouse() #turn off mouse camera control
        base.enableParticles()
	
	self.music = loader.loadMusic("models/gamedev/DEC.mp3")
	self.music.play()
	
        camera.setPosHpr(Vec3(98,-390,90), Vec3(0,-5,0))
        self.ballNum = 10
	self.setupStage()
        self.loadModels()
        self.setupLighting()
        self.setupCollisions()
        self.setupIntervals()
	
	taskMgr.add(self.ballMovementTask,'ballMoveTask')
        
        self.gameLen = 30
        
	self.player1Weapon = ""
	self.player2Weapon = ""
	
        #hud = OnscreenImage(image = 'models/gamedev/lvl2hud.jpg', pos = (0,1,20),scale=5.0)
        #hud.reparentTo(render)
        
        globalClock.reset()
        
        self.timer = OnscreenText("%d" % (self.gameLen-globalClock.getRealTime(),), pos = (98,145), scale = 18.0)
        self.timer.setColor(1,1,1)
        taskMgr.add(self.clockTask,"clockTask")
        
        self.player1Score = 0
        self.player2Score = 0
        
        self.nodeCount1 = 0
        self.nodeCount2 = 0
	
	self.player1Invincible = 0
        self.player2Invincible = 0
	
	self.jNP = self.playerModel.exposeJoint(None,"modelRoot","ikHandle2")
	self.jNP2 = self.playerModel2.exposeJoint(None,"modelRoot","ikHandle2")
	
        self.climbing1 = 0
        self.climbing2 = 0
        
        self.speed1 = 3.0
        self.speed2 = 3.0
        
        self.ignoreColl= 0
        
        self.player1IsColliding = 0
        self.player2IsColliding = 0
        
        taskMgr.doMethodLater(self.gameLen, self.endGame,'gameFinished')
        
        #taskMgr.doMethodLater(self.gameLen/2.0,self.changeMusic,'musicSwitch')
        
        
        #setup key controls
        self.accept("escape",sys.exit)
        #self.acceptOnce("space",self.drop)
        # Player 1 movement
        
        self.acceptOnce("a",self.left)
        self.acceptOnce("d",self.right)
        
        self.accept("a-up",self.stopLeft)
        self.accept("d-up",self.stopRight)
        
        self.acceptOnce("w", self.jump)

        
        #Player 2 movement keys
        #self.accept("l",self.fall2)
        
        self.acceptOnce("k",self.left2)
        self.acceptOnce(";",self.right2)
        
        self.accept("k-up",self.stopLeft2)
        self.accept(";-up",self.stopRight2)
        
        self.acceptOnce("o", self.jumpT2)
        
    def setupStage(self):
	self.ball = []
	self.movement = []
	for i in range(self.ballNum+1):
		z=random.randint(1,2)
		if z ==1:
			z=-1
		else:
			z=1
		weapBalls.define(self.ball,i,render)
		self.movement.append(Vec3(random.random()*z,0,random.random()*z))
		#self.movement[i].Vec3(random.randint(1,3),0,random.randint(1,3))
		
	self.background2 = OnscreenImage(image = 'models/gamedev/frozenbg.JPG', pos = (98,10,0),scale=500)
	self.background2.detachNode()
        self.background = OnscreenImage(image = 'models/gamedev/moltenbg.JPG', pos = (98,10,0),scale=500)
        self.background.reparentTo(render)
        
        self.lava = loader.loadModel("models/gamedev/lava")
        self.lava.setPosHpr(Vec3(98,0,-18),Vec3(0,5,0))
        self.lava.setScale(50)
        self.lava.reparentTo(render)
        
        
        x1= 196
        x2 = 0
        m1 = 98
        m2 = 107.8
        len = 9.8
        h = 0
        a = 0
        p = 0
        
        for j in range(4):
            if j > 0:
                x1Old = x1
                x2Old = x2
                x1 = 196-(random.randint(0,3)*9.8)
                x2 = 0+random.randint(0,3)*9.8
                m1=98-(random.randint(0,3)*9.8)
                m2= 107.8+random.randint(0,3)*9.8
            
                for count in range(1):
                    l = random.randint(2,5)
                    r = random.randint(2,5)
                    c1 = random.randint(2,5)
                    c2 = random.randint(2,5)
                    if l+r < 4:
		        count = 0
			
            else:
                l = 4
                r = 4
                c1 = 2
                c2 = 2
            '''
            if j ==1 or j == 3:
                self.ladder = loader.loadModel("models/gamedev/ladder")
                self.ladder.reparentTo(render)
                self.ladder.setScale(1.5)
                self.ladder.setPos(x2+4.9,0,h-20)
                self.ladder2 = loader.loadModel("models/gamedev/ladder")
                self.ladder2.reparentTo(render)
                self.ladder2.setScale(1.5)
                self.ladder2.setPos(x1-4.9,0,h-20)
            
            if j == 2:
                self.ladder = loader.loadModel("models/gamedev/ladder")
                self.ladder.reparentTo(render)
                self.ladder.setScale(1.5)
                self.ladder.setPos(m1-4.9,0,h-20)
                self.ladder2 = loader.loadModel("models/gamedev/ladder")
                self.ladder2.reparentTo(render)
                self.ladder2.setScale(1.5)
                self.ladder2.setPos(m2+4.9,0,h-20)
            '''
            self.first = 1

            for i in range(r):
                '''Right half of stage'''
                self.environment = loader.loadModel("models/gamedev/platform")
                self.environment.reparentTo(render)
                self.environment.setScale(5)
                self.environment.setPos(x1,0,h)
                    
                if self.first == 1:
                    self.first = 0
                    bounds = self.environment.getChild(0).getBounds()
                    center = bounds.getCenter()
                    poly1 = Point3(center.getX()+1, center.getY()-.5, center.getZ()+.2)
                    poly2 = Point3(center.getX()-(2*r-1), center.getY()-.5, center.getZ()+.2)
                    poly3 = Point3(center.getX()+1, center.getY()+.5, center.getZ()+.2)
                    poly4 = Point3(center.getX()-(2*r-1), center.getY()+.5, center.getZ()+.2)
                    cPoly = CollisionPolygon(poly4, poly2, poly1, poly3)
                    cNode = CollisionNode("platform")
                    cNode.addSolid(cPoly)
                    cNodePath = self.environment.attachNewNode(cNode)
                    cNodePath.show()
                    
                x1 = x1 - len

            self.first = 1
            
            for i in range(l):
                '''Left Half of stage'''
                self.environment = loader.loadModel("models/gamedev/platform")
                self.environment.reparentTo(render)
                self.environment.setScale(5)
                self.environment.setPos(x2,0,h)
                
                if self.first == 1:
                    self.first = 0
                    bounds = self.environment.getChild(0).getBounds()
                    center = bounds.getCenter()
                    poly1 = Point3(center.getX()+(2*l-1), center.getY()-.5, center.getZ()+.2)
                    poly2 = Point3(center.getX()-1, center.getY()-.5, center.getZ()+.2)
                    poly3 = Point3(center.getX()+(2*l-1), center.getY()+.5, center.getZ()+.2)
                    poly4 = Point3(center.getX()-1, center.getY()+.5, center.getZ()+.2)
                    cPoly = CollisionPolygon(poly4, poly2, poly1, poly3)
                    cNode = CollisionNode("platform")
                    cNode.addSolid(cPoly)
                    cNodePath = self.environment.attachNewNode(cNode)
                    cNodePath.show()
                
                x2 = x2 + len
                
            self.first = 1
            
            for i in range(c1):
                '''Right half of stage'''
                self.environment = loader.loadModel("models/gamedev/platform")
                self.environment.reparentTo(render)
                self.environment.setScale(5)
                self.environment.setPos(m1,0,h)
                
                if self.first == 1:
                    self.first = 0
                    bounds = self.environment.getChild(0).getBounds()
                    center = bounds.getCenter()
                    poly1 = Point3(center.getX()+1, center.getY()-.5, center.getZ()+.2)
                    poly2 = Point3(center.getX()-(2*c1-1), center.getY()-.5, center.getZ()+.2)
                    poly3 = Point3(center.getX()+1, center.getY()+.5, center.getZ()+.2)
                    poly4 = Point3(center.getX()-(2*c1-1), center.getY()+.5, center.getZ()+.2)
                    cPoly = CollisionPolygon(poly4, poly2, poly1, poly3)
                    cNode = CollisionNode("platform")
                    cNode.addSolid(cPoly)
                    cNodePath = self.environment.attachNewNode(cNode)
                    cNodePath.show()
                
                m1 = m1 - len
                
            self.first = 1
            
            for i in range(c2):
                '''Left Half of stage'''
                self.environment = loader.loadModel("models/gamedev/platform")
                self.environment.reparentTo(render)
                self.environment.setScale(5)
                self.environment.setPos(m2,0,h)
                
                if self.first == 1:
                    self.first = 0
                    bounds = self.environment.getChild(0).getBounds()
                    center = bounds.getCenter()
                    poly1 = Point3(center.getX()+(2*c2-1), center.getY()-.5, center.getZ()+.2)
                    poly2 = Point3(center.getX()-1, center.getY()-.5, center.getZ()+.2)
                    poly3 = Point3(center.getX()+(2*c2-1), center.getY()+.5, center.getZ()+.2)
                    poly4 = Point3(center.getX()-1, center.getY()+.5, center.getZ()+.2)
                    cPoly = CollisionPolygon(poly4, poly2, poly1, poly3)
                    cNode = CollisionNode("platform")
                    cNode.addSolid(cPoly)
                    cNodePath = self.environment.attachNewNode(cNode)
                    cNodePath.show()
                
                m2 = m2 + len
            
            h = h+40
            a = 0

    def loadModels(self):
    
        # ** Load female character that will represent first player** #
        
        
        self.playerModel = Actor("models/gamedev/redguy-model",{"walk":"models/gamedev/redguy-run"})
        self.playerModel.reparentTo(render)
        self.playerModel.setScale(.6)
        self.playerModel.setH(90)
        
        # ** Position player at center of the field with it lying directly above the field. ** #
        
        self.playerModel.setPos(0,0,1.76)
        
        # ** Load female character that will represent second player** #
        
        self.playerModel2 = Actor("models/gamedev/bluegirl-model",{"walk2":"models/gamedev/bluegirl-run"})
        self.playerModel2.reparentTo(render)
        self.playerModel2.setScale(.6)
        self.playerModel2.setH(0)
        
        # ** Position player at center of the field with it lying directly above the field. ** #
        
        self.playerModel2.setPos(196,0,2.0)

    def reset(self):
	self.an1.getPhysicsObject().setVelocity(Vec3(0,0,0))
	self.an2.getPhysicsObject().setVelocity(Vec3(0,0,0))
	self.an1.getPhysicsObject().setPosition(Point3(0,0,11.76))
	self.an2.getPhysicsObject().setPosition(Point3(196,0,22.0))
	
	self.playerModel.setH(90)
	self.playerModel.detachNode()
	self.playerModel.setPos(0,0,1.76)
	self.anp.setFluidPos(Point3(0,0,1.76))
	self.playerModel.reparentTo(self.anp)
	
	self.playerModel2.setH(0)
	self.playerModel2.detachNode()
	self.playerModel2.setPos(196,0,22.0)
	self.anp2.setFluidPos(Point3(196,0,22.0))
	self.playerModel2.reparentTo(self.anp2)

    def setupLighting(self):
        ambientLight = AmbientLight('ambientLight')
        ambientLight.setColor(Vec4(0.55,0.55,0.55,1.0))
        ambientLightNP = render.attachNewNode(ambientLight)
        render.setLight(ambientLightNP)
        dirLight = DirectionalLight('dirLight')
        dirLight.setColor(Vec4(0.6,0.6,0.6,1))
        dirLightNP = render.attachNewNode(dirLight)
        dirLightNP.setHpr(Vec3(0.0,-26.0,0.0))
        render.setLight(dirLightNP)
        
    def setupIntervals(self):
        self.charWalk1l = self.playerModel.actorInterval("walk")
        self.charWalk1l.loop( )
        self.charWalk1l.pause( )
        
        self.charWalk1r = self.playerModel.actorInterval("walk")
        self.charWalk1r.loop( )
        self.charWalk1r.pause( )
        
        self.charWalk2l = self.playerModel2.actorInterval("walk2")
        self.charWalk2l.loop( )
        self.charWalk2l.pause( )
        
        self.charWalk2r = self.playerModel2.actorInterval("walk2")
        self.charWalk2r.loop( )
        self.charWalk2r.pause( )
        
        self.jump1 = self.playerModel.actorInterval("jump")
        self.jump1.loop()
        self.jump1.pause()
        
        self.jump2 = self.playerModel2.actorInterval("jump2")
        self.jump2.loop()
        self.jump2.pause()
        
        self.climb1 = self.playerModel.actorInterval("climb")
        self.climb1.loop()
        self.climb1.pause()
        
        self.climb2 = self.playerModel2.actorInterval("climb2")
        self.climb2.loop()
        self.climb2.pause()
        
        # end setupIntervals

        # ############################
        # Actual Working movement code
        # ############################

    def rise(self):
        dist = 40
        self.playerModel.setH(0)
        playerJump = self.playerModel.posInterval(1.0,Vec3(self.playerModel.getX(), self.playerModel.getY(),self.playerModel.getZ()+dist))
        playerJump.start()
        
    def rise2(self):
        dist = 40
        self.playerModel2.setH(90)
        playerJump2 = self.playerModel2.posInterval(1.0,Vec3(self.playerModel2.getX(), self.playerModel2.getY(),self.playerModel2.getZ()+dist))
        playerJump2.start()
        
    # PLAYER ONE #
        
    def left(self):
        taskMgr.add(self.leftTask,'leftTask')
        self.charWalk1l.loop()
        #end left
        
    def leftTask(self,task):
        if self.climbing1 == 0:
            self.playerModel.setH(270)
            self.playerModel.setPos(Vec3(self.playerModel.getX()-self.speed1, self.playerModel.getY(), self.playerModel.getZ()))
        return Task.cont
        
    def right(self):
        taskMgr.add(self.rightTask,'rightTask')
        self.charWalk1r.loop()
        #end right
        
    def rightTask(self,task):
        if self.climbing1 == 0:
            self.playerModel.setH(90)
            self.playerModel.setPos(Vec3(self.playerModel.getX()+self.speed1, self.playerModel.getY(), self.playerModel.getZ()))
        return Task.cont	

	def climbable(self,cEntry):
		self.nodeCount1+=1
		print self.nodeCount1
		self.ignore("w")
		self.ignore("w-up")
		self.ignore("s")
		self.ignore("s-up")
		self.acceptOnce("w",self.climb,[1])
		self.accept("w-up",self.noClimb)
		self.acceptOnce("s",self.climb,[-1])
		self.accept("s-up",self.noClimb)

	def climb(self,dir):
		self.dir1 = dir
		self.climbing1 = 1
		self.climbSpeed1 = 1
		self.ignore("a")
		self.ignore("a-up")
		self.ignore("d")
		self.ignore("d-up")
		taskMgr.add(self.climbTask,'climbTask')
		self.climb1.loop()
		
	def noClimb(self):
		taskMgr.remove('climbTask')
		self.climb1.pause()
		if self.nodeCount1 == 0:
			self.climbing = 0
		self.climbSpeed1 = 0
		self.acceptOnce("w",self.climb,[1])
		self.acceptOnce("s",self.climb,[-1])
		
	def jumpable(self,cEntry):
		self.nodeCount1+=-1
		print self.nodeCount1
		if self.nodeCount1 == 0:
			taskMgr.remove('climbTask')
			self.ignore("w")
			self.ignore("w-up")
			self.ignore("s")
			self.ignore("s-up")
			self.acceptOnce("w",self.jump)
			self.acceptOnce("a",self.left)
			self.acceptOnce("d",self.right)
			self.accept("a-up",self.stopLeft)
			self.accept("d-up",self.stopRight)
			self.climbing1 = 0
			self.climbSpeed1 = 0
			self.climb1.pause()
			
	def walkable(self,cEntry):
		self.ignore("w")
		self.ignore("w-up")
		self.ignore("s")
		self.ignore("s-up")
		self.acceptOnce("w",self.climb,[1])
		self.accept("w-up",self.noClimb)
		self.acceptOnce("s",self.climb,[-1])
		self.accept("s-up",self.noClimb)
		self.acceptOnce("a",self.left)
		self.acceptOnce("d",self.right)
		self.accept("a-up",self.stopLeft)
		self.accept("d-up",self.stopRight)
		self.climbing1 = 0
		self.climbSpeed1 = 0
		self.climb1.pause()
			
	def climbTask(self,task):
		if self.playerModel.getZ() >=0:
			self.playerModel.setH(0)
			self.playerModel.setPos(Vec3(self.playerModel.getX(), self.playerModel.getY(), self.playerModel.getZ()+self.climbSpeed1*self.dir1))
		return Task.cont	

    def jump(self):
        if self.nodeCount1 == 0:
            self.ignore("w")
            self.ignore("w-up")
            z = self.playerModel.getZ()
            j = ProjectileInterval(self.playerModel, startPos = self.playerModel.getPos(), startVel = Point3(5,0,30), duration = 2.0)
            j.start()
            taskMgr.doMethodLater(2,self.jumpTask,"jumpTask")
        else:
            self.acceptOnce("w",self.climb,[1])
        
    def jumpTask(self, task):
        if self.climbing1 == 0:
            self.jump1.pause()
            self.acceptOnce("w",self.jump)
        #return task.cont
    
    def allowRight(self):
        self.acceptOnce("d",self.right)
    
    def noRight(self):
        taskMgr.remove('rightTask')
        self.charWalk1r.pause()
        self.acceptOnce("d",self.right)

    def stopRight(self):
        self.noRight()
        #self.allowRight()

    def rightWall(self,cEntry):
	self.ignore("d")
	self.noRight()
		
    def rightEdge(self,cEntry):
	self.ignore("d")
	self.noRight()

    def rightOK(self,cEntry):
	self.allowRight()	
		
    def allowLeft(self):
	self.acceptOnce("a",self.left)

    def noLeft(self):
        taskMgr.remove('leftTask')
        self.charWalk1l.pause()
        self.acceptOnce("a",self.left)

    def stopLeft(self):
        self.noLeft()
        #self.allowLeft()
        
    def leftWall(self,cEntry):
        self.ignore("a")
        self.noLeft()
        
    def leftEdge(self,cEntry):
        self.ignore("a")
        self.noLeft()
        
    def leftOK(self,cEntry):
        self.allowLeft()

	# PLAYERTWO #

    def left2(self):
        taskMgr.add(self.leftTask2,'leftTask2')
        self.charWalk2l.loop()
    #end left

    def leftTask2(self,task):
        if self.climbing2 == 0:
            self.playerModel2.setH(0)
            self.playerModel2.setPos(Vec3(self.playerModel2.getX()-self.speed2, self.playerModel2.getY(), self.playerModel2.getZ()))
        return Task.cont

    def right2(self):
        taskMgr.add(self.rightTask2,'rightTask2')
        self.charWalk2r.loop()
        #end right

    def rightTask2(self,task):
        if self.climbing2 == 0:
            self.playerModel2.setH(180)
            self.playerModel2.setPos(Vec3(self.playerModel2.getX()+self.speed2, self.playerModel2.getY(), self.playerModel2.getZ()))
        return Task.cont	

	def climbable2(self,cEntry):
		self.nodeCount2+=1
		#print self.nodeCount1
		self.ignore("o")
		self.ignore("o-up")
		self.ignore("l")
		self.ignore("l-up")
		self.acceptOnce("o",self.climbT2,[1])
		self.accept("o-up",self.noClimb2)
		self.acceptOnce("l",self.climbT2,[-1])
		self.accept("l-up",self.noClimb2)

	def climbT2(self,dir):
		self.dir2 = dir
		self.climbing2 = 1
		self.climbSpeed2 = 1
		self.ignore("k")
		self.ignore("k-up")
		self.ignore(";")
		self.ignore(";-up")
		taskMgr.add(self.climbTask2,'climbTask2')
		self.climb2.loop()
		
	def noClimb2(self):
		taskMgr.remove('climbTask2')
		self.climb2.pause()
		if self.nodeCount2 == 0:
			self.climbing2 = 0
		self.climbSpeed2 = 0
		self.acceptOnce("o",self.climbT2,[1])
		self.acceptOnce("l",self.climbT2,[-1])
		
	def jumpable2(self,cEntry):
		self.nodeCount2+=-1
		#print self.nodeCount2
		if self.nodeCount2 == 0:
			taskMgr.remove('climbTask2')
			self.ignore("o")
			self.ignore("o-up")
			self.ignore("l")
			self.ignore("l-up")
			self.acceptOnce("o",self.jumpT2)
			self.acceptOnce("k",self.left2)
			self.acceptOnce(";",self.right2)
			self.accept("k-up",self.stopLeft2)
			self.accept(";-up",self.stopRight2)
			self.climbing2 = 0
			self.climbSpeed2 = 0
			self.climb2.pause()
			
	def walkable2(self,cEntry):
		self.ignore("o")
		self.ignore("o-up")
		self.ignore("l")
		self.ignore("l-up")
		self.acceptOnce("o",self.climbT2,[1])
		self.accept("o-up",self.noClimb2)
		self.acceptOnce("l",self.climbT2,[-1])
		self.accept("l-up",self.noClimb2)
		self.acceptOnce("k",self.left2)
		self.acceptOnce(";",self.right2)
		self.accept("k-up",self.stopLeft)
		self.accept(";-up",self.stopRight)
		self.climbing2 = 0
		self.climbSpeed2 = 0
		self.climb2.pause()
			
	def climbTask2(self,task):
		if self.playerModel2.getZ() >=0:
			self.playerModel2.setH(90)
			self.playerModel2.setPos(Vec3(self.playerModel2.getX(), self.playerModel2.getY(), self.playerModel2.getZ()+self.climbSpeed2*self.dir2))
		return Task.cont	

    def jumpT2(self):
        if self.nodeCount2 == 0:
            self.ignore("o")
            self.ignore("o-up")
            z = self.playerModel2.getZ()
            j = ProjectileInterval(self.playerModel2, startPos = self.playerModel2.getPos(), startVel = Point3(3,0,30), duration = 2.0)
            j.start()
            taskMgr.doMethodLater(3,self.jumpTask2,"jumpTask2")
        else:
            self.acceptOnce("w",self.climb,[1])
        
    def jumpTask2(self, task):
        if self.climbing2 == 0:
            self.jump2.pause()
            self.acceptOnce("o",self.jumpT2)
        #return task.cont

	def allowRight2(self):
		self.acceptOnce(";",self.right2)

    def noRight2(self):
        taskMgr.remove('rightTask2')
        self.charWalk2r.pause()
        self.acceptOnce(";",self.right2)

    def stopRight2(self):
        self.noRight2()
        #self.allowRight()
        
    def rightWall2(self,cEntry):
        self.ignore(";")
        self.noRight2()
        
    def rightEdge2(self,cEntry):
        self.ignore(";")
        self.noRight2()

    def rightOK2(self,cEntry):
        self.allowRight2()	
    
    def allowLeft2(self):
        self.acceptOnce("k",self.left2)

    def noLeft2(self):
        taskMgr.remove('leftTask2')
        self.charWalk2l.pause()
        self.acceptOnce("k",self.left2)

    def stopLeft2(self):
        self.noLeft2()
        #self.allowLeft()
        
    def leftWall2(self,cEntry):
        self.ignore("k")
        self.noLeft2()
        
    def leftEdge2(self,cEntry):
        self.ignore("k")
        self.noLeft2()
        
    def leftOK2(self,cEntry):
        self.allowLeft2()
    
    def setupCollisions(self):
	self.cHandler = PhysicsCollisionHandler()
        #self.cHandler.setInPattern("ate-%in")
        self.cHandler.addInPattern('%fn-into-%in')
	#self.cHandler2.addInPattern('%fn-into-%in')         
        self.cHandler.setAgainPattern('%fn-again-%in')          
        self.cHandler.setOutPattern('%fn-outof-%in')        
        self.cTrav = CollisionTraverser()
	#self.cTrav2 = CollisionTraverser()
        base.cTrav = self.cTrav
	
        #Player 1 collision solid
        bounds = self.playerModel.getChild(0).getBounds()
        center = bounds.getCenter()-Vec3(0,0,12)
        radius = bounds.getRadius()-18
        boundsB = self.playerModel.getChild(0).getBounds()
        centerB = bounds.getCenter()-Vec3(0,0,-4)
        radiusB = bounds.getRadius()-20
        cSphere = CollisionSphere(center,radius)
        cSphereB = CollisionSphere(centerB,radiusB)
        cNode = CollisionNode("player1")
        #print radius, radiusB
        cNode.addSolid(cSphere)
        cNode.addSolid(cSphereB)
        cNodePath = self.playerModel.attachNewNode(cNode)
        cNodePath.show()
        
        Node=NodePath(PandaNode("PhysicsNode"))
        Node.reparentTo(render)
        self.an1=ActorNode("player1-physics")
        self.anp=Node.attachNewNode(self.an1)
        base.physicsMgr.attachPhysicalNode(self.an1)
        self.playerModel.reparentTo(self.anp)
	#self.anp.reparentTo(self.playerModel)
	
        #Player 2 collision solid
        bounds2 = self.playerModel2.getChild(0).getBounds()
        center2 = bounds2.getCenter()-Vec3(0,0,-4)
        radius2 = bounds2.getRadius()-20
        cSphere2 = CollisionSphere(center2,radius2)
        bounds2B = self.playerModel2.getChild(0).getBounds()
        center2B = bounds2B.getCenter()-Vec3(0,0,12)
        radius2B = bounds2B.getRadius()-18
        cSphere2B = CollisionSphere(center2B,radius2B)
        cNode2 = CollisionNode("player2")
        #print radius2, radius2B
        cNode2.addSolid(cSphere2)
        cNode2.addSolid(cSphere2B)
        cNodePath2 = self.playerModel2.attachNewNode(cNode2)
        cNodePath2.show()
        
        Node2=NodePath(PandaNode("PhysicsNode"))
        Node2.reparentTo(render)
        self.an2=ActorNode("player2-physics")
        self.anp2=Node2.attachNewNode(self.an2)
        base.physicsMgr.attachPhysicalNode(self.an2)
        self.playerModel2.reparentTo(self.anp2)
        #self.anp2.reparentTo(self.playerModel2)
	
        gravityFN=ForceNode('world-forces')
        gravityFNP=render.attachNewNode(gravityFN)
        gravityForce=LinearVectorForce(0,0,-9.8) #gravity acceleration
        gravityFN.addForce(gravityForce)
        
        base.physicsMgr.addLinearForce(gravityForce)
	self.an1.getPhysicsObject().setMass(15)
	self.an2.getPhysicsObject().setMass(15)
	gravityForce.setMassDependent(1)
        
        self.cHandler.addCollider(cNodePath, self.anp)
        self.cHandler.addCollider(cNodePath2, self.anp2)
        self.cTrav.addCollider(cNodePath,self.cHandler)
        self.cTrav.addCollider(cNodePath2,self.cHandler)
        self.cTrav.addCollider(cNodePath,self.cHandler)
        self.cTrav.addCollider(cNodePath2,self.cHandler)
	#self.cTrav.addCollider(cNodePath,self.cHandler2)
        #self.cTrav.addCollider(cNodePath2,self.cHandler2)
        #self.cTrav2.addCollider(cNodePath,self.cHandler2)
        #self.cTrav2.addCollider(cNodePath2,self.cHandler2)
	
	#cHandler2 = CollisionHandlerEvent()
	#cHandler2.addInPattern('%fn-into-%in')
	#self.cTrav.addCollider(cNodePath1,cHandler2)
        #self.cTrav.addCollider(cNodePath2,cHandler2)
	
        for i in range(self.ballNum+1):
            boundsB = self.ball[i].getChild(0).getBounds()
            centerB = boundsB.getCenter()
            radiusB = boundsB.getRadius()*0.65
            cSphereB = CollisionSphere(centerB,radiusB)
            cNodeB = CollisionNode("ball")
            cNodeB.addSolid(cSphereB)
            cNodePathB = self.ball[i].attachNewNode(cNodeB)
	    #self.cTrav.addCollider(cNodePathB,self.cHandler)

            #cNodePathB.show()
	
	self.accept("player1-into-ball",self.acquire1)
	#self.accept("ball-into-player1",self.acquire1)
	self.accept("player2-into-ball",self.acquire2)
	#self.accept("ball-into-player2",self.acquire2)
	#self.accept( 'player1-into2-platform', self.wall1)
        #self.accept( 'player2-into2-platform', self.wall2)
        
    def wall1(self,cEntry):
	self.an1.getPhysicsObject().setVelocity(Vec3(0,0,0))
	
    def wall2(self,cEntry):
	self.an2.getPhysicsObject().setVelocity(Vec3(0,0,0))
	
    def player1Wins(self,cEntry):
	if self.player2Invincible == 0:
		self.player1Score+=10
		self.reset()
	
    def player2Wins(self,cEntry):
	if self.player1Invincible == 0:
		self.player2Score+=10
		self.reset()
		
    def acquire1(self,cEntry):
	self.playerModel.setY(0)
	if str(cEntry.getIntoNodePath().getParent()) == "render/sawball":
	    self.player1Weapon = "saw"
	    saw = loader.loadModel("models/gamedev/saw")
	    saw.setScale(2.5)
	    self.jNP.getChildren().detach()
	    saw.reparentTo(self.jNP)
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/moltovball":
	    self.player1Weapon = "molotov"
	    molo = loader.loadModel("models/gamedev/moltov")
	    molo.setScale(2.5)
	    #self.jNP = self.playerModel.exposeJoint(None,"modelRoot","ikHandle2")
	    self.jNP.getChildren().detach()
	    molo.reparentTo(self.jNP)
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/grenadeball":
	    self.player1Weapon = "grenade"
	    gren = loader.loadModel("models/gamedev/grenade")
	    gren.setScale(2.5)
	    #self.jNP = self.playerModel.exposeJoint(None,"modelRoot","ikHandle2")
	    self.jNP.getChildren().detach()
	    gren.reparentTo(self.jNP)
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/pogo": #done
	    self.jNP.getChildren().detach()
	    self.player1Weapon = "jump"
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/golden": #done
	    self.jNP.getChildren().detach()
	    self.player1Weapon = "speedUp"
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/crystalball":
	    self.jNP.getChildren().detach()
	    self.player1Weapon = "icestage"
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/fireball": #done
	    self.jNP.getChildren().detach()
	    self.player1Weapon = "meteo"
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/blackball": #done
	    self.jNP.getChildren().detach()
	    self.player1Weapon = "blind"
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/translucent":
	    self.jNP.getChildren().detach()
	    self.player1Weapon = "invis"
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/superball": #done
	    self.jNP.getChildren().detach()
	    self.player1Weapon = "invincible"
	    self.acceptOnce("e",self.useWeapon1)
	    self.acceptOnce("q",self.useWeapon1)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/death": #done
	    self.jNP.getChildren().detach()
	    if self.player1Invincible == 0:
		self.player2Deaths+= 1
		self.reset()
	
	cEntry.getIntoNodePath().getParent().removeNode()
		
	#Drop a New Ball
	self.ballNum+=1
	z=random.randint(1,2)
	if z ==1:
		z=-1
	else:
		z=1
	self.movement.append(Vec3(random.random()*z,0,random.random()*z))
	weapBalls.define(self.ball,self.ballNum,render)
	
	boundsB = self.ball[self.ballNum].getChild(0).getBounds()
	centerB = boundsB.getCenter()
	radiusB = boundsB.getRadius()*.65
	cSphereB = CollisionSphere(centerB,radiusB)
	cNodeB = CollisionNode("ball")
	cNodeB.addSolid(cSphereB)
	cNodePathB = self.ball[self.ballNum].attachNewNode(cNodeB)
		
    def acquire2(self,cEntry):
	if str(cEntry.getIntoNodePath().getParent()) == "render/sawball":
	    self.player2Weapon = "saw"
	    saw = loader.loadModel("models/gamedev/saw")
	    saw.setScale(2.5)
	    self.jNP2.getChildren().detach()
	    saw.reparentTo(self.jNP2)
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/moltovball":
	    self.player2Weapon = "molotov"
	    molo = loader.loadModel("models/gamedev/moltov")
	    molo.setScale(2.5)
	    #self.jNP = self.playerModel.exposeJoint(None,"modelRoot","ikHandle2")
	    self.jNP.getChildren().detach()
	    molo.reparentTo(self.jNP)
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/grenadeball":
	    self.player2Weapon = "grenade"
	    gren = loader.loadModel("models/gamedev/grenade")
	    gren.setScale(2.5)
	    #self.jNP = self.playerModel.exposeJoint(None,"modelRoot","ikHandle2")
	    self.jNP.getChildren().detach()
	    gren.reparentTo(self.jNP)
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/pogo": #done
	    self.jNP.getChildren().detach()
	    self.player2Weapon = "jump"
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/golden": #done
	    self.jNP.getChildren().detach()
	    self.player2Weapon = "speedUp"
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/crystalball":
	    self.jNP.getChildren().detach()
	    self.player2Weapon = "icestage"
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/fireball": #done
	    self.jNP.getChildren().detach()
	    self.player2Weapon = "meteo"
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/blackball": #done
	    self.jNP.getChildren().detach()
	    self.player2Weapon = "blind"
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/translucent":
	    self.jNP.getChildren().detach()
	    self.player2Weapon = "invis"
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/superball": #done
	    self.jNP.getChildren().detach()
	    self.player2Weapon = "invincible"
	    self.acceptOnce("e",self.useWeapon2)
	    self.acceptOnce("q",self.useWeapon2)
	elif str(cEntry.getIntoNodePath().getParent()) == "render/death": #done
	    self.jNP.getChildren().detach()
	    if self.player2Invincible == 0:
		self.player1Score+=3
		self.reset()
	
	cEntry.getIntoNodePath().getParent().removeNode()
		
	#Drop a New Ball
	self.ballNum+=1
	z=random.randint(1,2)
	if z ==1:
		z=-1
	else:
		z=1
	self.movement.append(Vec3(random.random()*z,0,random.random()*z))
	weapBalls.define(self.ball,self.ballNum,render)
	
	boundsB = self.ball[self.ballNum].getChild(0).getBounds()
	centerB = boundsB.getCenter()
	radiusB = boundsB.getRadius()*.65
	cSphereB = CollisionSphere(centerB,radiusB)
	cNodeB = CollisionNode("ball")
	cNodeB.addSolid(cSphereB)
	cNodePathB = self.ball[self.ballNum].attachNewNode(cNodeB)

    def useWeapon1(self):
	if self.player1Weapon == "meteo":
		fireRain = Sequence(Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), 
		Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), Func(self.rain))
		fireRain.start()
	elif self.player1Weapon == "jump":
		self.playerModel.detachNode()
		self.playerModel.reparentTo(render)
		angle = (self.playerModel.getH())*math.pi/180.0
		ProjectileInterval(self.playerModel, startPos = Point3(self.playerModel.getPos()),startVel = Point3(math.sin(angle)*30,0,100), duration= 4.0).start()
	elif self.player1Weapon == "speedUp":
		self.speed1 = 6
		taskMgr.doMethodLater(5,self.restoreSpeedBG,"restoreStuff")
	elif self.player1Weapon == "blind":
		camera.setPos(Vec3(-50,0,0))
		taskMgr.doMethodLater(5,self.restoreCamera,"restoreCamera")
	elif self.player1Weapon == "invincible":
		self.player1Invincible = 1
		taskMgr.doMethodLater(5,self.notInvince1,"mortal1")
	elif self.player1Weapon == "grenade":
		self.jNP.getChildren().detach()
		gren = loader.loadModel("models/gamedev/grenade")
		gren.setScale(2.5)
		gren.reparentTo(render)
		angle = (self.playerModel.getH())*math.pi/180.0
		ProjectileInterval(gren, startPos = Point3(self.playerModel.getPos()),startVel = Point3(math.sin(angle)*30,0,10), endZ = -50).start()
		if gren.getZ() == -50:
			gren.removeNode()
		cHandler = CollisionHandlerEvent()
		cHandler.addInPattern('%fn-into-%in')
		boundsB = gren.getChild(0).getBounds()
		centerB = boundsB.getCenter()
		radiusB = boundsB.getRadius()*0.65
		cSphereB = CollisionSphere(centerB,radiusB)
		cNodeB = CollisionNode("grenade")
		cNodeB.addSolid(cSphereB)
		cNodePathB = gren.attachNewNode(cNodeB)
		self.cTrav.addCollider(cNodePathB,cHandler)
		
		self.acceptOnce("grenade-into-platform",self.explode)
		
	elif self.player1Weapon == "molotov":
		self.jNP.getChildren().detach()
	elif self.player1Weapon == "saw":
		self.jNP.getChildren().detach()
	elif self.player1Weapon == "invis":
		self.jNP.getChildren().detach()
		self.playerModel2.hide()
		taskMgr.doMethodLater(4.0,self.showPlayer,"showPlayer")
	elif self.player1Weapon == "icestage":
		self.jNP.getChildren().detach()
		self.speed1 = 6
		self.speed2 = 6
		self.background.detachNode()
		self.background2.reparentTo(render)
		taskMgr.doMethodLater(5,self.restoreSpeedBG,"restoreStuff")
		
    def restoreSpeedBG(self,task):
	self.speed1 = 3
	self.speed2 = 3
	self.background2.detachNode()
	self.background.reparentTo(render)
	
    def showPlayer(self,task):
	self.playerModel.show()
	self.playerModel2.show()
	
    def useWeapon2(self):
	if self.player2Weapon == "meteo":
		fireRain = Sequence(Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), 
		Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), Func(self.rain), Wait(.5), Func(self.rain))
		fireRain.start()
	elif self.player2Weapon == "jump":
		angle = self.playerModel2.getH()/90
		ProjectileInterval(self.playerModel2, startPos = Point3(self.playerModel2.getPos()),startVel = Point3(angle*30,0,100), endZ = self.playerModel2.getZ()).start()
	elif self.player2Weapon == "speedUp":
		self.speed2 = 6
	elif self.player2Weapon == "blind":
		camera.setPos(Vec3(-50,0,0))
		taskMgr.doMethodLater(5,self.restoreCamera,"restoreCamera")
	elif self.player2Weapon == "invincible":
		self.player2Invincible = 1
		taskMgr.doMethodLater(5,self.notInvince2,"mortal2")
	elif self.player2Weapon == "grenade":
		self.jNP2.getChildren().detach()
		gren = loader.loadModel("models/gamedev/grenade")
		gren.setScale(2.5)
		gren.reparentTo(render)
		angle = (self.playerModel2.getH())*math.pi/180.0
		ProjectileInterval(gren, startPos = Point3(self.playerModel2.getPos()),startVel = Point3(math.sin(angle)*30,0,10), endZ = -50).start()
		if gren.getZ() == -50:
			gren.removeNode()
		cHandler = CollisionHandlerEvent()
		cHandler.addInPattern('%fn-into-%in')
		boundsB = gren.getChild(0).getBounds()
		centerB = boundsB.getCenter()
		radiusB = boundsB.getRadius()*0.65
		cSphereB = CollisionSphere(centerB,radiusB)
		cNodeB = CollisionNode("grenade")
		cNodeB.addSolid(cSphereB)
		cNodePathB = gren.attachNewNode(cNodeB)
		self.cTrav.addCollider(cNodePathB,cHandler)
		
		self.acceptOnce("grenade-into-platform",self.explode)
		
	elif self.player2Weapon == "molotov":
		self.jNP.getChildren().detach()
	elif self.player2Weapon == "saw":
		self.jNP.getChildren().detach()
	elif self.player2Weapon == "invis":
		self.jNP.getChildren().detach()
		self.playerModel1.hide()
		taskMgr.doMethodLater(4.0,self.showPlayer,"showPlayer")
	elif self.player2Weapon == "icestage":
		self.jNP2.getChildren().detach()
		self.speed1 = 6
		self.speed2 = 6
		self.background.detachNode()
		self.background2.reparentTo(render)
		taskMgr.doMethodLater(5,self.restoreSpeedBG,"restoreStuff")
		
    def rain(self):
	    meteoBall = Actor("models/gamedev/fireball")
	    meteoBall.reparentTo(render)
	    meteoBall.setScale(2)
	    meteoBall.setH(-15)
	    boundsB = meteoBall.getChild(0).getBounds()
            centerB = boundsB.getCenter()
            radiusB = boundsB.getRadius()*0.65
            cSphereB = CollisionSphere(centerB,radiusB)
            cNodeB = CollisionNode("meteor")
            cNodeB.addSolid(cSphereB)
            cNodePathB = meteoBall.attachNewNode(cNodeB)
	    #cNodePathB.show()
	    
	    ProjectileInterval(meteoBall, startPos = Point3(random.randint(15,211),0,170),startVel = Point3(-12,0,0), endZ = -50).start()
	    
	    cHandler = CollisionHandlerEvent()
	    cHandler.addInPattern('%fn-into-%in')
	    self.cTrav.addCollider(cNodePathB,cHandler)
	    self.accept("meteor-into-player1",self.player2Wins)
	    self.accept("meteor-into-player2",self.player1Wins)
	    
    def showBalls(self,task):
        for i in self.ball:
            i.show()
     
    def notInvince1(self,task):
	self.player1Invincible = 0
	
    def notInvince2(self,task):
        self.player2Invincible = 0

    def restoreCamera(self,task):
        camera.setPosHpr(Vec3(98,-390,90), Vec3(0,-5,0))
        
    def switch(self,task):
        self.environment.setColor(0,1,0.3)
        
    def colliding1( self, collEntry ): # accept a collision entry argument    
        if self.ignoreColl == 0:
            self.player1IsColliding = 1 # we are colliding        
            self.stopWalk( ) # pause all walking animation and movement        
            disp = ( collEntry.getSurfacePoint( render ) - collEntry.getInteriorPoint( render ) )
            newPos = self.playerModel2.getPos( ) + disp # get new position
            self.playerModel2.setPos( newPos ) # and set it to tiny's position
        # end colliding        
        
    def notColliding1( self, collEntry ): 
        self.player1IsColliding = 0    
        
    def colliding2( self, collEntry ): # accept a collision entry argument 
        if self.ignoreColl == 0:
            self.player2IsColliding = 1 # we are colliding        
            self.stopWalk2( ) # pause all walking animation and movement               
            disp = ( collEntry.getSurfacePoint( render ) - collEntry.getInteriorPoint( render ) )
            newPos = self.playerModel2B.getPos( ) + disp # get new position
            self.playerModel2B.setPos( newPos ) # and set it to tiny's position
        # end colliding        
        
    def notColliding2( self, collEntry ): 
        self.player2IsColliding = 0    
        
    def returnSpeeds(self,task):
        self.speed1 = 8.0
        self.speed2 = 8.0
        self.turnSpeed1 = 80.0
        self.turnSpeed2 = 80.0
        
    def returnSpeeds2(self,task):
        self.acceptOnce("w",self.walk)
        self.acceptOnce("o",self.walk2)
        self.speed1 = 8.0
        self.speed2 = 8.0
        self.turnSpeed1 = 80.0
        self.turnSpeed2 = 80.0
        
    def returnSpeeds3(self,task):
        self.speed1 = 8.0
        self.speed2 = 8.0
        self.turnSpeed1 = 80.0
        self.turnSpeed2 = 80.0
        
    def changeMusic(self,task):
        self.music.stop()
        self.music2  = loader.loadMusic("models/gamedev/ADRENALINE.mp3")
        self.music2.play()
        
    def clockTask(self,task):
        self.timer.detachNode()
        self.timer = OnscreenText("%d" % (self.gameLen-globalClock.getRealTime(),), pos = (98,145), scale = 18.0)
        self.timer.setColor(1,1,1)
        self.timer.reparentTo(render)
        return Task.cont
    
    def ballMovementTask(self,task):
	self.anp.setY(0)
	self.anp2.setY(0)
	for i in range(self.ballNum+1):
		if i < len(self.ball):
			if self.ball[i].getX() > 234 or self.ball[i].getX() < -38 or self.ball[i].getZ() < -10 or self.ball[i].getZ() > 132:
				self.ball[i].setPos(self.ball[i].getPos()/1.005)
				z=random.randint(1,2)
				if z ==1:
					z=-1
				else:
					z=1
				self.movement[i]=Vec3(random.random()*z,0,random.random()*z)
			else:
				self.ball[i].setPos(self.ball[i].getPos()+self.movement[i])
	return Task.cont
	
    def fire(self):
        
        self.fire = ParticleEffect()
        
        self.fire.reset()
        self.fire.setPos(0.000, 0.000, 0.000)
        self.fire.setHpr(0.000, 0.000, 0.000)
        self.fire.setScale(10.000, 10.000, 10.000)
        p0 = Particles('particles-1')
        # Particles parameters
        p0.setFactory("PointParticleFactory")
        p0.setRenderer("SpriteParticleRenderer")
        p0.setEmitter("DiscEmitter")
        p0.setPoolSize(1024)
        p0.setBirthRate(0.0200)
        p0.setLitterSize(10)
        p0.setLitterSpread(0)
        p0.setSystemLifespan(1200.0000)
        p0.setLocalVelocityFlag(1)
        p0.setSystemGrowsOlderFlag(0)
        # Factory parameters
        p0.factory.setLifespanBase(2.0000)
        p0.factory.setLifespanSpread(0.0000)
        p0.factory.setMassBase(1.0000)
        p0.factory.setMassSpread(0.0000)
        p0.factory.setTerminalVelocityBase(400.0000)
        p0.factory.setTerminalVelocitySpread(0.0000)
        # Point factory parameters
        # Renderer parameters
        p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT)
        p0.renderer.setUserAlpha(0.22)
        # Sprite parameters
        p0.renderer.addTextureFromFile('models/gamedev/sparkle.png')
        p0.renderer.setColor(Vec4(1.00, 1.00, 1.00, 1.00))
        p0.renderer.setXScaleFlag(1)
        p0.renderer.setYScaleFlag(1)
        p0.renderer.setAnimAngleFlag(0)
        p0.renderer.setInitialXScale(0.5000)
        p0.renderer.setFinalXScale(2.0000)
        p0.renderer.setInitialYScale(1.0000)
        p0.renderer.setFinalYScale(2.0000)
        p0.renderer.setNonanimatedTheta(0.0000)
        p0.renderer.setAlphaBlendMethod(BaseParticleRenderer.PPNOBLEND)
        p0.renderer.setAlphaDisable(0)
        # Emitter parameters
        p0.emitter.setEmissionType(BaseParticleEmitter.ETRADIATE)
        p0.emitter.setAmplitude(1.0000)
        p0.emitter.setAmplitudeSpread(0.0000)
        p0.emitter.setOffsetForce(Vec3(0.0000, 0.0000, 3.0000))
        p0.emitter.setExplicitLaunchVector(Vec3(1.0000, 0.0000, 0.0000))
        p0.emitter.setRadiateOrigin(Point3(0.0000, 0.0000, 0.0000))
        # Disc parameters
        p0.emitter.setRadius(0.5000)
        self.fire.addParticles(p0)
        
        self.fire.setPos(self.playerModel2.getPos())
        
        t = Sequence(Func(self.fire.start, render, render),Wait(20),Func(self.cleanFire))
        t.start()
 
    def cleanFire(self):
        self.fire.cleanup()

    def explode(self,cEntry):

        self.explosion = ParticleEffect()
        
        self.explosion.reset()
        self.explosion.setPos(cEntry.getIntoNodePath().getParent().getPos())
        self.explosion.setHpr(0.000, 0.000, 0.000)
        self.explosion.setScale(10.000, 10.000, 10.000)
        p0 = Particles('particles-1')
        # Particles parameters
        p0.setFactory("PointParticleFactory")
        p0.setRenderer("LineParticleRenderer")
        p0.setEmitter("SphereVolumeEmitter")
        p0.setPoolSize(10000)
        p0.setBirthRate(0.0500)
        p0.setLitterSize(10000)
        p0.setLitterSpread(0)
        p0.setSystemLifespan(2.0000)
        p0.setLocalVelocityFlag(1)
        p0.setSystemGrowsOlderFlag(1)
        # Factory parameters
        p0.factory.setLifespanBase(2.0000)
        p0.factory.setLifespanSpread(0.0000)
        p0.factory.setMassBase(.5000)
        p0.factory.setMassSpread(0.0500)
        p0.factory.setTerminalVelocityBase(400.0000)
        p0.factory.setTerminalVelocitySpread(0.0000)
        # Point factory parameters
        # Renderer parameters
        p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAOUT)
        p0.renderer.setUserAlpha(1.00)
        # Line parameters
        p0.renderer.setHeadColor(Vec4(1.00, 0.00, 0.00, 1.00))
        p0.renderer.setTailColor(Vec4(1.00, 1.00, 0.00, 1.00))
        p0.renderer.setLineScaleFactor(3.00)
        # Emitter parameters
        p0.emitter.setEmissionType(BaseParticleEmitter.ETRADIATE)
        p0.emitter.setAmplitude(10.0000)
        p0.emitter.setAmplitudeSpread(0.0000)
        p0.emitter.setOffsetForce(Vec3(0.0000, 0.0000, -0.4930))
        p0.emitter.setExplicitLaunchVector(Vec3(1.0000, 0.0000, 0.0000))
        p0.emitter.setRadiateOrigin(Point3(0.0000, 0.0000, 0.0000))
        # Sphere Volume parameters
        p0.emitter.setRadius(0.5000)
        self.explosion.addParticles(p0)
        f0 = ForceGroup('gravity')
        # Force parameters
        self.explosion.addForceGroup(f0)
        
	cHandler = CollisionHandlerEvent()
	cHandler.addInPattern('%fn-into-%in')
	cSphereB = CollisionSphere(cEntry.getIntoNodePath().getParent().getPos(),1)
	cNodeB = CollisionNode("explosion")
	cNodeB.addSolid(cSphereB)
	cNodePathB = self.explosion.attachNewNode(cNodeB)
	self.cTrav.addCollider(cNodePathB,cHandler)
	cNodePathB.show()
        
	self.accept("player1-into-explosion",self.player2Wins)
	self.accept("player2-into-explosion",self.player1Wins)
        #f.reparentTo(self.playerModel)
        #self.explosion.setPos(self.playerModel.getPos())

        t = Sequence(Func(self.explosion.start, render, render),Wait(2),Func(self.cleanExplo))
        t.start()
	cEntry.getFromNodePath().getParent().removeNode()
        
    def cleanExplo(self):
        self.explosion.cleanup()

    def endGame(self,task):
        taskMgr.removeTasksMatching('returnSpeedsToNormal')
        taskMgr.removeTasksMatching('restoreCamera')
	taskMgr.removeTasksMatching('clockTask')
	taskMgr.removeTasksMatching('ballMoveTask')
	
	self.music.stop()

        self.music3  = loader.loadMusic("models/gamedev/CSTAR.mp3")
        self.music3.play()
        
        self.speed1 = 0
        self.speed2 = 0

    def getScores(self):
	return (self.player1Score, self.player2Score)
		
    def getGameLen(self):
	return self.gameLen
		
    def stopMusic(self):
	self.music3.stop()
	
    def destroy(self):
	self.playerModel.detachNode()
	self.playerModel2.detachNode()
	self.background.destroy()
	self.lava.detachNode()
	self.ladder.detachNode()
	self.ladder2.detachNode()
	
	for i in range(self.ballNum+1):
	    self.ball[i].detachNode()
	    
    def stopMusic(self):
        self.music3.stop()
        
#world = Lvl03()
#world.start()
#run()
class DirectionExperiment(ViewTowers):
    def __init__(self, *args, **kwargs):
        ViewTowers.__init__(self, *args, **kwargs)

        # ignore keys set by viewer
        for key in self.getAllAccepting():
            if key in ("s", "escape"):
                continue
            self.ignore(key)
        self.permanent_events = self.getAllAccepting()

        # global variables
        self.text_bg = (1, 1, 1, 0.7)
        self.font = self.loader.loadFont("cmr12.egg")
        self.question = "Use the mouse to indicate the direction that " "the tower will fall."
        self.feedback_time = 3.0
        self.buffer_time = 0.75

        # create text
        self.create_all_text()

        # create direction line
        self.line = LineSegs()
        self.line_node = None
        self.angle = None

        alight = AmbientLight("alight3")
        alight.setColor((0.8, 0.8, 0.8, 1))
        self.line_light = self.lights.attachNewNode(alight)

    def place_camera(self):
        self.cameras.setPos(0, -12, 2.5)
        self.look_at.setPos(0, 0, 1.5)
        self.cameras.lookAt(self.look_at)

    def run(self):
        # Show the start screen
        self.toggle_task("show_start_screen")
        # Call parent's run().
        ShowBase.run(self)

    def create_all_text(self):
        self.continue_text = OnscreenText(
            **{
                "text": (
                    "In a moment, you will be asked the question displayed on "
                    "the left.  When you are ready, press the spacebar to begin."
                ),
                "style": 1,
                "fg": (0.75, 0, 0, 1),
                "bg": self.text_bg,
                "pos": (0.4, 0.4),
                "align": TextNode.ACenter,
                "scale": 0.08,
                "font": self.font,
                "wordwrap": 20,
            }
        )
        self.text_parent = self.continue_text.getParent()
        self.continue_text.detachNode()

        xpos = -1.25
        self.question_text = OnscreenText(
            **{
                "text": self.question,
                "style": 1,
                "fg": (0, 0, 0.8, 1),
                "bg": self.text_bg,
                "pos": ((xpos + 0.05), 0.8),
                "align": TextNode.ALeft,
                "scale": 0.075,
                "font": self.font,
                "wordwrap": 35,
            }
        )

        self.trials_remaining_text = OnscreenText(
            **{
                "text": "",
                "style": 1,
                "fg": (0, 0, 0, 1),
                "bg": self.text_bg,
                "pos": (-xpos, -0.95),
                "align": TextNode.ARight,
                "scale": 0.05,
                "font": self.font,
            }
        )

    def show_start_screen(self, task):
        self.continue_text.reparentTo(self.text_parent)
        self.accept("space", self.toggle_task, ["show_trial"])

    def show_trial(self, task):
        if self.line_node is not None:
            self.line_node.removeNode()
            self.line_node = None

        if self.sso is None:
            self.goto_sso(0)
        elif self.ssos.index(self.sso) == (self.n_ssos - 1):
            self.exit()
        else:
            self.next()

        n = self.n_ssos - self.ssos.index(self.sso)
        self.trials_remaining_text.setText("Trials remaining: %d" % n)

        self.continue_text.detachNode()

        self.camera_rot.setH(np.random.randint(0, 360))
        self.cam_spin = 270

        self.taskMgr.doMethodLater(self.buffer_time, self.rotate, "rotate")

    def rotate(self, task):
        """ Task: rotate camera."""
        H = (self.camera_rot.getH() + 1) % 360
        self.camera_rot.setH(H)
        self.cam_spin -= 1
        if self.cam_spin == 0:
            self.toggle_task("show_question")
            return task.done
        else:
            return task.cont

    def show_question(self, task):
        self.toggle_task("draw_direction")
        self.accept("mouse1", self.record_response)

    def record_response(self):
        self.ignore("mouse1")
        self.taskMgr.remove("draw_direction")
        self.toggle_task("physics")

    def physics(self, task):
        """ Task: simulate physics."""
        # Elapsed time.
        dt = self._get_elapsed() - self.old_elapsed
        # Update amount of time simulated so far.
        self.old_elapsed += dt
        # Step the physics dt time.
        size_sub = self.bbase.sim_par["size_sub"]
        n_subs = int(dt / size_sub)
        self.bbase.step(dt, n_subs, size_sub)

        if self.old_elapsed >= self.feedback_time:
            self.toggle_task("show_trial")
            return task.done
        else:
            return task.cont

    def draw_direction(self, task):
        if self.mouseWatcherNode.hasMouse():
            cv = self._get_collision(self.floor)
            cv = cv / np.linalg.norm(cv)
            self.angle = np.arctan2(cv[1], cv[0])

            sx, sy, sz = self.floor.getScale() / 2.0
            gx, gy, gz = self.floor.getPos()
            gz += sz + 0.01

            if self.line_node is not None:
                self.line_node.removeNode()
                self.line_node = None

            self.line.reset()
            self.line.setColor(1, 1, 1, 1)
            self.line.setThickness(5)
            self.line.moveTo(gx, gy, gz)
            self.line.drawTo(cv[0] * sx, cv[1] * sy, gz)
            self.line_node = self.render.attachNewNode(self.line.create())
            self.line_node.setLight(self.line_light)

        return task.cont

    def _get_collision(self, node, debug=False):
        mx = self.mouseWatcherNode.getMouseX()
        my = self.mouseWatcherNode.getMouseY()
        if debug:
            print "mouse:", (mx, my)

        # get the origin and direction of the ray extending from the
        # camera to the mouse pointer
        cm = np.array(self.cam.getNetTransform().getMat())
        cr = CollisionRay()
        cr.setFromLens(self.cam.node(), (mx, my))
        cp = np.hstack([cr.getOrigin(), 1])
        cd = np.hstack([cr.getDirection(), 0])
        cp = np.dot(cm.T, cp)[:3]
        cd = np.dot(cm.T, cd)[:3]
        if cd[2] > -1:
            cd[2] = -1
        if debug:
            print "direction:", cd
            print "origin:", cp

        # point on the plane, z-axis
        pz = node.getPos(self.render)[2]
        sz = node.getScale(self.render)[2] / 2.0
        p0 = np.array([0, 0, pz + sz])
        if debug:
            print "p0:", p0

        # this is the intersection equation that we want to solve,
        # where s is the point on the line that intersects
        #     e_z(cp + s*cd - p0) = 0
        s = (p0[2] - cp[2]) / cd[2]
        if debug:
            print "s:", s

        # transform the collision point from line coordinates to world
        # coordinates
        cv = cp + s * cd
        if debug:
            print "collision:", cv

        return cv
Esempio n. 9
0
class MyApp(ShowBase):
              
        

    def cleanUpStartScreen( self ):       
        self.startButton.destroy( ) # get rid of the button       
        self.logoModel.detachNode( ) # detach the logo model from the render        
        self.loadGame( ) # load the actual game       
        # end cleanUpStartScreen


    def addInstructions(pos, msg):
        return OnscreenText(text=msg, style=1, fg=(1,1,1,1),pos=(-1.3, pos), align=TextNode.ALeft, scale = .05)
        
    def __init__(self):
	global x,y,z
	#self.loadStartScreen()
        ShowBase.__init__(self)

	#self.setupBackgroundColor(1,1,1)       
        # set the camera position       
        #camera.setPosHpr( Vec3( 0, -10, 0 ), Vec3( 0, 0, 0 ) )       
        # load our logo model       
        self.logoModel = loader.loadModel("bvw-f2004--truck/cartruck.egg")
        self.logoModel.reparentTo( render )       
        # set the logo model's position       
        self.logoModel.setPosHpr( Vec3( 0, 15, 0 ), Vec3( 0, 0, 0 ) )       
        # create and display a start button       
        self.startButton = DirectButton( text = "Go!", relief = DGG.RAISED, scale = .1, pad = ( .5, .5 ), pos = Vec3( 1.0, 0.0, -0.8 ), command = self.cleanUpStartScreen )
	self.disableMouse()
	self.obs = [None] * 100
	self.keyMap = {"forward":0, "slow":0, "left":0, "right":0}

	#self.environ = [None]*100
	self.grb= [None] * 100
	self.env= [None] * 20
	self.env1= [None] * 20
	self.envx= [None] * 20
	self.envy= [None] * 20

	self.title = OnscreenText(text="SCORE: " + str(score), style=1, fg=(1,1,0,1), pos=(-0.95,0.85), scale = .07, mayChange = True)
        self.title1 = OnscreenText(text="LIVES: " + str(int (gameover/2)), style=1, fg=(1,1,0,1), pos=(-0.95,0.7), scale = .07, mayChange = True)
        self.timeleft = OnscreenText(text="TIME LEFT: " + str(int(time/60)) + " : " + str(int(time%60)), style=1, fg=(1,1,0,1), pos=(-0.95,0.55), scale = .07, mayChange = True)
        
	self.model= self.loader.loadModel("alice-farm--cornfield/cornfield.egg")
	self.model.reparentTo(self.render)
	self.model.setPos(-8, 42, 0)
	self.model.setScale(20,1000,20)

        # Reparent the model to render.
	self.environ2 = self.loader.loadModel("bvw-f2004--building/building.egg")
	self.environ2.reparentTo(self.render)
	self.environ2.setPos(S1x, S1y, S1z)
	self.environ2.setScale(0.2, 0.2, 0.2)
	
	for i in range(0,100):
                        self.obs[i]= self.loader.loadModel("alice-objects--anvil/anvil.egg")
                        self.obs[i].reparentTo(self.render)
                        self.obs[i].setX(random.choice([0, 10]))
                        self.obs[i].setY(random.randint(100,100000))
                        self.obs[i].setZ(3)
                        self.obs[i].setScale(10,20,10)

	for j in range(0,100):
			self.grb[j]= self.loader.loadModel("alice-shapes--icosahedron/icosahedron.egg")
			self.grb[j].reparentTo(self.render)
			self.grb[j].setX(random.choice([0, 10]))
			self.grb[j].setY(random.randint(100, 100000))
			self.grb[j].setZ(3)
			self.grb[j].setScale(0.8,3,0.8)

        for k in range(0,20):
                self.envx[k]= self.loader.loadModel("bvw-f2004--building/building.egg")
                self.envx[k].reparentTo(self.render)
                self.envx[k].setX(random.choice([-60, 60]))
                self.envx[k].setY(random.randint(13000, 35000))
                self.envx[k].setZ(0)
                self.envx[k].setScale(0.8, 0.8, 0.8)

        for k in range(0,20):
                self.envy[k]= self.loader.loadModel("bvw-f2004--russianbuilding/tetris-building.egg")
                self.envy[k].reparentTo(self.render)
                self.envy[k].setX(random.choice([-100, 100]))
                self.envy[k].setY(random.randint(38000, 60000))
                self.envy[k].setZ(0)
                self.envy[k].setScale(0.8, 0.8, 0.8)

	self.environ4 = self.loader.loadModel("alice-city--townhouse1/townhouse1.egg")
	self.environ4.reparentTo(self.render)
	self.environ4.setPos(T1x, T1y, T1z)
	self.environ4.setScale(0.6, 0.6, 0.6)

	self.BS = self.loader.loadModel("alice-skies--bluesky/bluesky.egg")
        self.BS.reparentTo(self.render)
        self.BS.setScale(10,10,10)
        self.BS.setPos(-180,0,0)

        self.barn= self.loader.loadModel("alice-farm--farmhouse/farmhouse.egg")
        self.barn.reparentTo(self.render)
        self.barn.setScale(0.5, 0.5, 0.5)
        self.barn.setPos(30,500,0)

        self.barn1= self.loader.loadModel("alice-beach--beachhouse2/beachhouse2.egg")
        self.barn1.reparentTo(self.render)
        self.barn1.setScale(0.5, 0.5, 0.5)
        self.barn1.setPos(40,200,0)

        self.barn2= self.loader.loadModel("alice-beach--beachhouse2/beachhouse2.egg")
        self.barn2.reparentTo(self.render)
        self.barn2.setScale(0.5,0.5,0.5)
        self.barn2.setPos(70,1700,0)

        self.barn3= self.loader.loadModel("bvw-f2004--russianbuilding/tetris-building.egg")
        self.barn3.reparentTo(self.render)
        self.barn3.setScale(0.5,0.5,0.5)
        self.barn3.setPos(-90,1500,0)


        self.barn5= self.loader.loadModel("bvw-f2004--course1/course1.egg")
        self.barn5.reparentTo(self.render)
        self.barn5.setScale(0.25, 0.25, 0.25)
        self.barn5.setPos(-100,900,0)

        

	
        # Apply scale and position transforms on the model.
        self.environ1= self.loader.loadModel("alice-vehicles--zamboni/zamboni.egg")
        self.environ1.reparentTo(self.render)
        self.environ1.setPos(E1posX, E1posY, E1posZ)
        self.environ1.setScale(0.3, 0.3, 0.3)
	print E1posY

    def loadGame(self):

	self.camera.setPos(CposX, CposY, CposZ)
	self.camera.setHpr(0,0,0)

	#for j in range(0, 100):

                #self.environ[j] = self.loader.loadModel("CityTerrain/CityTerrain")
                #self.environ[j].reparentTo(self.render)
                #self.environ[j].setPos(-8,42 + 210*j,0)
                #self.environ[j].setScale(0.25,0.25,0.25)


	self.accept("arrow_up-repeat", self.setKey, ["forward", 1])
	self.accept("arrow_down-repeat", self.setKey, ["slow", 1])
	self.accept("arrow_left", self.setKey, ["left", 1])
	self.accept("arrow_right", self.setKey, ["right", 1])

	base.cTrav = CollisionTraverser()
	
	self.collHandEvent = CollisionHandlerEvent()
	self.collCount=0
        self.collHandEvent.addInPattern('into-%in')
        self.collHandEvent.addOutPattern('outof-%in')
	sColl = self.initCollisionSphere(self.environ1, True)
	base.cTrav.addCollider(sColl[0], self.collHandEvent)

	for child in render.getChildren():	
		if child != camera  and child != self.environ2 and child!= self.environ4 and child != self.BS and child!= self.model and child!= self.barn and child!= self.barn1 and child!= self.barn2 and child!= self.barn3 and child!= self.barn5:
			#print child
			tColl = self.initCollisionSphere(child, True)
			base.cTrav.addCollider(tColl[0], self.collHandEvent)
			self.accept('into-' + tColl[1] , self.collide)
			
			

##        for m in range(0,100):
##                tgrb= self.initCollisionSphere(self.grb[i], True)
##                base.cTrav.addCollider(tgrb[0], self.collHandEvent)
##                self.accept('into-' + tgrb[1], self.collide)
##
##        for n in range(0,100):
##                tobs= self.initCollisionSphere(self.obs[i], True)
##                base.cTrav.addCollider(tobs[0], self.collHandEvent)
##                self.accept('into-' + tobs[1], self.collide)
			
               
	self.taskMgr.add(self.move, "moveTask")
	

    def initCollisionSphere(self, obj,show=False):
        # Get the size of the object for the collision sphere.
        bounds = obj.getChild(0).getBounds()
        center = bounds.getCenter()
        radius = bounds.getRadius() *0.5
 
        # Create a collison sphere
        collSphereStr = 'CollisionHull' + str(self.collCount) + "_" + obj.getName()
        self.collCount += 1
        cNode = CollisionNode(collSphereStr)
        cNode.addSolid(CollisionSphere(center, radius))
 
        cNodepath = obj.attachNewNode(cNode)
	#cNodepath.show()
        
 
        # Return a tuple with the collision node and its corrsponding string so
        # that the bitmask can be set.
        return (cNodepath, collSphereStr)

    def collide(self, collEntry):
        global score,E1posY,gameover,adj, CposY
        if self.environ1.getY()==-100:
            return
        if(collEntry.getIntoNodePath().getParent().getName()== "icosahedron.egg"):
            #print collEntry.getIntoNodePath().getParent().getName() 
            collEntry.getIntoNodePath().getParent().remove()
            score= score +10
            print score
            self.title.detachNode()
            self.title = OnscreenText(text="SCORE: " + str(score), style=1, fg=(1,1,0,1), pos=(-0.95,0.85), scale = .07, mayChange = True)

        elif(collEntry.getIntoNodePath().getParent().getName()== "anvil.egg"):
                E1posY= E1posY-50
                CposY= CposY-50
                self.camera.setPos(CposX, CposY, CposZ)
                self.environ1.setPos(E1posX, E1posY, E1posZ)
                gameover= gameover - 1
                self.title1.detachNode()
                self.title1= OnscreenText(text="LIVES: " + str(int(gameover/2)), style=1, fg=(1,1,0,1), pos=(-0.95, 0.7), scale = .07, mayChange = True)
                print gameover
                if(gameover<=0):
                    print "Game Over"
##                    time2= int(time-(task.time*0.5))
##                    if time1!=time2:
##                    self.inst2.detachNode()
##                    self.inst2 = addInstructions(0.89, "Time: "+str(time2))   
##                    time1=time2
##                    if time2==0:
                    OnscreenText(text= "GAME OVER", style=1, fg=(1,1,1,1),pos=(-0.9,0), align=TextNode.ALeft, scale = 0.35)
                    OnscreenText(text= "Your Final Score is " + str(score), style=1, fg=(1,1,0,1), pos=(-0.95, -0.05), align=TextNode.ALeft, scale=0.015)
                    #time.sleep(10)
                    #sys.exit
                    self.environ1.detachNode()
                    self.camera.detachNode()

    def setKey(self, key, value):
	self.keyMap[key]= value

    def move(self, task):
	global E1posX, E1posY, E1posY, CposX, CposY, CposZ, S1y, S2y, T1y, n, y,speed, time
	self.over=0
	ts= int(task.time)
	time= 120 -ts
	print time,ts
	self.timeleft.detachNode()
	self.timeleft=  OnscreenText(text="TIME LEFT: " + str(int(time/60)) + " : " + str(int(time%60)), style=1, fg=(1,1,0,1), pos=(-0.95,0.55), scale = .07, mayChange = True)
	if(time<=0):
                    time=0
                    OnscreenText(text= "GAME OVER", style=1, fg=(1,1,1,1),pos=(-0.9,0), align=TextNode.ALeft, scale = 0.35)
                    OnscreenText(text= "Your Final Score is " + str(score), style=1,fg=(1,1,0,1), pos=(-0.95, -0.05), align=TextNode.ALeft, scale=0.02)
                    #time.sleep(10)
                    #sys.exit
                    self.environ1.detachNode()
                    self.over=1
            
	if(self.keyMap["forward"]==1):
		self.keyMap["forward"]=0
		speed= 10
		if speed>=10:
                    speed= 20
                elif speed>=20:
                    speed= 30
		dist= speed
		print dist
		E1posY= E1posY + dist
		CposY= CposY + dist
		S1y= S1y + dist
		S2y= S2y + dist
		T1y= T1y + dist
		y= y+ dist
		self.environ1.setPos(E1posX, E1posY, E1posZ)
		self.camera.setPos(CposX, CposY, CposZ)
		if(E1posY==7500 * n or E1posY== 7500 *n +20):
			n= n+1
			self.environ4.setPos(T1x, T1y, T1z)
			#self.environ3.setPos(S2x, S2y, S2z)
			self.environ2.setPos(S1x, S1y, S1z)
			self.model.setPos(x,y + 550,z)
			
		print E1posX, E1posY, E1posZ, CposX, CposY, CposZ, x, y, z

	elif(self.keyMap["slow"]==1):
                global slowadj
                self.keyMap["slow"]=0
                if slowadj<100:
                    slowadj+= slowadj
                    speed= speed-10
                    if speed<0:
                        speed=0
                elif slowadj<200:
                    slowadj+= slowadj
                    speed= speed-10
                    if speed<0:
                        speed=0

                elif slowadj<300:
                    slowadj+= slowadj
                    speed= speed-10
                    if speed<0:
                        speed=0

                elif slowadj>=300:
                        speed=0

                print speed    
		E1posY= E1posY + speed
                CposY= CposY + speed
		S1y= S1y + speed
		S2y= S2y + speed
		T1y= T1y + speed
		y= y + speed
                self.environ1.setPos(E1posX, E1posY, E1posZ)
                self.camera.setPos(CposX, CposY, CposZ)
		if(E1posY>=7700 * n and E1posY<= 7700 *n + 30):
			n= n+1
			self.environ4.setPos(T1x, T1y, T1z)
			self.environ3.setPos(S2x, S2y, S2z)
			self.environ2.setPos(S1x, S1y, S1z)
			self.model.setPos(x,y + 550,z)

		print E1posX, E1posY, E1posZ, CposX, CposY, CposZ

	elif(self.keyMap["left"]==1):
                self.keyMap["left"]=0
		if(E1posX!=0):
			E1posX=0
			CposX=0

                self.environ1.setPos(E1posX, E1posY, E1posZ)
                self.camera.setPos(CposX, CposY, CposZ)

	elif(self.keyMap["right"]==1):
		self.keyMap["right"]=0
		if(E1posX!=10):
			E1posX=10
			CposX=10

		self.environ1.setPos(E1posX, E1posY, E1posZ)
		self.camera.setPos(CposX, CposY, CposZ)

        elif(self.keyMap["forward"]==0):
                if(self.over==1):
                    CposY= CposY
                elif(self.over==0):
                
                    print E1posY, CposY, speed
                    E1posY= E1posY + speed
                    CposY= CposY + speed
                    S1y= S1y + speed
                    S2y= S2y + speed
                    T1y= T1y + speed
                    y= y + speed
                    self.environ1.setPos(E1posX, E1posY, E1posZ)
                    self.camera.setPos(CposX, CposY, CposZ)
                    if(E1posY>=7500 * n and E1posY<= 7500 *n + 30):
                            n= n+1
                            self.environ4.setPos(T1x, T1y, T1z)
                            #self.environ3.setPos(S2x, S2y, S2z)
                            self.environ2.setPos(S1x, S1y, S1z)
                            self.model.setPos(x,y + 550,z)
	
	return Task.cont 
Esempio n. 10
0
class Lvl01(DirectObject):
	#constructor
	def start(self):
		base.disableMouse() #turn off mouse camera control
		#camera.setPosHpr(Vec3(93,-90,0), Vec3(0,0,0))
		# Turn off the default camera and replace it with two new cameras, with 
		# side-by-side DisplayRegions. 
		
		base.camNode.setActive(0)
		base.makeCamera(base.win, displayRegion = (0, 0.48, 0, 1)) 
		base.makeCamera(base.win, displayRegion = (0.52, 1, 0, 1))
		base.makeCamera(base.win, displayRegion = (0.48,0.52,0,1))
	
		base.camList[3].setPos(Vec3(144,0,-1000))
		
		self.gameLen = 100
		
		self.numActuator = 10
		
		self.music = loader.loadMusic("models/gamedev/AD.mp3")
		self.music.play()
		
		globalClock.reset()
		self.timer = OnscreenText("%d" % (self.gameLen-globalClock.getRealTime(),), pos = (98,145), scale = 18.0)
		self.timer.setColor(1,1,1)
		taskMgr.add(self.clockTask,"clockTask")
	
		self.actCount = 0
		self.speed1 = 3
		self.speed2 = 3
		self.climbSpeed1 = 1
		self.climbSpeed2 = 1
		self.climbing1 = 0
		self.climbing2 = 0
	
                self.array = []
                
                self.loadModels()
                self.setupLighting()
                self.setupStage()
                self.setupCollisions()
                self.setupIntervals()
                
                self.player1Score = 0
                self.player2Score = 0
                  
                self.dir1 = 1
                self.dir2 = 1
                self.nodeCount1 = 0
		self.nodeCount2 = 0

		taskMgr.add(self.cameraFollowTask,"cameraFollowTask")
		taskMgr.add(self.boulderTask,"boulderTask")
		
		taskMgr.doMethodLater(self.gameLen,self.endGame,'endGame')

		#setup key controls
		self.accept("escape",sys.exit)
		#self.accept("w",self.rise)
		#self.accept("o",self.rise2)
	
		#Player 1 movement keys
	
		#self.accept("s",self.fall)
		
		self.acceptOnce("a",self.left)
		self.acceptOnce("d",self.right)
	
		self.accept("a-up",self.stopLeft)
		self.accept("d-up",self.stopRight)
	
		self.acceptOnce("w", self.jump)
		self.acceptOnce("o", self.jumpT2)
	
		#Player 2 movement keys
		#self.accept("l",self.fall2)
		
		self.acceptOnce("k",self.left2)
		self.acceptOnce(";",self.right2)
	
		self.accept("k-up",self.stopLeft2)
		self.accept(";-up",self.stopRight2)
	
		self.jumpOK = 1

	def loadModels(self):
		
		print "start loadModels"
		
		self.playerModel = Actor("models/gamedev/redguy-model",{"walk":"models/gamedev/redguyrun",
			"jump":"models/gamedev/redguy-jump","climb":"models/gamedev/redguy-climb"})
		self.playerModel.reparentTo(render)
		self.playerModel.setScale(.7)
		self.playerModel.setPosHpr(Vec3(46,0,0),Vec3(0,0,0))
		self.playerModel.setH(90)
	
	
		self.playerModel2 = Actor("models/gamedev/bluegirl-model",{"walk2":"models/gamedev/bluegirlrun",
			"jump2":"models/gamedev/bluegirl-jump","climb2":"models/gamedev/bluegirl-climb"})
		self.playerModel2.reparentTo(render)
		self.playerModel2.setScale(.7)
		self.playerModel2.setPosHpr(Vec3(333,0,0),Vec3(0,0,0))
		self.playerModel2.setH(270)

		self.divider = loader.loadModel("models/gamedev/divider")
		self.divider.setPos(144,0,-1000)
		self.divider.setScale(5.0)
		self.divider.reparentTo(render)
		
		self.boulder1 = loader.loadModel("models/gamedev/boulder")
		self.boulder1.reparentTo(render)
		self.boulder1.setScale(7)
		self.boulder1.setPos(46,0,-50)
		self.boulder2 = loader.loadModel("models/gamedev/boulder")
		self.boulder2.reparentTo(render)
		self.boulder2.setScale(7)
		self.boulder2.setPos(333,0,-50)
		
		#loader.loadModel("models/gamedev/actuatorOn")
		
		bounds = self.boulder1.getChild(0).getBounds()
		center = bounds.getCenter()
		radius = bounds.getRadius()*.7
		cSphere = CollisionSphere(center,radius)
		cNode = CollisionNode("boulder")
		cNode.addSolid(cSphere)
		cNodePath = self.boulder1.attachNewNode(cNode)
		#cNodePath.show()
		cNodePath = self.boulder2.attachNewNode(cNode)
		#cNodePath.show()
		
		print "end loadModels"

	def setupStage(self):
		
		print "start setupStage"
		
		self.background = OnscreenImage(image = 'models/gamedev/lvl1background.jpg', pos = (175,5,0),scale=500)
		self.background.reparentTo(render)
	
		x1= 4.9
		x2 = -4.9
		len = 9.8
		h = 0
		a = 0
		p = 0
		j=0
		m=0
		x1b=0
		x2b=0

		while self.actCount < self.numActuator:
			if j > 0:
				lOld = l
				rOld = r
				x1Old = x1
				x2Old = x2
				x1 = (x1Old+x2Old)/2 + 4.9
				x2 = (x1Old+x2Old)/2 - 4.9
				x1o=x1
				x2o=x2
				
				for count in range(1):
					l = random.randint(0,(10-lOld)+((10+rOld)-(10-lOld))/2)
					r = random.randint(0,20-((10-lOld)+((10+rOld)-(10-lOld))/2))
					if r+2 <= 20-((10-lOld)+((10+rOld)-(10-lOld))/2):
						r += 2
					if l+2 < (10-lOld)+((10+rOld)-(10-lOld))/2:
						l += 2
					if 	l+r < 4:
						count = 0
				p = random.randint(0,1)
			else:
				l = 10
				r = 10
				c = 10
			#while a == 0:
			a = random.randint(-l,r)
			if j > 0:
				if j % 2 == 0:
					self.ladder = loader.loadModel("models/gamedev/ladder")
					self.ladder.reparentTo(render)
					self.ladder.setScale(1.5)
					self.ladder.setPos(x1+m,0,h-20)
					self.ladder2 = loader.loadModel("models/gamedev/ladder")
					self.ladder2.reparentTo(render)
					self.ladder2.setScale(1.5)
					self.ladder2.setPos(x1+286+m,0,h-20)
                                        self.array.append(self.ladder)
                                        self.array.append(self.ladder2)
					
				else:
					self.ladder = loader.loadModel("models/gamedev/ladder")
					self.ladder.reparentTo(render)
					self.ladder.setScale(1.5)
					self.ladder.setPos(x2,0,h-20)
					self.ladder2 = loader.loadModel("models/gamedev/ladder")
					self.ladder2.reparentTo(render)
					self.ladder2.setScale(1.5)
					self.ladder2.setPos(x2+286,0,h-20)
                                        self.array.append(self.ladder)
                                        self.array.append(self.ladder2)
				k=-10
				while k <= 13:
					cSphere = CollisionSphere(Point3(1.5,0,k),.5)
					cNode = CollisionNode("ladder")
					cNode.addSolid(cSphere)
					cNodePath = self.ladder.attachNewNode(cNode)
					cNodePath = self.ladder2.attachNewNode(cNode)
					#cNodePath.show()
					k+=1
                                        self.array.append(self.ladder)
				
				#cSphere = CollisionSphere(Point3(1.5,0,h-40),.5)
				#cNodeB = CollisionNode("canWalk")
				#cNodeB.addSolid(cSphere)
				#cNodePath = self.ladder.attachNewNode(cNodeB)
				#cNodePath = self.ladder2.attachNewNode(cNodeB)
			for i in range(r):
				'''Right half of stage'''
				self.environment = loader.loadModel("models/gamedev/platform")
				self.environment.reparentTo(render)
				self.environment.setScale(5)
				self.environment.setPos(x1,0,h)
				self.environment2 = loader.loadModel("models/gamedev/platform")
				self.environment2.reparentTo(render)
				self.environment2.setScale(5)
				self.environment2.setPos(x1+286,0,h)
                                self.array.append(self.environment)
                                self.array.append(self.environment2)
				
				#if i == 0 and j > 0:
				#	cSphere = CollisionSphere(Point3((m/9.8)*1.9,0,0),.5)
				#	cNode = CollisionNode("platform")
				#	cNode.addSolid(cSphere)
				#	cNodePath = self.environment.attachNewNode(cNode)
				#	cNodePath = self.environment2.attachNewNode(cNode)
				#	cNodePath.show()
				
				if r == i+1:
					cSphere = CollisionSphere(Point3(2,0,0),2)
					if i == 9:
						cNode = CollisionNode("rwall")
					else:
						cNode = CollisionNode("redge")
					cNode.addSolid(cSphere)
					cNodePath = self.environment.attachNewNode(cNode)
					cNodePath = self.environment2.attachNewNode(cNode)
					#cNodePath.show()
				if a == i:
					self.actCount+=1
					self.actuator = Actor("models/gamedev/actuator")
					self.actuator.reparentTo(render)
					self.actuator.setPos(self.environment.getPos())
					if p == 1:
						self.actuator.setZ(self.actuator.getZ())
						self.actuator.setP(self.actuator.getP()+180)
					self.actuator.setScale(2)
					self.actuator.setH(self.actuator.getH()+180)
                                        self.array.append(self.actuator)
					bounds = self.actuator.getChild(0).getBounds()
					center = bounds.getCenter()
					radius = bounds.getRadius()-.5
					cSphere = CollisionSphere(center,radius)
					cNode = CollisionNode("actuator")
					cNode.addSolid(cSphere)
					cNodePath = self.actuator.attachNewNode(cNode)
					#cNodePath.show()
					
					self.actuator2 = Actor("models/gamedev/actuator")
					self.actuator2.reparentTo(render)
					self.actuator2.setPos(self.environment2.getPos())
					if p == 1:
						self.actuator2.setZ(self.actuator2.getZ())
						self.actuator2.setP(self.actuator2.getP()+180)
					self.actuator2.setScale(2)
					self.actuator2.setH(self.actuator2.getH()+180)
                                        self.array.append(self.actuator2)
					bounds = self.actuator2.getChild(0).getBounds()
					center = bounds.getCenter()
					radius = bounds.getRadius()-.5
					cSphere = CollisionSphere(center,radius)
					cNode = CollisionNode("actuator")
					cNode.addSolid(cSphere)
					cNodePath = self.actuator2.attachNewNode(cNode)
					#cNodePath.show()
				x1 = x1 + len

			for i in range(l):
				'''Left Half of stage'''
				self.environment = loader.loadModel("models/gamedev/platform")
				self.environment.reparentTo(render)
				self.environment.setScale(5)
				self.environment.setPos(x2,0,h)
                                self.array.append(self.environment)
				self.environment2 = loader.loadModel("models/gamedev/platform")
				self.environment2.reparentTo(render)
				self.environment2.setScale(5)
				self.environment2.setPos(x2+286,0,h)
                                self.array.append(self.environment2)

				if l == i+1:
					cSphere = CollisionSphere(Point3(-2,0,0),2)
					if i == 9:
						cNode = CollisionNode("lwall")
					else:
						cNode = CollisionNode("ledge")
					cNode.addSolid(cSphere)
					cNodePath = self.environment.attachNewNode(cNode)
					cNodePath = self.environment2.attachNewNode(cNode)
					#cNodePath.show()
				if a == -i:
					self.actCount+=1
					self.actuator = Actor("models/gamedev/actuator")
					self.actuator.reparentTo(render)
					self.actuator.setPos(self.environment.getPos())
					self.actuator.setScale(2)
                                        self.array.append(self.actuator)
					bounds = self.actuator.getChild(0).getBounds()
					center = bounds.getCenter()
					radius = bounds.getRadius()-.5
					cSphere = CollisionSphere(center,radius)
					cNode = CollisionNode("actuator")
					cNode.addSolid(cSphere)
					cNodePath = self.actuator.attachNewNode(cNode)
					#cNodePath.show()
					
					self.actuator = Actor("models/gamedev/actuator")
					self.actuator.reparentTo(render)
					self.actuator.setPos(self.environment2.getPos())
					self.actuator.setScale(2)
                                        self.array.append(self.actuator)
					bounds = self.actuator.getChild(0).getBounds()
					center = bounds.getCenter()
					radius = bounds.getRadius()-.5
					cSphere = CollisionSphere(center,radius)
					cNode = CollisionNode("actuator")
					cNode.addSolid(cSphere)
					cNodePath = self.actuator.attachNewNode(cNode)
					#cNodePath.show()
				x2 = x2 - len
			j+=1    
			h = h+40
			#x1 = 4.9
			#x2 = -4.9
			a = 0
		self.h = h+50
		x2b=x2o
		x1b=x1o
		
		print "end setupStage"

	def setupLighting(self):
		
		print "start setupLighting"
		
		ambientLight = AmbientLight('ambientLight')
		ambientLight.setColor(Vec4(0.55,0.55,0.55,1.0))
		ambientLightNP = render.attachNewNode(ambientLight)
		render.setLight(ambientLightNP)
		dirLight = DirectionalLight('dirLight')
		dirLight.setColor(Vec4(0.6,0.6,0.6,1))
		dirLightNP = render.attachNewNode(dirLight)
		dirLightNP.setHpr(Vec3(0.0,-26.0,0.0))
		render.setLight(dirLightNP)
		
		print "end setupLighting"
	
	def setupIntervals(self):
		
		print "start setupIntervals"
		
		self.charWalk1 = self.playerModel.actorInterval("walk")
		self.charWalk1.loop( )
		self.charWalk1.pause( )
		
		self.charWalk2 = self.playerModel2.actorInterval("walk2")
		self.charWalk2.loop( )
		self.charWalk2.pause( )
		
		self.jump1 = self.playerModel.actorInterval("jump")
		self.jump1.loop()
		self.jump1.pause()
		
		self.jump2 = self.playerModel2.actorInterval("jump2")
		self.jump2.loop()
		self.jump2.pause()
		
		self.climb1 = self.playerModel.actorInterval("climb")
		self.climb1.loop()
		self.climb1.pause()
		
		self.climb2 = self.playerModel2.actorInterval("climb2")
		self.climb2.loop()
		self.climb2.pause()
		
		print "end setupIntervals"
	
	# PLAYER ONE #

	def left(self):
		taskMgr.add(self.leftTask,'leftTask')
		self.charWalk1.loop()
		#end left
		
	def leftTask(self,task):
		if self.climbing1 == 0:
			self.playerModel.setH(270)
			self.playerModel.setPos(Vec3(self.playerModel.getX()-self.speed1, self.playerModel.getY(), self.playerModel.getZ()))
		return Task.cont

	def right(self):
		taskMgr.add(self.rightTask,'rightTask')
		self.charWalk1.loop()
		#end right
		
	def rightTask(self,task):
		if self.climbing1 == 0:
			self.playerModel.setH(90)
			self.playerModel.setPos(Vec3(self.playerModel.getX()+self.speed1, self.playerModel.getY(), self.playerModel.getZ()))
		return Task.cont	

	def climbable(self,cEntry):
		self.nodeCount1+=1
		print self.nodeCount1
		self.ignore("w")
		self.ignore("w-up")
		self.ignore("s")
		self.ignore("s-up")
		self.acceptOnce("w",self.climb,[1])
		self.accept("w-up",self.noClimb)
		self.acceptOnce("s",self.climb,[-1])
		self.accept("s-up",self.noClimb)

	def climb(self,dir):
		self.dir1 = dir
		self.climbing1 = 1
		self.climbSpeed1 = 1
		self.ignore("a")
		self.ignore("a-up")
		self.ignore("d")
		self.ignore("d-up")
		taskMgr.add(self.climbTask,'climbTask')
		self.climb1.loop()
		
	def noClimb(self):
		taskMgr.remove('climbTask')
		self.climb1.pause()
		if self.nodeCount1 == 0:
			self.climbing = 0
		self.climbSpeed1 = 0
		self.acceptOnce("w",self.climb,[1])
		self.acceptOnce("s",self.climb,[-1])
		
	def jumpable(self,cEntry):
		self.nodeCount1+=-1
		print self.nodeCount1
		if self.nodeCount1 == 0:
			taskMgr.remove('climbTask')
			self.ignore("w")
			self.ignore("w-up")
			self.ignore("s")
			self.ignore("s-up")
			self.acceptOnce("w",self.jump)
			self.acceptOnce("a",self.left)
			self.acceptOnce("d",self.right)
			self.accept("a-up",self.stopLeft)
			self.accept("d-up",self.stopRight)
			self.climbing1 = 0
			self.climbSpeed1 = 0
			self.climb1.pause()
			
	def walkable(self,cEntry):
		self.ignore("w")
		self.ignore("w-up")
		self.ignore("s")
		self.ignore("s-up")
		self.acceptOnce("w",self.climb,[1])
		self.accept("w-up",self.noClimb)
		self.acceptOnce("s",self.climb,[-1])
		self.accept("s-up",self.noClimb)
		self.acceptOnce("a",self.left)
		self.acceptOnce("d",self.right)
		self.accept("a-up",self.stopLeft)
		self.accept("d-up",self.stopRight)
		self.climbing1 = 0
		self.climbSpeed1 = 0
		self.climb1.pause()
			
	def climbTask(self,task):
		if self.playerModel.getZ() >=0:
			self.playerModel.setH(0)
			self.playerModel.setPos(Vec3(self.playerModel.getX(), self.playerModel.getY(), self.playerModel.getZ()+self.climbSpeed1*self.dir1))
		return Task.cont	
	
	def jump(self):
		if self.nodeCount1 == 0:
			self.ignore("w")
			self.ignore("w-up")
			z = self.playerModel.getZ()
			j = ProjectileInterval(self.playerModel, startPos = self.playerModel.getPos(), startVel = Point3(0,0,27), endZ = z)
			j.start()
			taskMgr.doMethodLater(3,self.jumpTask,"jumpTask")
		else:
			self.acceptOnce("w",self.climb,[1])
			
	def jumpTask(self, task):
		if self.climbing1 == 0:
			self.jump1.pause()
			self.acceptOnce("w",self.jump)
		#return task.cont

	def allowRight(self):
		self.acceptOnce("d",self.right)

	def noRight(self):
		taskMgr.remove('rightTask')
		self.charWalk1.pause()
		self.acceptOnce("d",self.right)

	def stopRight(self):
		self.noRight()
		#self.allowRight()
		
	def rightWall(self,cEntry):
		self.ignore("d")
		self.noRight()
		
	def rightEdge(self,cEntry):
		self.ignore("d")
		self.noRight()
				
	def rightOK(self,cEntry):
		self.allowRight()	
		
	def allowLeft(self):
		self.acceptOnce("a",self.left)

	def noLeft(self):
		taskMgr.remove('leftTask')
		self.charWalk1.pause()
		self.acceptOnce("a",self.left)

	def stopLeft(self):
		self.noLeft()
		#self.allowLeft()
		
	def leftWall(self,cEntry):
		self.ignore("a")
		self.noLeft()
		
	def leftEdge(self,cEntry):
		self.ignore("a")
		self.noLeft()
		
	def leftOK(self,cEntry):
		self.allowLeft()

	# PLAYERTWO #

	def left2(self):
		taskMgr.add(self.leftTask2,'leftTask2')
		self.charWalk2.loop()
		#end left
		
	def leftTask2(self,task):
		if self.climbing2 == 0:
			self.playerModel2.setH(0)
			self.playerModel2.setPos(Vec3(self.playerModel2.getX()-self.speed2, self.playerModel2.getY(), self.playerModel2.getZ()))
		return Task.cont

	def right2(self):
		taskMgr.add(self.rightTask2,'rightTask2')
		self.charWalk2.loop()
		#end right
		
	def rightTask2(self,task):
		if self.climbing2 == 0:
			self.playerModel2.setH(180)
			self.playerModel2.setPos(Vec3(self.playerModel2.getX()+self.speed2, self.playerModel2.getY(), self.playerModel2.getZ()))
		return Task.cont	

	def climbable2(self,cEntry):
		self.nodeCount2+=1
		#print self.nodeCount1
		self.ignore("o")
		self.ignore("o-up")
		self.ignore("l")
		self.ignore("l-up")
		self.acceptOnce("o",self.climbT2,[1])
		self.accept("o-up",self.noClimb2)
		self.acceptOnce("l",self.climbT2,[-1])
		self.accept("l-up",self.noClimb2)

	def climbT2(self,dir):
		self.dir2 = dir
		self.climbing2 = 1
		self.climbSpeed2 = 1
		self.ignore("k")
		self.ignore("k-up")
		self.ignore(";")
		self.ignore(";-up")
		taskMgr.add(self.climbTask2,'climbTask2')
		self.climb2.loop()
		
	def noClimb2(self):
		taskMgr.remove('climbTask2')
		self.climb2.pause()
		if self.nodeCount2 == 0:
			self.climbing2 = 0
		self.climbSpeed2 = 0
		self.acceptOnce("o",self.climbT2,[1])
		self.acceptOnce("l",self.climbT2,[-1])
		
	def jumpable2(self,cEntry):
		self.nodeCount2+=-1
		#print self.nodeCount2
		if self.nodeCount2 == 0:
			taskMgr.remove('climbTask2')
			self.ignore("o")
			self.ignore("o-up")
			self.ignore("l")
			self.ignore("l-up")
			self.acceptOnce("o",self.jumpT2)
			self.acceptOnce("k",self.left2)
			self.acceptOnce(";",self.right2)
			self.accept("k-up",self.stopLeft2)
			self.accept(";-up",self.stopRight2)
			self.climbing2 = 0
			self.climbSpeed2 = 0
			self.climb2.pause()
			
	def walkable2(self,cEntry):
		self.ignore("o")
		self.ignore("o-up")
		self.ignore("l")
		self.ignore("l-up")
		self.acceptOnce("o",self.climbT2,[1])
		self.accept("o-up",self.noClimb2)
		self.acceptOnce("l",self.climbT2,[-1])
		self.accept("l-up",self.noClimb2)
		self.acceptOnce("k",self.left2)
		self.acceptOnce(";",self.right2)
		self.accept("k-up",self.stopLeft)
		self.accept(";-up",self.stopRight)
		self.climbing2 = 0
		self.climbSpeed2 = 0
		self.climb2.pause()
			
	def climbTask2(self,task):
		if self.playerModel2.getZ() >=0:
			self.playerModel2.setH(90)
			self.playerModel2.setPos(Vec3(self.playerModel2.getX(), self.playerModel2.getY(), self.playerModel2.getZ()+self.climbSpeed2*self.dir2))
		return Task.cont	
	
	def jumpT2(self):
		if self.nodeCount2 == 0:
			self.ignore("o")
			self.ignore("o-up")
			z = self.playerModel2.getZ()
			j = ProjectileInterval(self.playerModel2, startPos = self.playerModel2.getPos(), startVel = Point3(0,0,27), endZ = z)
			j.start()
			taskMgr.doMethodLater(3,self.jumpTask2,"jumpTask2")
		else:
			self.acceptOnce("w",self.climb,[1])
			
	def jumpTask2(self, task):
		if self.climbing2 == 0:
			self.jump2.pause()
			self.acceptOnce("o",self.jumpT2)
		#return task.cont

	def allowRight2(self):
		self.acceptOnce(";",self.right2)

	def noRight2(self):
		taskMgr.remove('rightTask2')
		self.charWalk2.pause()
		self.acceptOnce(";",self.right2)

	def stopRight2(self):
		self.noRight2()
		#self.allowRight()
		
	def rightWall2(self,cEntry):
		self.ignore(";")
		self.noRight2()
		
	def rightEdge2(self,cEntry):
		self.ignore(";")
		self.noRight2()
				
	def rightOK2(self,cEntry):
		self.allowRight2()	
		
	def allowLeft2(self):
		self.acceptOnce("k",self.left2)

	def noLeft2(self):
		taskMgr.remove('leftTask2')
		self.charWalk2.pause()
		self.acceptOnce("k",self.left2)

	def stopLeft2(self):
		self.noLeft2()
		#self.allowLeft()
		
	def leftWall2(self,cEntry):
		self.ignore("k")
		self.noLeft2()
		
	def leftEdge2(self,cEntry):
		self.ignore("k")
		self.noLeft2()
		
	def leftOK2(self,cEntry):
		self.allowLeft2()

	def cameraFollowTask(self,task):
		base.camList[1].setPos(Vec3(self.playerModel.getX(),-200,self.playerModel.getZ()+30))
		base.camList[2].setPos(Vec3(self.playerModel2.getX(),-200,self.playerModel2.getZ()+30))
		return task.cont
	
	def activate(self,cEntry):
		i = cEntry.getIntoNodePath().getParent()
		where = i.getPos()
		which = i.getHpr()
		i.detachNode() 
		i = Actor("models/gamedev/actuatorOn")
		i.setName("actuatorOn")
		i.setPosHpr(where,which)
		i.setScale(2)
                i.reparentTo(render)
                self.array.append(i)
                
                if i.getX() < 144:
                        self.player1Score += 3
                else:
                        self.player2Score += 3

	def stun(self,cEntry):
		ow = Sequence(Func(self.startStun), Wait(3), Func(self.stopStun))
		ow.start()
	
	def startStun(self):
		self.speed1 = 0
		self.climbspeed1 = 0
		self.ignore("w")
		self.ignore("w-up")
		self.ignore("a")
		self.ignore("d")
		self.ignore("a-up")
		self.ignore("d-up")
		taskMgr.remove('leftTask')
		taskMgr.remove('rightTask')
		taskMgr.remove('climbTask')
		taskMgr.remove('jumpTask')
		self.playerModel.stop()
		#self.ignore("player1-ladder")
	
	def stopStun(self):
		self.speed1 = 3
		self.climbspeed1 = 1
		self.acceptOnce("a",self.left)
		self.acceptOnce("d",self.right)
		self.accept("a-up",self.stopLeft)
		self.accept("d-up",self.stopRight)
		self.acceptOnce("w",self.jump)
		#self.accept("player1-ladder", self.climbable)
	
	def stun2(self,cEntry):
		ow = Sequence(Func(self.startStun2), Wait(3), Func(self.stopStun2))
		ow.start()
	
	def startStun2(self):
		self.speed2 = 0
		self.climbspeed2 = 0
		self.ignore("k")
		self.ignore(";")
		self.ignore("k-up")
		self.ignore(";-up")
		self.ignore("o")
		self.ignore("o-up")
		taskMgr.remove('leftTask2')
		taskMgr.remove('rightTask2')
		taskMgr.remove('climbTask2')
		taskMgr.remove('jumpTask2')
		self.playerModel2.stop()
		#self.ignore("player2-ladder")
	
	def stopStun2(self):
		self.speed2 = 3
		self.climbspeed2 = 1
		self.acceptOnce("k",self.left2)
		self.acceptOnce(";",self.right2)
		self.accept("k-up",self.stopLeft2)
		self.accept(";-up",self.stopRight2)
		self.acceptOnce("o",self.jumpT2)
		#self.accept("player2-ladder", self.climbable2)

	def setupCollisions(self):
		
		print "start setupCollisions"
		
		self.cHandler = CollisionHandlerEvent()
		self.cHandler = CollisionHandlerEvent()
		self.cHandler.setInPattern("%fn-%in")
		self.cHandler.setAgainPattern("%fn-is-on-%in")        
		self.cHandler.setOutPattern("%fn-left-%in")
		self.cTrav = CollisionTraverser()
		base.cTrav = self.cTrav

		#Player 1 collision solid
		bounds = self.playerModel.getChild(0).getBounds()
		center = bounds.getCenter()-Vec3(0,0,12.5)
		radius = bounds.getRadius()-21
		cSphere = CollisionSphere(center,radius)
		cNode = CollisionNode("player1")
		cNode.addSolid(cSphere)
		
		centerB = bounds.getCenter()-Vec3(0,0,-11)
		radiusB = bounds.getRadius()-21
		cSphereB = CollisionSphere(centerB,radiusB)
		cNode.addSolid(cSphereB)
		cNodePath = self.playerModel.attachNewNode(cNode)
		#cNodePath.show()
		
		#centerBB = bounds.getCenter()-Vec3(0,0,25)
		#radiusBB = bounds.getRadius()-28
		#cSphereBB = CollisionSphere(centerB,radiusB)
		#cNodeT = CollisionNode("player1B")
		#cNodeT.addSolid(cSphereBB)
		#cNodePath = self.playerModel.attachNewNode(cNodeT)
		#cNodePath.show()

		#Player 2 collision solid
		bounds2 = self.playerModel2.getChild(0).getBounds()
		center2 = bounds2.getCenter()-Vec3(0,0,12.5)
		radius2 = bounds2.getRadius()-21
		cSphere2 = CollisionSphere(center2,radius2)
		cNode2 = CollisionNode("player2")
		cNode2.addSolid(cSphere2)
		
		bounds2B = self.playerModel2.getChild(0).getBounds()
		center2B = bounds2B.getCenter()-Vec3(0,0,-11)
		radius2B = bounds2B.getRadius()-21
		cSphere2B = CollisionSphere(center2B,radius2B)
		cNode2.addSolid(cSphere2B)
		cNodePath2 = self.playerModel2.attachNewNode(cNode2)
		#cNodePath2.show()

		self.cTrav.addCollider(cNodePath,self.cHandler)
		self.cTrav.addCollider(cNodePath2,self.cHandler)
		self.cTrav.addCollider(cNodePath,self.cHandler)
		self.cTrav.addCollider(cNodePath2,self.cHandler)

		self.accept("player1-ladder", self.climbable)
		self.accept("player1-left-ladder", self.jumpable)
		#self.accept("player1b-canWalk", self.walkable)
		self.accept("player2-ladder", self.climbable2)
		self.accept("player2-left-ladder", self.jumpable2)
		#self.accept("player1-platform", self.climbable)
		#self.accept("player1-left-platform",self.
		#self.accept("player1-left-ladder-down", self.noDrop)
		#self.accept("player2-ladder-down", self.drop2)
		#self.accept("player2-left-ladder-down", self.noDrop2)
		self.accept("player1-actuator", self.activate)
		self.accept("player2-actuator", self.activate)
		self.accept("player1-boulder", self.stun)
		self.accept("player2-boulder", self.stun2)
		self.accept("boulder-player1", self.stun)
		self.accept("boulder-player2", self.stun2)
		self.accept("player1-is-on-ledge", self.leftEdge)
		self.accept("player2-is-on-ledge", self.leftEdge2)
		self.accept("player1-is-on-redge", self.rightEdge)
		self.accept("player2-is-on-redge", self.rightEdge2)
		self.accept("player1-is-on-lwall", self.leftWall)
		self.accept("player2-is-on-lwall", self.leftWall2)
		self.accept("player1-is-on-rwall", self.rightWall)
		self.accept("player2-is-on-rwall", self.rightWall2)
		
		self.accept("player1-left-ledge", self.leftOK)
		self.accept("player2-left-ledge", self.leftOK2)
		self.accept("player1-left-redge", self.rightOK)
		self.accept("player2-left-redge", self.rightOK2)
		self.accept("player1-left-lwall", self.leftOK)
		self.accept("player2-left-lwall", self.leftOK2)
		self.accept("player1-left-rwall", self.rightOK)
		self.accept("player2-left-rwall", self.rightOK2)
		
		print "end setupCollisions"
	
	def boulderTask(self,task):
		drop1 = ProjectileInterval(self.boulder1, startPos = Point3(46+random.randint(-9,9)*9.8,0,self.h), startVel = Point3(0,0,0), endZ = -50)
	
		drop2 = ProjectileInterval(self.boulder2, startPos = Point3(253+random.randint(-9,9)*9.8,0,self.h),startVel = Point3(0,0,0), endZ = -50)
	
		dropBoth = Parallel(drop1,drop2)
		if self.boulder1.getZ() <= -50.0:
			drop1.start()
		if self.boulder2.getZ() <= -50.0:
			drop2.start()
	
		return task.cont
	
	def clockTask(self,task):
		self.timer.detachNode()
		self.timer = OnscreenText("%d" % (self.gameLen-globalClock.getRealTime(),), pos = (98,145), scale = 18.0)
		self.timer.setColor(1,1,1)
		self.timer.reparentTo(render)
		
		return Task.cont

	def endGame(self,task):
		taskMgr.removeTasksMatching('cameraFollowTask')
		taskMgr.removeTasksMatching('boulderTask')
		taskMgr.removeTasksMatching('clockTask')
			
		#base.camList[3].removeNode()
		#base.camList[2].removeNode()
		#base.camList[1].removeNode()
		
		base.makeCamera(base.win, displayRegion = (0, 1, 0, 1))
		
		self.music.stop()
	
                #self.destroy()

		self.music3  = loader.loadMusic("models/gamedev/CSTAR.mp3")
		self.music3.play()
	
	def getScores(self):
		return (self.player1Score, self.player2Score)
		
	def getGameLen(self):
		return self.gameLen
	
	def stopMusic(self):
		self.music3.stop()
	
	def destroy(self):	
		self.playerModel.detachNode()
		self.playerModel2.detachNode()
		self.divider.detachNode()
		self.background.destroy()
		self.timer.destroy()
                while len(self.array) > 0:
                        print len(self.array)
                        self.array[0].remove()
                        del self.array[0]
		
#world = World()
#run()
Esempio n. 11
0
class StabilityExperiment(ViewTowers):
    def __init__(self, *args, **kwargs):
        ViewTowers.__init__(self, *args, **kwargs)

        # ignore keys set by viewer
        for key in self.getAllAccepting():
            if key in ("s", "escape"):
                continue
            self.ignore(key)
        self.permanent_events = self.getAllAccepting()

        # global variables
        self.text_bg = (1, 1, 1, 0.7)
        self.font = self.loader.loadFont('cmr12.egg')
        self.question = [
            "Will this tower fall?",
            [[1, "definitely will not fall"], [2, "probably will not fall"],
             [3, "might not fall"], [4, "don't know"], [5, "might fall"],
             [6, "probably will fall"], [7, "definitely will fall"]]
        ]
        self.question_keys = ["1", "2", "3", "4", "5", "6", "7"]
        self.choice_text_start = 0.65
        self.feedback_time = 3.0
        self.buffer_time = 0.75

        # create text
        self.create_all_text()

    def run(self):
        # Show the start screen
        self.toggle_task("show_start_screen")
        # Call parent's run().
        ShowBase.run(self)

    def create_all_text(self):
        self.continue_text = OnscreenText(
            **{
                "text":
                ("In a moment, you will be asked the question displayed on "
                 "the left.  When you are ready, press the spacebar to begin."
                 ),
                "style":
                1,
                "fg": (.75, 0, 0, 1),
                "bg":
                self.text_bg,
                "pos": (.4, .4),
                "align":
                TextNode.ACenter,
                "scale":
                .08,
                "font":
                self.font,
                "wordwrap":
                20
            })
        self.text_parent = self.continue_text.getParent()
        self.continue_text.detachNode()

        xpos = -1.25
        skip = .15
        self.question_text = OnscreenText(
            **{
                "text": self.question[0],
                "style": 1,
                "fg": (0, 0, .8, 1),
                "bg": self.text_bg,
                "pos": ((xpos + .05), .8),
                "align": TextNode.ALeft,
                "scale": .075,
                "font": self.font,
                "wordwrap": 35
            })

        self.question_choice_text = []
        for i in xrange(len(self.question[1])):
            n = len(self.question[1]) - i - 1
            ypos = self.choice_text_start - (skip * n)

            t1 = OnscreenText(
                **{
                    "text": "%s" % self.question[1][i][0],
                    "style": 1,
                    "fg": (0, .1, 0, 1),
                    "bg": self.text_bg,
                    "pos": ((xpos + .1), ypos),
                    "align": TextNode.ALeft,
                    "scale": .075,
                    "font": self.font
                })

            t2 = OnscreenText(
                **{
                    "text": "%s" % self.question[1][i][1],
                    "style": 1,
                    "fg": (0, .1, 0, 1),
                    "bg": self.text_bg,
                    "pos": ((xpos + 0.17), ypos),
                    "align": TextNode.ALeft,
                    "scale": .05,
                    "font": self.font
                })

            t = NodePath("choice_%s" % i)
            t.reparentTo(self.text_parent)
            t1.reparentTo(t)
            t2.reparentTo(t)
            self.question_choice_text.append(t)

        for t in self.question_choice_text:
            t.detachNode()

        self.trials_remaining_text = OnscreenText(
            **{
                "text": "",
                "style": 1,
                "fg": (0, 0, 0, 1),
                "bg": self.text_bg,
                "pos": (-xpos, -.95),
                "align": TextNode.ARight,
                "scale": .05,
                "font": self.font
            })

    def show_start_screen(self, task):
        self.continue_text.reparentTo(self.text_parent)
        for t in self.question_choice_text:
            t.reparentTo(self.text_parent)
        self.accept("space", self.toggle_task, ["show_trial"])

    def show_trial(self, task):
        if self.sso is None:
            self.goto_sso(0)
        elif self.ssos.index(self.sso) == (self.n_ssos - 1):
            self.exit()
        else:
            self.next()

        n = self.n_ssos - self.ssos.index(self.sso)
        self.trials_remaining_text.setText("Trials remaining: %d" % n)

        self.continue_text.detachNode()
        for t in self.question_choice_text:
            t.detachNode()

        self.camera_rot.setH(np.random.randint(0, 360))
        self.cam_spin = 270

        self.taskMgr.doMethodLater(self.buffer_time, self.rotate, "rotate")

    def rotate(self, task):
        """ Task: rotate camera."""
        H = (self.camera_rot.getH() + 1) % 360
        self.camera_rot.setH(H)
        self.cam_spin -= 1
        if self.cam_spin == 0:
            self.toggle_task("show_question")
            return task.done
        else:
            return task.cont

    def show_question(self, task):
        for t in self.question_choice_text:
            t.reparentTo(self.text_parent)
        for key in self.question_keys:
            self.accept(key, self.record_response, [key])

    def record_response(self, key):
        for k in self.question_keys:
            self.ignore(k)
        for i, t in enumerate(self.question_choice_text):
            if i != (int(key) - 1):
                t.detachNode()
        self.toggle_task("physics")

    def physics(self, task):
        """ Task: simulate physics."""
        # Elapsed time.
        dt = self._get_elapsed() - self.old_elapsed
        # Update amount of time simulated so far.
        self.old_elapsed += dt
        # Step the physics dt time.
        size_sub = self.bbase.sim_par["size_sub"]
        n_subs = int(dt / size_sub)
        self.bbase.step(dt, n_subs, size_sub)

        if self.old_elapsed >= self.feedback_time:
            self.toggle_task("show_trial")
            return task.done
        else:
            return task.cont
Esempio n. 12
0
class DebugOptions(DirectObject):
    def __init__(self, parent):
        self.parent = parent
        self.textPlayerPos = OnscreenText(text='',
                                          parent=base.a2dTopLeft,
                                          pos=(0, -0.1),
                                          scale=0.04,
                                          fg=(1, 1, 1, 1),
                                          align=TextNode.ALeft)

        self.showFps = True
        base.setFrameRateMeter(True)

        self.ambientLight = True
        self.parent.alight.setColor(VBase4(0.43, 0.43, 0.43, 1.0))

        self.flashlightFrustum = False

        self.autoShader = True
        render.setShaderAuto()

        self.playerPos = True
        taskMgr.add(self.refreshPlayerPos, 'RefreshPlayerPosTask')
        self.textPlayerPos.reparentTo(base.a2dTopLeft)

        self.bloom = False
        self.blur = False
        self.ao = False

        self.walls = True

        #spotlightpanel
        self.spot_light_panel = SpotlightPanel(self, self.parent.player.slight)

        base.accept('f1', self.toggleFps)
        base.accept('f2', self.toggleAmbientLight)
        base.accept('f3', self.toggleFlashlightFrustum)
        base.accept('f4', self.parent.player.getDamage)
        base.accept('f5', self.toggleAutoShader)
        base.accept('f6', self.togglePlayerPos)
        base.accept('f7', self.toggleBloom)
        base.accept('f8', self.toggleBlur)
        base.accept('f9', self.toggleAO)
        base.accept('f10', self.toggleWalls)
        base.accept('f11', render.analyze)
        base.accept('f12', self.debugPrint)

    def toggleFps(self):
        if self.showFps == False:
            self.showFps = True
            base.setFrameRateMeter(True)
        else:
            self.showFps = False
            base.setFrameRateMeter(False)

    def toggleAmbientLight(self):
        if self.ambientLight == False:
            self.ambientLight = True
            self.parent.alight.setColor(VBase4(0.43, 0.43, 0.43, 1.0))
        else:
            self.ambientLight = False
            self.parent.alight.setColor(VBase4(0.03, 0.03, 0.03, 1.0))

    def toggleFlashlightFrustum(self):
        if self.flashlightFrustum == False:
            self.flashlightFrustum = True
            self.parent.slight.showFrustum()
        else:
            self.flashlightFrustum = False
            self.parent.slight.hideFrustum()

    def toggleAutoShader(self):
        if self.autoShader == False:
            self.autoShader = True
            render.setShaderAuto()
        else:
            self.autoShader = False
            render.setShaderOff()

    def toggleWalls(self):
        if self.walls == False:
            self.walls = True
            self.parent.level.wall_node.reparentTo(self.parent.level.node)
        else:
            self.walls = False
            self.parent.level.wall_node.detachNode()

    def togglePlayerPos(self):
        if self.playerPos == False:
            self.playerPos = True
            taskMgr.add(self.refreshPlayerPos, 'RefreshPlayerPosTask')
            self.textPlayerPos.reparentTo(base.a2dTopLeft)
        else:
            self.playerPos = False
            taskMgr.remove('RefreshPlayerPosTask')
            self.textPlayerPos.detachNode()

    def toggleBloom(self):
        if self.bloom == False:
            self.bloom = True
            self.parent.filters.setBloom()
        else:
            self.bloom = False
            self.parent.filters.delBloom()

    def toggleBlur(self):
        if self.blur == False:
            self.blur = True
            self.parent.filters.setBlurSharpen()
        else:
            self.blur = False
            self.parent.filters.delBlurSharpen()

    def toggleAO(self):
        if self.ao == False:
            self.ao = True
            self.parent.filters.setAmbientOcclusion()
        else:
            self.ao = False
            self.parent.filters.delAmbientOcclusion()

    def refreshPlayerPos(self, task):
        px, py, pz = self.parent.player.node.getPos()
        self.textPlayerPos.setText('Player pos: (%0.3f, %0.3f, %0.3f)' %
                                   (px, py, pz))
        return task.cont

    def debugPrint(self):
        print taskMgr