一、游戏简介
《卡通飞机大战》是一款基于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
),并确保图片资源正确放置。在命令行中运行该文件即可启动游戏。
文件下载链接如下: