Python
pygame

PygameでShootingゲーム 03

目標:

前回: PygameでShootingゲーム02

Pygame でShootingゲームを作る 03

Tasks

  • このままだとbulletとbulletの間の間隔が短すぎる
  • Playerクラスにself.shoot_delay属性を入れる(bulletの間隔 millisecond)
  • Playerクラスにself.last_shot属性を入れる
  • 最後に撃ったbulletの時間を格納
  • pygame.time.get_ticks()でその瞬間の時間を格納
  • 現在の時間とlast_shotの時間を比較し、shoot_delayの間隔より大きくなったら次のbulletを撃っても良いようにする
  • Playerクラスのshoot()を更新する

Playerクラスにself.shoot_delay属性を入れる(bulletの間隔 millisecond)

NEW

  1. self.shoot_delay属性を設定
  2. self.last_shot属性を設定
  3. shoot()が多く変化
    • now に現在の時間を格納
    • nowlast_shotの時間の差をshoot_delayと比較
    • shoot_delayより大きかったらshoot()を実行
      • Bullet()インスタンスを作成、bulletに格納
      • all_spritesbulletSpriteグループに足す
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

        # +++ NEW!!!! +++
        # Bulletの間隔を空ける時間
        self.shoot_delay = 150
        # 最後に撃ったBulletの時間
        self.last_shot = pygame.time.get_ticks()

    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

        # 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

    # BulletをPlayerが撃つ
    def shoot(self):
        # +++ NEW!!!! +++
        # 現在の時間をnowに格納
        now = pygame.time.get_ticks()
        # 現在の時間と最後に撃った時間(last_shot)をshoot_delay属性と比較
        if now - self.last_shot > self.shoot_delay:
            # 最後に撃ったbulletの時間を現在に更新
            self.last_shot = now
            bullet = Bullet(self.rect.centerx, self.rect.top)
            all_sprites.add(bullet)
            bullets.add(bullet)