LoginSignup
2
0

More than 5 years have passed since last update.

PygameでShootingゲーム 02

Last updated at Posted at 2018-10-12

目標:

前回: 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の間隔がなさすぎるという問題が発生

次回解決

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0