Python 飞机大战进阶:道具系统开发全流程

一、需求分析与设计
  1. 道具类型
    • 护盾:临时无敌状态(持续5秒)
    • 火力增强:双倍攻击力(持续8秒)
  2. 交互逻辑
    • 道具从屏幕上方随机位置生成
    • 玩家飞机接触道具后触发效果
    • 状态栏显示当前激活的道具
二、核心代码实现
1. 道具基类定义
import pygame
import random

class PowerUp(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.speed = 3
        self.rect = self.image.get_rect(center=(x, y))
    
    def update(self):
        self.rect.y += self.speed  # 向下移动
        if self.rect.top > 800:    # 超出屏幕时销毁
            self.kill()

2. 具体道具类实现
class Shield(PowerUp):
    def __init__(self, x, y):
        self.image = pygame.Surface((30, 30), pygame.SRCALPHA)
        pygame.draw.circle(self.image, (0, 200, 255), (15, 15), 15)  # 蓝色护盾
        super().__init__(x, y)
        self.duration = 5000  # 持续5秒(毫秒)

class FirePower(PowerUp):
    def __init__(self, x, y):
        self.image = pygame.Surface((30, 30), pygame.SRCALPHA)
        pygame.draw.circle(self.image, (255, 50, 50), (15, 15), 15)  # 红色火力
        super().__init__(x, y)
        self.duration = 8000  # 持续8秒

3. 玩家状态管理
class Player(pygame.sprite.Sprite):
    def __init__(self):
        # ...基础初始化代码...
        self.active_powerups = {}  # 存储激活的道具{类型: 结束时间}
        
    def add_powerup(self, powerup):
        """添加道具效果"""
        now = pygame.time.get_ticks()
        # 护盾效果
        if isinstance(powerup, Shield):
            self.active_powerups['shield'] = now + powerup.duration
        # 火力增强
        elif isinstance(powerup, FirePower):
            self.active_powerups['fire_power'] = now + powerup.duration
    
    def update(self):
        """检测道具过期"""
        now = pygame.time.get_ticks()
        expired = [k for k, v in self.active_powerups.items() if v < now]
        for key in expired:
            del self.active_powerups[key]
    
    def is_shield_active(self):
        return 'shield' in self.active_powerups
    
    def is_fire_power_active(self):
        return 'fire_power' in self.active_powerups

4. 道具生成系统
class Game:
    def __init__(self):
        self.powerup_group = pygame.sprite.Group()
        self.powerup_spawn_timer = 0
    
    def spawn_powerup(self):
        """随机生成道具"""
        x = random.randint(50, 750)  # 随机水平位置
        # 随机选择道具类型
        if random.random() < 0.5:
            self.powerup_group.add(Shield(x, -30))
        else:
            self.powerup_group.add(FirePower(x, -30))
    
    def update(self):
        # 每10秒生成一个道具
        if pygame.time.get_ticks() - self.powerup_spawn_timer > 10000:
            self.spawn_powerup()
            self.powerup_spawn_timer = pygame.time.get_ticks()
        
        # 检测碰撞
        hits = pygame.sprite.spritecollide(
            self.player, 
            self.powerup_group, 
            True  # 碰撞后删除道具
        )
        for powerup in hits:
            self.player.add_powerup(powerup)

三、效果集成与优化
1. 护盾视觉效果
def draw_shield_effect(screen, player):
    if player.is_shield_active():
        pygame.draw.circle(
            screen, 
            (0, 200, 255, 100),  # 半透明蓝色
            player.rect.center, 
            40, 
            3  # 线宽
        )

2. 火力增强效果
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, is_enhanced):
        # ...基础初始化...
        if is_enhanced:  # 火力增强时双倍伤害
            self.damage = 2
            self.image = pygame.Surface((8, 20))  # 更大的子弹

3. 状态显示UI
def draw_hud(screen, player):
    # 护盾状态
    if player.is_shield_active():
        pygame.draw.rect(screen, (0, 150, 255), (10, 10, 20, 20))
    
    # 火力状态
    if player.is_fire_power_active():
        pygame.draw.rect(screen, (255, 50, 50), (40, 10, 20, 20))

四、测试与平衡调整
  1. 测试用例

    # 测试道具生成
    game.spawn_powerup()
    assert len(game.powerup_group) == 1
    
    # 测试道具碰撞
    player.rect.center = powerup.rect.center
    game.update()
    assert len(game.powerup_group) == 0
    assert 'shield' in player.active_powerups
    

  2. 平衡参数

    • 调整生成间隔:1000015000(降低道具频率)
    • 护盾持续时间:50004000(缩短无敌时间)
    • 火力伤害:21.5(避免过度增强)
五、扩展建议
  1. 道具组合效果

    • 同时激活护盾和火力时产生金色特效
    • 组合效果延长持续时间
  2. 道具存储系统

    class Player:
        def __init__(self):
            self.inventory = []  # 存储未使用的道具
        
        def use_powerup(self, type):
            """使用存储的道具"""
            for item in self.inventory:
                if isinstance(item, type):
                    self.add_powerup(item)
                    self.inventory.remove(item)
                    break
    

  3. 进阶道具

    • 时间减缓:降低敌机速度
    • 全屏攻击:一次性清除所有敌机

实现要点:通过精灵组管理道具对象,使用时间戳控制持续时间,状态机管理玩家能力变化。道具系统可使游戏策略深度增加200%,建议优先完成核心碰撞检测逻辑后再扩展高级功能。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐