第五部分:碰撞检测
碰撞检测是游戏的核心机制。Pygame提供了多种碰撞检测函数。
5.1 子弹与敌机碰撞
当子弹击中敌机时,两者都应该消失,玩家获得分数。
# 碰撞检测:子弹 vs 敌机
# groupcollide(group1, group2, dokill1, dokill2, collided=None)
# dokill1=True表示group1中的精灵在碰撞后消失
# dokill2=True表示group2中的精灵在碰撞后消失
# 该函数返回一个字典,键是被碰撞的group1精灵,值是被撞到的group2精灵列表
hits = pygame.sprite.groupcollide(bullets, enemies, True, True)
for hit in hits:
score += 10
5.2 玩家与敌机碰撞
玩家碰到敌机游戏结束。
# spritecollide(sprite, group, dokill, collided=None)
# 检测单个精灵是否与组中的任何精灵碰撞
if pygame.sprite.spritecollide(player, enemies, False):
game_over = True
5.3 碰撞检测原理
Pygame的碰撞检测默认使用矩形碰撞(Rect Collision),即检测两个矩形是否重叠。这对于矩形或近似矩形的游戏对象非常高效。
如果精灵的形状不是矩形(比如三角形飞机),可以自定义碰撞检测函数。
第六部分:游戏状态与分数显示
6.1 游戏结束和重新开始
我们需要变量记录游戏是否结束。游戏结束时,停止生成新敌机,停止碰撞检测,玩家无法移动。
game_over = False # 游戏是否结束
# 主循环中
if not game_over:
# 只有游戏未结束时才更新游戏逻辑
# 生成敌机、更新位置、碰撞检测等
pass
else:
# 游戏结束时,显示提示文字,等待按R键重开
pass
6.2 重新开始功能
当游戏结束且按下“R”键时,重置所有变量和精灵。
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r and game_over:
# 重置游戏状态
game_over = False
score = 0
# 清除所有子弹和敌机
for sprite in all_sprites:
if sprite != player:
sprite.kill()
# 重置玩家位置
player.rect.centerx = SCREEN_WIDTH // 2
player.rect.bottom = SCREEN_HEIGHT - 10
6.3 分数显示
Pygame提供了文字渲染功能,需要在游戏初始化时加载字体。
# 初始化字体模块
pygame.font.init()
# 创建字体对象(None表示默认字体,36表示字体大小)
font = pygame.font.Font(None, 36)
# 在主循环中渲染分数
score_text = font.render(f"Score: {score}", True, (255, 255, 255))
# 绘制到屏幕上(左上角坐标10,10)
screen.blit(score_text, (10, 10))
font.render(text, antialias, color, background=None):
text:要渲染的文字
antialias:是否开启抗锯齿(True使文字边缘平滑)
color:文字颜色
6.4 游戏结束文字
if game_over:
# 渲染游戏结束文字
game_over_text = font.render("GAME OVER - Press R to restart", True, (255, 0, 0))
# 获取文字矩形,用于居中
text_rect = game_over_text.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2))
screen.blit(game_over_text, text_rect)