iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0

今天的內容我們要讓玩家的子彈可以擊殺怪物,並讓怪物的子彈,可以傷害玩家。

新增玩家資料

  1. 初始化玩家護盾值
  2. 初始化玩家生命次數
  3. 初始化玩家分數
class Player(pygame.sprite.Sprite):
    def __init__(self, construction: dict, **kwargs):
        self.shield = 100
        self.lives = 3
        self.score = 0

生存判定

class Player(pygame.sprite.Sprite):
    def update(self, command: dict) -> None:
        if self.shield <= 0:
            self.lives -= 1
            if self.lives <= 0:
                self.is_alive = False
            self.shield = 100
  • 若護盾值歸零
    • 生命次數 -1
      • 若生命次數歸零
        • 是否存活則為否
    • 護盾值回復

處理碰撞

  1. 執行碰撞函式
class BattleMode:
    def update(self, command: dict) -> None:
        self.handle_collisions()
  1. 定義碰撞函式
class BattleMode:
    def handle_collisions(self):
        for mob in self.mobs:
            if isinstance(mob, Mob):
                bullets = pygame.sprite.spritecollide(mob, self.player_1P.bullets, True, pygame.sprite.collide_rect_ratio(0.8))
                if bullets:
                    mob.kill()
                    self.player_1P.score += 10
                bullets = pygame.sprite.spritecollide(mob, self.player_2P.bullets, True, pygame.sprite.collide_rect_ratio(0.8))
                if bullets:
                    mob.kill()
                    self.player_2P.score += 10
                hits_dict = pygame.sprite.groupcollide(self.players, mob.bullets, False, True, pygame.sprite.collide_rect_ratio(0.8))
                for player, bullet in hits_dict.items():
                    if isinstance(player, Player):
                        player.shield -= len(bullet) * 10
  • 遍歷每一個 mob
    • 判斷 mob 和玩家裡的子彈,是否有碰撞
      • 若有,則將 mob 從 mob group——mobs 裡移除
      • 玩家分數加 10 分
    • 判斷玩家和 mob 裡的子彈,是否有碰撞
      • 若有,則該玩家的護盾值,每被擊中一次,扣 10 點

本日進度完整程式碼 點我

day22_end_view.png

今日檔案更新有:

  1. BattleMode
  2. Player

上一篇
實作!雙人射擊遊戲 —— 遊戲參數
下一篇
實作!雙人射擊遊戲 —— 新增文字與改變背景
系列文
用程式寫遊戲給AI玩30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言