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)
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)
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)
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
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 = []
def destroy(self): try: SPACE.remove(self.body, self.shape) self.active = False except KeyError: pass
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 = []
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()