def test_collision_handler_event_pickle():
    from panda3d.core import CollisionHandlerEvent

    handler = CollisionHandlerEvent()
    handler.add_in_pattern("abcdefg")
    handler.add_in_pattern("test")
    handler.add_again_pattern("again pattern")
    handler.add_again_pattern("another again pattern")
    handler.add_out_pattern("out pattern")

    handler = loads(dumps(handler, -1))

    assert tuple(handler.in_patterns) == ("abcdefg", "test")
    assert tuple(handler.again_patterns) == ("again pattern",
                                             "another again pattern")
    assert tuple(handler.out_patterns) == ("out pattern", )
예제 #2
0
class NeoITPyApp(ShowBase):
    """The NeoITPy app."""
    def __init__(self):
        """Setup this app."""
        ShowBase.__init__(self)

        #Setup window
        wnd_props = WindowProperties()
        wnd_props.set_title("Neo Impressive Title")
        #wnd_props.set_origin(0, 0)
        wnd_props.set_size(1024, 768)
        self.win.request_properties(wnd_props)

        self.set_background_color(0, .5, 1, 1)

        #Init GUI sub-system
        self.gui = GUI(self)
        self.gui.run()

        #Init app state
        self.state = APP_STATE_LOGO
        self.logo_delay = 600

        #Start title music
        self.title_music = loader.loadMusic("./data/sounds/title.ogg")
        self.title_music.set_loop(True)
        self.title_music.play()

        #Setup collision detection
        self.cTrav = CollisionTraverser()

        self.portal_handler = CollisionHandlerEvent()
        self.portal_handler.add_in_pattern("%fn-entered-%in")

        #Init other sub-systems
        self.cam_mgr = CameraManager()
        self.world_mgr = WorldManager()

        #Setup lighting
        self.ambient = AmbientLight("Ambient Light")
        self.ambient.set_color(Vec4(.5, .5, .5, 1))
        self.ambient_np = self.render.attach_new_node(self.ambient)
        self.render.set_light(self.ambient_np)

        self.sun = DirectionalLight("Sun")
        self.sun_np = self.render.attach_new_node(self.sun)
        self.sun_np.set_p(-135)
        self.render.set_light(self.sun_np)

        #Setup auto-shaders
        self.render.set_shader_auto()

        #Debug stats
        #self.messenger.toggle_verbose()
        PStatClient.connect()

    def new_game(self):
        """Start a new game."""
        self.gui.switch_to_screen("CampaignSelectScreen", 
            SlideTransition(direction = "left"))
        self.state = APP_STATE_CAMPAIGN_SELECT

    def multiplayer(self):
        """Start multiplayer mode."""
        self.gui.switch_to_screen("LoginScreen",
            SlideTransition(direction = "left"))
        self.state = APP_STATE_LOGIN

    def quit(self):
        """Close the app."""
        self.user_exit()

    def start_campaign(self, name):
        """Start the given campaign."""
        print("Starting campaign '{}'...".format(name))
        self.gui.show_multiplayer_hud(False)
        self.gui.show_target_info(False)
        self.gui.switch_to_screen("HUD", FadeTransition())
        self.cam_mgr.change_mode(CAM_MODE_FREE)
        self.world_mgr.load_map("./data/maps/Waterfall Cave")

    def leave_campaign_select(self):
        """Leave the campaign select screen and return to the title screen."""
        self.gui.switch_to_screen("TitleScreen", 
            SlideTransition(direction = "right"))
        self.state = APP_STATE_TITLE

    def login(self):
        """Begin login process."""
        print("Logging in...")

    def new_account(self):
        """Enter the account creation screen."""
        self.gui.switch_to_screen("NewAccountScreen",
            SlideTransition(direction = "left"))
        self.state = APP_STATE_NEW_ACCOUNT

    def change_password(self):
        """Enter the password change screen."""
        self.gui.switch_to_screen("ChangePasswordScreen",
            SlideTransition(direction = "left"))
        self.state = APP_STATE_CHANGE_PASSWORD

    def leave_login_screen(self):
        """Leave the login screen and return to the title screen."""
        self.gui.switch_to_screen("TitleScreen",
            SlideTransition(direction = "right"))
        self.state = APP_STATE_TITLE

    def create_new_account(self):
        """Create a new account."""
        print("Creating new account...")

    def leave_new_account_screen(self):
        """Leave the new account screen and return to the login screen."""
        self.gui.switch_to_screen("LoginScreen",
            SlideTransition(direction = "right"))
        self.state = APP_STATE_LOGIN

    def do_password_change(self):
        """Change the user's current password."""
        print("Changing password...")

    def leave_change_password_screen(self):
        """Leave the change password screen and return to the login screen."""
        self.gui.switch_to_screen("LoginScreen",
            SlideTransition(direction = "right"))
        self.state = APP_STATE_LOGIN

    def run_logic(self, task):
        """Run the game logic for each frame."""
        #Update logo screen
        if self.state == APP_STATE_LOGO:
            #Is the logo delay over?
            if self.logo_delay == 0:
                self.gui.switch_to_screen("TitleScreen", FadeTransition())
                self.gui.start_title_anim()
                self.state = APP_STATE_TITLE

            #If not, update the delay timer
            else:
                self.logo_delay -= 1

        #Update title screen
        elif self.state == APP_STATE_TITLE:
            pass

        #Update campaign select screen
        elif self.state == APP_STATE_CAMPAIGN_SELECT:
            pass

        #Update login screen
        elif self.state == APP_STATE_LOGIN:
            pass

        #Update campaign mode screen
        elif self.state == APP_STATE_CAMPAIGN:
            pass

        #Update new account screen
        elif self.state == APP_STATE_NEW_ACCOUNT:
            pass

        #Update change password screen
        elif self.state == APP_STATE_CHANGE_PASSWORD:
            pass

        #This task continues infinitely
        return Task.cont

    user_exit = ShowBase.userExit
예제 #3
0
class Player():
    def __init__(self, world):
        self.world = world
        self.root = self.world.root.attach_new_node("player")
        self.root_target = self.world.root.attach_new_node("player_target")
        self.pivot = self.root.attach_new_node("player_pivot")
        base.camera.reparent_to(self.pivot)
        base.camera.set_z(1.7)
        base.cam.node().get_lens().set_fov(90)
        self.traverser = CollisionTraverser()
        self.ray = setup_ray(
            self.pivot,
            self.traverser,
            self.world.mask,
            # ray ends well below feet to register downward slopes
            (0, 0, 1),
            (0, 0, -1))
        self.xyh_inertia = Vec3(0, 0, 0)
        h_acc = ConfigVariableDouble('mouse-accelleration', 0.1).get_value()
        self.xyh_acceleration = Vec3(0.8, 0.8, h_acc)
        self.friction = 0.15
        self.torque = 0.5
        self.last_up = Vec3(0, 0, 1)

        # Collider for portals
        csphere = CollisionSphere(0, 0, 1.25, 1.5)
        cnode = CollisionNode('player')
        cnode.add_solid(csphere)
        cnode.set_from_collide_mask(0x2)
        cnode.set_into_collide_mask(CollideMask.all_off())
        self.collider = self.root.attach_new_node(cnode)
        self.event_handler = CollisionHandlerEvent()
        self.event_handler.add_in_pattern('into-%in')
        self.traverser.add_collider(self.collider, self.event_handler)
        self.collider.show()
        self.teleported = False

        base.input.set_mouse_relativity(True)

    def handle_input(self):
        dt = globalClock.get_dt()
        directional_keys = (["strafe_right",
                             "strafe_left"], ["forward", "backward"])
        for k, keys in enumerate(directional_keys):
            if base.input.buttons[keys[0]]:
                self.xyh_inertia[k] += self.xyh_acceleration[k] * dt
            elif base.input.buttons[keys[1]]:
                self.xyh_inertia[k] -= self.xyh_acceleration[k] * dt
            self.xyh_inertia[k] /= 1 + self.friction

        if base.mouseWatcherNode.hasMouse():
            h = base.input.mouse_movement.x * self.xyh_acceleration[2] * dt
            self.pivot.set_h(self.pivot, h)
            p = base.input.mouse_movement.y * self.xyh_acceleration[2] * dt
            base.cam.set_p(base.cam, p)
            base.cam.set_p(max(-70, min(base.cam.get_p(), 70)))
            #base.cam.set_r(0)

    def ray_to_destination(self, xonly=0):
        if xonly:
            self.ray["node"].set_x(self.pivot, self.xyh_inertia[1] * xonly)
            self.ray["node"].set_y(self.pivot, 0)
        else:
            self.ray["node"].set_x(self.pivot, self.xyh_inertia[0])
            self.ray["node"].set_y(self.pivot, self.xyh_inertia[1])

    def move_to_ray(self):
        self.ray["handler"].sort_entries()
        #closest_entry = list(self.ray["handler"].entries)[0]
        closest_entry = None
        delta = float('inf')
        dot = -1.0
        for c in list(self.ray["handler"].entries):
            if closest_entry is None:
                closest_entry = c
                delta = c.get_surface_point(self.root).length()
                dot = self.last_up.dot(c.get_surface_normal(render))
                continue
            if c.get_surface_point(self.root).length() < delta:
                if self.last_up.dot(c.get_surface_normal(render)) > dot:
                    closest_entry = c
                    dot = self.last_up.dot(c.get_surface_normal(render))
                    delta = c.get_surface_point(self.root).length()

        collision_point = closest_entry.get_surface_point(render)
        collision_normal = closest_entry.get_surface_normal(render)
        self.last_up = collision_normal
        # take heed of the ray ending well below feet
        #collision_point.set_z(max(0,collision_point.z))
        self.root.set_pos(render, collision_point)
        self.root_target.set_pos(render, collision_point)
        self.root_target.heads_up(render, collision_point, collision_normal)

    def update(self):
        if self.teleported:
            self.xyh_inertia = Vec3(0, self.xyh_acceleration[1], 0)
            self.teleported = False
        dt = globalClock.get_dt()
        self.handle_input()
        if self.xyh_inertia.length() > 0:
            self.ray_to_destination()
            self.traverser.traverse(render)
            if self.ray["handler"].get_num_entries() > 0:
                self.move_to_ray()
            else:
                self.ray_to_destination(-1)
                self.traverser.traverse(render)
                if self.ray["handler"].get_num_entries() > 0:
                    self.move_to_ray()
                else:
                    self.ray_to_destination(1)
                    self.traverser.traverse(render)
                    if self.ray["handler"].get_num_entries() > 0:
                        self.move_to_ray()
            self.ray["node"].set_y(self.pivot, 0)
        current_quat = self.root.get_quat()
        target_quat = self.root_target.get_quat()
        current_quat.normalize()
        target_quat.normalize()
        if current_quat.is_same_direction(target_quat):
            self.root.set_quat(target_quat)
            return
        self.root.set_quat(current_quat + (target_quat - current_quat) *
                           (ROTATION_SPEED * dt))