卡通飞机大战游戏,一步步实现

一、游戏简介

《卡通飞机大战》是一款基于Pygame库开发的2D射击游戏。玩家将扮演一名飞行员,驾驶卡通风格的飞机在空中与敌机进行战斗,目标是击落所有敌机并获得高分。

二、游戏开发环境及依赖

  • 开发环境‌:Python 3.x
  • 依赖库‌:pygame

确保已安装pygame库,可以通过以下命令进行安装:

pip install pygame 

三、游戏资源准备

为了运行游戏,需要准备以下图片资源,并放置在项目的images文件夹中:

  • background.png:游戏背景图
  • player.png:玩家飞机图
  • enemy1.png:敌机图
  • bullet.png:子弹图
  • explosion_1.png 至 explosion_5.png:爆炸动画帧图

四、游戏核心组件

1. 游戏窗口设置

游戏窗口宽度为480像素,高度为700像素,窗口标题为“卡通飞机大战”。

# 游戏窗口设置
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 700
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("卡通飞机大战")

2. 玩家类(Player)

  • 属性‌:包含飞机图片、位置、速度、子弹组等。
  • 方法‌:
    • __init__:初始化玩家飞机。
    • update:更新玩家飞机的位置,并根据按键输入调整飞机倾斜角度。
    • shoot:发射子弹。
# 玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.orig_image =load_scaled_image(PLAYER_IMG, (60, 60))  # 需准备图片 # 需准备图片
        self.image = self.orig_image.copy()
        self.rect =  self.image.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT - 100))

        self.speed = 7
        self.bullets = pygame.sprite.Group()
        self.angle = 0
    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
            self.angle = 15
        if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH:
            self.rect.x += self.speed
            self.angle = -15
        else:
             self.angle *= 0.8
    # 添加倾斜动画
        self.image = pygame.transform.rotate(self.orig_image, self.angle)
        self.rect = self.image.get_rect(center=self.rect.center)
    def shoot(self):
        bullet = Bullet(self.rect.midtop)
        self.bullets.add(bullet)

 

3. 敌机类(Enemy)

  • 属性‌:包含敌机图片、位置、速度等。
  • 方法‌:
    • __init__:初始化敌机位置及速度。
    • update:更新敌机位置,当敌机移出屏幕时销毁。
# 敌机类
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image =  load_scaled_image(ENEMY_IMG, (60, 60))  # 需准备图片
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, SCREEN_WIDTH - self.rect.width)
        self.rect.y = random.randint(-100, -50)
        self.speed = random.randint(2, 5)

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > SCREEN_HEIGHT:
            self.kill()

 

4. 子弹类(Bullet)

  • 属性‌:包含子弹图片、位置、速度等。
  • 方法‌:
    • __init__:初始化子弹位置。
    • update:更新子弹位置,当子弹移出屏幕时销毁。
# 子弹类
class Bullet(pygame.sprite.Sprite):
    def __init__(self,  pos):
        super().__init__()
        self.image = load_scaled_image(BULLET_IMG,  (15, 30))  # 需准备图片
        self.rect = self.image.get_rect(center=pos)
        self.speed = -9
        self.trail_pos = []
    def update(self):
        self.rect.y += self.speed
        if self.rect.bottom < 0:
            self.kill()

 

5. 爆炸动画类(Explosion)

  • 属性‌:包含爆炸动画帧列表、当前帧索引、帧延迟时间等。
  • 方法‌:
    • __init__:初始化爆炸动画。
    • update:更新爆炸动画帧,当动画播放完成时销毁。
# 爆炸动画
class Explosion(pygame.sprite.Sprite):
    def __init__(self, pos):
        super().__init__()
        # 加载爆炸序列帧(确保路径正确)
        self.frames =  EXPLOSION_FRAMES # 直接使用预加载资源
        # 初始化当前帧
        self.frame_index = 0
        self.image = self.frames[self.frame_index]   # 关键修正:使用单张图片,而非整个列表
        self.rect = self.image.get_rect(center=pos)  # 现在可以正确调用 get_rect()

        # 动画控制参数
        self.frame_delay = 50  # 每帧显示时间(毫秒)
        self.last_update = pygame.time.get_ticks()

    def update(self):
        now = pygame.time.get_ticks()
        # 帧切换逻辑
        if now - self.last_update > self.frame_delay:
            self.last_update = now
            self.frame_index += 1

            # 播放完成后自动销毁
            if self.frame_index >= len(self.frames):
                self.kill()
            else:
                # 更新当前显示帧
                self.image = self.frames[self.frame_index]  # 动态切换图片
                # 保持爆炸中心位置不变(可选)
                self.rect = self.image.get_rect(center=self.rect.center)

 

五、游戏主循环

  • 初始化‌:创建时钟对象、精灵组(包含所有精灵)、敌机组等。
  • 事件处理‌:处理退出事件、敌机生成事件、射击事件等。
  • 更新‌:更新所有精灵的状态。
  • 碰撞检测‌:检测敌机与子弹的碰撞,击中时增加分数并创建爆炸动画。
  • 绘制‌:绘制背景图、所有精灵、分数等。
  • 翻转屏幕‌:更新游戏窗口显示。

 

# 游戏主循环
def main():
    clock = pygame.time.Clock()
    all_sprites = pygame.sprite.Group()
    enemies = pygame.sprite.Group()

    player = Player()
    all_sprites.add(player)

    # 敌机生成计时器
    ENEMY_EVENT = pygame.USEREVENT + 1
    pygame.time.set_timer(ENEMY_EVENT, 1000)

    score = 0
    font = pygame.font.Font(None, 36)

    running = True
    while running:
        clock.tick(60)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                pygame.quit()
                sys.exit()
            elif event.type == ENEMY_EVENT:
                enemy = Enemy()
                all_sprites.add(enemy)
                enemies.add(enemy)
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    player.shoot()
                    bullet = Bullet(player.rect.midtop)
                    all_sprites.add(bullet)
                    player.bullets.add(bullet)
        # 更新
        all_sprites.update()

        # 碰撞检测
        hits = pygame.sprite.groupcollide(enemies, player.bullets, True, True)

        for hit in hits:
            score += 10
            explosion = Explosion(hit.rect.center)
            all_sprites.add(explosion)
        # 绘制
        screen.blit(BACKGROUND, (0, 0))
        all_sprites.draw(screen)

        # 显示分数
        text = font.render(f"Score: {score}", True, WHITE)
        screen.blit(text, (10, 10))

        pygame.display.flip()


if __name__ == "__main__":
    main()

 

六、运行游戏

将上述代码保存为Python文件(如feiji_game.py),并确保图片资源正确放置。在命令行中运行该文件即可启动游戏。

文件下载链接如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值