Source

pygame-tutorial / 19-sound.py

Full commit
Richard Jones 80d4e90 












Richard Jones 91afdce 
Richard Jones 80d4e90 







































































Richard Jones 91afdce 
Richard Jones 80d4e90 





















Richard Jones 91afdce 
Richard Jones 80d4e90 




Richard Jones 91afdce 
Richard Jones 80d4e90 






























import pygame
import tmx

class Sprite(pygame.sprite.Sprite):
    def __init__(self, image, location):
        super(Sprite, self).__init__()
        self.image = pygame.image.load(image)
        self.rect = pygame.rect.Rect(location, self.image.get_size())

class Enemy(Sprite):
    direction = 1
    def update(self, dt, game):
        self.rect.x += self.direction * 100 * dt
        for cell in game.tilemap.layers['triggers'].collide(self.rect, 'reverse'):
            if self.direction > 0:
                self.rect.right = cell.left
            else:
                self.rect.left = cell.right
            self.direction *= -1
            break
        if self.rect.colliderect(game.player.rect):
            game.player.is_dead = True

class Bullet(pygame.sprite.Sprite):
    image = pygame.image.load('bullet.png')
    def __init__(self, location, direction):
        super(Bullet, self).__init__()
        self.rect = pygame.rect.Rect(location, self.image.get_size())
        self.direction = direction
        self.lifespan = 1

    def update(self, dt, game):
        self.lifespan -= dt
        if self.lifespan < 0:
            self.kill()
            return
        self.rect.x += self.direction * 400 * dt

        if pygame.sprite.spritecollide(self, game.enemies, True):
            game.explosion.play()
            self.kill()

class Player(Sprite):
    resting = False
    dy = 0
    is_dead = False
    gun_cooldown = 0
    direction = 1

    def __init__(self, location):
        super(Player, self).__init__('player-right.png', location)
        self.right_image = self.image
        self.left_image = pygame.image.load('player-left.png')

    def update(self, dt, game):
        last = self.rect.copy()

        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT]:
            self.rect.x -= 300 * dt
            self.image = self.left_image
            self.direction = -1
        if key[pygame.K_RIGHT]:
            self.rect.x += 300 * dt
            self.image = self.right_image
            self.direction = 1

        if key[pygame.K_LSHIFT] and not self.gun_cooldown:
            if self.direction > 0:
                game.sprites.add(Bullet(self.rect.midright, 1))
            else:
                game.sprites.add(Bullet(self.rect.midleft, -1))
            self.gun_cooldown = 1
            game.shoot.play()

        self.gun_cooldown = max(0, self.gun_cooldown - dt)

        if self.resting and key[pygame.K_SPACE]:
            game.jump.play()
            self.dy = -500
        self.dy = min(400, self.dy + 40)

        self.rect.y += self.dy * dt

        new = self.rect
        self.resting = False
        for cell in game.tilemap.layers['triggers'].collide(new, 'blockers'):
            blockers = cell.tile.properties['blockers']
            if 'l' in blockers and last.right <= cell.left and new.right > cell.left:
                new.right = cell.left
            if 'r' in blockers and last.left >= cell.right and new.left < cell.right:
                new.left = cell.right
            if 't' in blockers and last.bottom <= cell.top and new.bottom > cell.top:
                self.resting = True
                new.bottom = cell.top
                self.dy = 0
            if 'b' in blockers and last.top >= cell.bottom and new.top < cell.bottom:
                new.top = cell.bottom
                self.dy = 0

        game.tilemap.set_focus(new.x, new.y)

class Game(object):
    def main(self, screen):
        clock = pygame.time.Clock()

        self.tilemap = tmx.load('map.tmx', screen.get_size())

        self.sprites = tmx.SpriteLayer()
        start_cell = self.tilemap.layers['triggers'].find('player')[0]
        self.player = Player((start_cell.px, start_cell.py))
        self.sprites.add(self.player)
        self.tilemap.layers.append(self.sprites)

        self.enemies = tmx.SpriteLayer()
        for enemy in self.tilemap.layers['triggers'].find('enemy'):
            self.enemies.add(Enemy('enemy.png', (enemy.px, enemy.py)))
        self.tilemap.layers.append(self.enemies)

        background = pygame.image.load('background.png')

        self.jump = pygame.mixer.Sound('jump.wav')
        self.shoot = pygame.mixer.Sound('shoot.wav')
        self.explosion = pygame.mixer.Sound('explosion.wav')

        while 1:
            dt = clock.tick(30)

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return
                if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                    return

            self.tilemap.update(dt / 1000., self)
            screen.blit(background, (0,0))
            self.tilemap.draw(screen)
            pygame.display.flip()

            if self.player.is_dead:
                print 'YOU DIED'
                return

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((640, 480))
    Game().main(screen)