Example #1
0
    def __init__(self, points, jump_through=False, waypoints=None, speed=1):
        self.waypoints = waypoints
        self.speed = speed
        self.target_index = 0
        is_moving = bool(self.waypoints)

        # Create the body type
        if is_moving:
            self.body = pymunk.Body(pymunk.inf, pymunk.inf)
        else:
            self.body = SPACE.static_body

        for i in range(len(points)-1):
            # Make and configure the physics object
            seg = pymunk.Segment(self.body, points[i], points[i+1], 5)
            seg.friction = 1
            seg.group = 1
            if jump_through:
                seg.collision_type = JUMP_THROUGH_COLLISION_TYPE
                seg.color = (255, 255, 0, 255)
            if is_moving:
                seg.color = THECOLORS["blue"]
                seg.body.position = Vec2d(self.waypoints[0])
            # Add it to the world
            SPACE.add(seg)
Example #2
0
    def __init__(self, points, jump_through=False, waypoints=None, speed=1):
        self.waypoints = waypoints
        self.speed = speed
        self.target_index = 0
        is_moving = bool(self.waypoints)

        # Create the body type
        if is_moving:
            self.body = pymunk.Body(pymunk.inf, pymunk.inf)
        else:
            self.body = SPACE.static_body

        for i in range(len(points) - 1):
            # Make and configure the physics object
            seg = pymunk.Segment(self.body, points[i], points[i + 1], 5)
            seg.friction = 1
            seg.group = 1
            if jump_through:
                seg.collision_type = JUMP_THROUGH_COLLISION_TYPE
                seg.color = (255, 255, 0, 255)
            if is_moving:
                seg.color = THECOLORS["blue"]
                seg.body.position = Vec2d(self.waypoints[0])
            # Add it to the world
            SPACE.add(seg)
Example #3
0
def main():
    fps = 60
    dt = 1. / fps

    # Initialize the game
    pygame.mixer.pre_init(frequency=44100, size=-16, channels=1, buffer=512)
    pygame.init()
    screen = pygame.display.set_mode((int(SCREEN_SIZE.x), int(SCREEN_SIZE.y)))
    clock = pygame.time.Clock()
    font = pygame.font.SysFont("Arial", 16)

    # Music!
    pygame.mixer.music.load("res/music/fight.mp3")
    pygame.mixer.music.play(-1)  # loop forever

    # Load the world
    world = TileWorld('levels/level.tmx')
    player1 = Player("Player1", "res/images/cat_gun.png",
                     up=KEYS.K_UP, left=KEYS.K_LEFT,
                     right=KEYS.K_RIGHT, down=KEYS.K_DOWN, shoot=KEYS.K_SPACE)
    player2 = Player("Player2", "res/images/cat_gun.png",
                     up=KEYS.K_w, left=KEYS.K_a,
                     right=KEYS.K_d, down=KEYS.K_s, shoot=KEYS.K_e)


    
    players = [player1, player2]

    # track how long each key has been pressed
    pressed_keys = {}

    # Start the game loop
    running = True
    while running:
        # Input management
        pressed_keys = calculate_input(pressed_keys)

        # Update world
        SPACE.step(dt)
        world.update(dt, players)
        for player in players:
            player.update(pressed_keys)

        # Draw stuff
        screen.fill((54, 54, 54, 255))  # Dark gray color
        world.draw(screen)
        for player in players:
            player.draw(screen, world.camera)
        #import pymunk
        #pymunk.pygame_util.draw(screen, SPACE)  # TODO: camera support
        screen.blit(font.render("{} FPS".format(clock.get_fps()), 1,
                                THECOLORS["white"]), (0, 0))

        # Apply the drawing to the screen
        pygame.display.flip()

        # Wait for next frame
        clock.tick(fps)
Example #4
0
    def __init__(self, owner, gravity=False):
        self.radius = 3
        self.speed = 500
        self.ttl = 40
        self.cooldown = 10

        self.shot_sound = pygame.mixer.Sound("res/sfx/C_28P.ogg")
        self.shot_sound.play()

        facing_left = owner.current_facing == owner.left_key
        vel = Vec2d(-self.speed, 0) if facing_left else Vec2d(self.speed, 0)
        offset = Vec2d(0, -5) if facing_left else Vec2d(20, -5)
        self.body = pymunk.Body(1, pymunk.inf)
        self.body.position = owner.body.position + offset
        self.body.velocity = owner.body.velocity + vel
        self.body.bullet = weakref.proxy(self)
        if not gravity:
            self.body.velocity_func = _bullet_velocity_func
        self.shape = pymunk.Circle(self.body, self.radius, (0, 0))
        self.shape.collision_type = BULLET_COLLISION_TYPE
        self.shape.friction = 0
        SPACE.add(self.body, self.shape)
        self.active = True
Example #5
0
    def __init__(self, owner, gravity=False):
        self.radius = 3
        self.speed = 500
        self.ttl = 40
        self.cooldown = 10

        self.shot_sound = pygame.mixer.Sound("res/sfx/C_28P.ogg")
        self.shot_sound.play()

        facing_left = owner.current_facing == owner.left_key
        vel = Vec2d(-self.speed, 0) if facing_left else Vec2d(self.speed, 0)
        offset = Vec2d(0, -5) if facing_left else Vec2d(20, -5)
        self.body = pymunk.Body(1, pymunk.inf)
        self.body.position = owner.body.position + offset
        self.body.velocity = owner.body.velocity + vel
        self.body.bullet = weakref.proxy(self)
        if not gravity:
            self.body.velocity_func = _bullet_velocity_func
        self.shape = pymunk.Circle(self.body, self.radius, (0, 0))
        self.shape.collision_type = BULLET_COLLISION_TYPE
        self.shape.friction = 0
        SPACE.add(self.body, self.shape)
        self.active = True
Example #6
0
    def __init__(self, name, img, up=None, left=None,
                 right=None, down=None, shoot=None):
        self.name = name

        # sprites
        img = pygame.image.load(img)
        flip_img = pygame.transform.flip(img, True, False)
        images = (img, flip_img)

        # animations
        self.idle_loop = Animation(images, 1, 8, loop=True)
        self.walk_loop = Animation(images, 3, 8, loop=True)
        self.jump_loop = Animation(images, 5, 2, start_frame=4, loop=True)
        self.spin_loop = Animation(
            images, 7, 4, loop=True, frame_rate=0.4)
        self.death_sequence = Animation(images, 8, 7)

        # sounds
        self.fall_sound = pygame.mixer.Sound("res/sfx/fall.wav")
        self.fall_sound.set_volume(0.5)
        self.jump_sound = pygame.mixer.Sound("res/sfx/jump.wav")
        self.jump_sound.set_volume(0.5)

        # keybindings
        self.jump_key = up
        self.left_key = left
        self.right_key = right
        self.down_key = down
        self.shoot_key = shoot

        # physics
        self.body = pymunk.Body(5, pymunk.inf)  # mass, moment
        self.body.position = 100, 100
        self.body.player = weakref.proxy(self)

        # TODO: heads should be a separate collision type
        self.head = pymunk.Circle(self.body, 14, (12, 7))
        self.head.collision_type = PLAYER_COLLISION_TYPE
        self.head.friction = 0

        self.feet = pymunk.Circle(self.body, 14, (12, -16))
        self.feet.collision_type = 1
        # TODO: Make this zero whilst falling
        self.feet.friction = 2

        SPACE.add(self.body, self.head, self.feet)

        # Character stats
        self.max_jumps = 2
        self.remaining_jumps = self.max_jumps
        self.speed = 200  # 100
        self.jump_speed = 400
        self.max_health = 10
        self.health = self.max_health
        self.shot_cooldown = 0

        # State tracking
        self.landed = False
        self.landed_hard = False
        self.ground_velocity = Vec2d.zero()
        self.ground_slope = 0
        self.current_facing = self.right_key
        self.bullets = []
Example #7
0
 def destroy(self):
     try:
         SPACE.remove(self.body, self.shape)
         self.active = False
     except KeyError:
         pass
Example #8
0
 def destroy(self):
     try:
         SPACE.remove(self.body, self.shape)
         self.active = False
     except KeyError:
         pass
Example #9
0
    def __init__(self,
                 name,
                 img,
                 up=None,
                 left=None,
                 right=None,
                 down=None,
                 shoot=None):
        self.name = name

        # sprites
        img = pygame.image.load(img)
        flip_img = pygame.transform.flip(img, True, False)
        images = (img, flip_img)

        # animations
        self.idle_loop = Animation(images, 1, 8, loop=True)
        self.walk_loop = Animation(images, 3, 8, loop=True)
        self.jump_loop = Animation(images, 5, 2, start_frame=4, loop=True)
        self.spin_loop = Animation(images, 7, 4, loop=True, frame_rate=0.4)
        self.death_sequence = Animation(images, 8, 7)

        # sounds
        self.fall_sound = pygame.mixer.Sound("res/sfx/fall.wav")
        self.fall_sound.set_volume(0.5)
        self.jump_sound = pygame.mixer.Sound("res/sfx/jump.wav")
        self.jump_sound.set_volume(0.5)

        # keybindings
        self.jump_key = up
        self.left_key = left
        self.right_key = right
        self.down_key = down
        self.shoot_key = shoot

        # physics
        self.body = pymunk.Body(5, pymunk.inf)  # mass, moment
        self.body.position = Vec2d(100, 100)
        self.body.player = weakref.proxy(self)

        # TODO: heads should be a separate collision type
        self.head = pymunk.Circle(self.body, 14, (12, 7))
        self.head.collision_type = PLAYER_COLLISION_TYPE
        self.head.friction = 0

        self.feet = pymunk.Circle(self.body, 14, (12, -16))
        self.feet.collision_type = 1
        # TODO: Make this zero whilst falling
        self.feet.friction = 2

        SPACE.add(self.body, self.head, self.feet)

        # Character stats
        self.max_jumps = 2
        self.remaining_jumps = self.max_jumps
        self.speed = 200
        self.jump_speed = 500
        self.max_health = 10
        self.health = self.max_health
        self.shot_cooldown = 0

        # State tracking
        self.landed = False
        self.landed_hard = False
        self.ground_velocity = Vec2d.zero()
        self.ground_slope = 0
        self.current_facing = self.right_key
        self.bullets = []
Example #10
0

def jump_through_collision_handler(space, arbiter):
    # pass through only if going up
    return arbiter.shapes[0].body.velocity.y < 0


def bullet_collision_handler(space, arbiter):
    arbiter.shapes[0].body.player.health -= 1
    arbiter.shapes[1].body.bullet.destroy()
    return True


SPACE.gravity = (0, -1000)  # in px/sec^2
SPACE.add_collision_handler(
    PLAYER_COLLISION_TYPE, JUMP_THROUGH_COLLISION_TYPE,
    begin=jump_through_collision_handler)
SPACE.add_collision_handler(
    PLAYER_COLLISION_TYPE, BULLET_COLLISION_TYPE,
    begin=bullet_collision_handler)


def calculate_input(old_pressed_keys):
    # Manage all events
    for event in pygame.event.get():
        pressed_window_x = event.type == KEYS.QUIT
        pressed_esc = (event.type == KEYS.KEYDOWN and
                       event.key in [KEYS.K_ESCAPE])
        if pressed_window_x or pressed_esc:
            sys.exit()
    pressed = pygame.key.get_pressed()