Python
pygame

PygameでShootingゲーム 02

目標:

前回: PygameでShootingゲーム01

Pygame でShootingゲームを作る 02

Tasks

  • bullet.pngを設定
  • bullet.png をload() -> bullet_img に格納
  • Bulletクラスを実装
  • bullets.sprite.Group()を作成
  • Playerクラスに shoot()を作成
  • Playerクラスのupdate()にshoot()を入れる

プロジェクトストラクチャー

  • project/ -- 全てを入れるフォルダ(ディレクトリ)
    • img/ -- 画像を保存するフォルダ(ディレクトリ)
      • player.png
      • background.png
    • app.py -- codeを書くファイル

bullet画像を読み込む

bullet_img = pygame.image.load(
    os.path.join(img_folder, "bullet.png")).convert()

bulletのスプライトグループを作成

bullets = pygame.sprite.Group()

Bulletクラスを実装

# ---- Bullet Class ----
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = bullet_img
        self.rect = self.image.get_rect()
        # 座標を設定
        self.rect.bottom = y
        self.rect.centerx = x
        # Bulletのスピードの初期値
        self.speedy = -10

    def update(self):
        self.rect.y += self.speedy
        # もし画面の上から出たら消える
        # kill()はSpriteクラスに組み込まれているfunction
        if self.rect.bottom < 0:
            self.kill()

Playerクラスをアップデート

NEWとなっている所に注意

  1. update()K_SPACEキーの状態を確認するcodeを追加
  2. shoot() を追加
class Player(pygame.sprite.Sprite):
    # sprite for the Player
    def __init__(self):
        super().__init__()
        self.image = pygame.transform.scale(player_img, (50, 38))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0

    def update(self):
        self.speedx = 0

        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -10
        if keystate[pygame.K_RIGHT]:
            self.speedx = 10

        # +++ NEW!!!! +++
        # Bullet を撃つ
        if keystate[pygame.K_SPACE]:
            self.shoot()

        self.rect.x += self.speedx

        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

    # +++ NEW!!!! +++
    # BulletをPlayerが撃つ
    def shoot(self):
        # Bulletクラスのインスタンスを作成
        # 座標はxはPlayerの真ん中、yはPlayerの上から
        bullet = Bullet(self.rect.centerx, self.rect.top)
        # all_spritesに追加する
        all_sprites.add(bullet)
        # bulletsグループにも追加する
        bullets.add(bullet)


ゲームループにイベント待ちを追加する

NEW

  1. event.type == pygame.KEYDOWNキーが押されているかを確認
  2. キーの中でもK_SPACEキーがおされているかを確認
  3. 押されていたら、player.shoot()を実行
while running:

    # ---- EVENTS: イベントを管理 ----
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # +++ NEW!!!! +++
        # Bulletを撃つ
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()

注意!!: このままだとbulletとbulletの間隔がなさすぎるという問題が発生

次回解決