当前位置:首页>python>Python游戏开发神器|Pygame库全面解析,从基础到进阶全吃透(下集)

Python游戏开发神器|Pygame库全面解析,从基础到进阶全吃透(下集)

  • 2026-10-10 12:08:26
Python游戏开发神器|Pygame库全面解析,从基础到进阶全吃透(下集)

(喜欢文章的朋友,动一动小手点个关注呀~)

掌握了Pygame基础用法,我们可以玩点更酷的!这些花哨操作不用复杂代码,却能让你的小游戏瞬间“升级”。开始,拿捏👇

1. 角色动画(让角色“动起来”)

不是简单的移动,而是实现“帧动画”——比如角色走路、跳跃,本质是“切换图片帧”,模拟动画效果。

# 思路:加载一组连续的动画帧,循环切换显示# 1. 加载动画帧(假设我们有3张猫的图片:cat-1.png、cat-2.png、cat-3.png)cat_frames = [    pygame.image.load("cat-1.png"),    pygame.image.load("cat-2.png"),    pygame.image.load("cat-3.png")]frame_index = 0  # 帧索引,控制切换clock = pygame.time.Clock()  # 控制帧率while running:    clock.tick(10)  # 每秒切换10帧,避免动画太快    # 绘制当前帧    screen.blit(cat_frames[frame_index], (100, 100))    # 切换帧索引,循环播放    frame_index += 1    if frame_index >= len(cat_frames):        frame_index = 0    for event in pygame.event.get():        # 点击窗口关闭按钮,退出游戏        if event.type == pygame.QUIT:            running = False  # 结束主循环            pygame.quit()  # 退出Pygame            exit()    # 其他事件处理、窗口更新代码...    pygame.display.update()

2. 碰撞检测(游戏的核心逻辑)

不管是贪吃蛇吃食物、飞机打敌人,还是角色碰到障碍物,都需要“碰撞检测”——判断两个物体是否重叠。

# 思路:给每个物体创建“矩形碰撞框”,判断两个矩形是否重叠# 1. 定义两个物体的矩形(x,y,宽,高)rect1 = pygame.Rect(100, 100, 50, 50)  # 红色矩形rect2 = pygame.Rect(150, 150, 50, 50)  # 绿色矩形while running:    # 绘制两个矩形    pygame.draw.rect(screen, (255,0,0), rect1)    pygame.draw.rect(screen, (0,255,0), rect2)    # 碰撞检测:如果两个矩形重叠,返回True    if rect1.colliderect(rect2):        print("碰撞啦!")    # 移动其中一个矩形(比如按方向键移动rect1)    keys = pygame.key.get_pressed()    if keys[pygame.K_LEFT]:        rect1.x -= 2    if keys[pygame.K_RIGHT]:        rect1.x += 2    if keys[pygame.K_UP]:        rect1.y -= 2    if keys[pygame.K_DOWN]:        rect1.y += 2    for event in pygame.event.get():        # 点击窗口关闭按钮,退出游戏        if event.type == pygame.QUIT:            running = False  # 结束主循环            pygame.quit()  # 退出Pygame            exit()    pygame.display.update()

(因为没有删除移动前的图像,所以正方形变成了长方形)

3. 屏幕特效(模糊、闪烁、渐变)

简单的特效就能提升游戏质感,比如角色受伤时屏幕闪烁、游戏结束时屏幕渐变变黑,不用复杂的算法,Pygame就能实现。

# 示例1:屏幕闪烁(角色受伤时)if is_hurt:  # 假设is_hurt是判断角色是否受伤的变量    # 绘制半透明黑色矩形,覆盖整个屏幕,实现闪烁效果    flash_surface = pygame.Surface((400, 300))    flash_surface.set_alpha(100)  # 透明度(0-255,越小越透明)    flash_surface.fill((0, 0, 0))    screen.blit(flash_surface, (0, 0))# 示例2:颜色渐变(背景渐变)# 从蓝色渐变到白色,逐行绘制for y in range(300):    # 计算每一行的颜色(R,G,B),y越大,蓝色越浅,白色越深    color = (y//2, y//2, 255 - y//2)    pygame.draw.line(screen, color, (0, y), (400, y))  # 绘制每一行

4. 多场景切换(游戏有始有终)

一个完整的游戏,应该有“开始界面→游戏界面→结束界面”,用Pygame可以轻松实现场景切换,让游戏更完整。

# 定义场景状态(0=开始界面,1=游戏界面,2=结束界面)scene = 0while running:    if scene == 0:  # 开始界面        screen.fill((255, 255, 255))  # 白色背景        # 绘制开始按钮、游戏标题        font = pygame.font.SysFont("微软雅黑", 36)        title = font.render("贪吃蛇游戏", True, (255,0,0))        start_btn = pygame.Rect(150, 200, 100, 50)        pygame.draw.rect(screen, (0,255,0), start_btn)        start_text = font.render("开始游戏", True, (0,0,0))        screen.blit(title, (100, 100))        screen.blit(start_text, (160, 210))        # 点击开始按钮,切换到游戏界面        for event in pygame.event.get():            if event.type == pygame.MOUSEBUTTONDOWN:                if start_btn.collidepoint(event.pos):                    scene = 1    elif scene == 1:  # 游戏界面        # 游戏逻辑(贪吃蛇移动、吃食物、碰撞检测等)        screen.fill((0,0,0))        # ... 游戏核心代码 ...    elif scene == 2:  # 结束界面        screen.fill((0,0,0))        font = pygame.font.SysFont("微软雅黑", 36)        game_over = font.render("游戏结束!", True, (255,0,0))        restart_btn = pygame.Rect(150, 200, 100, 50)        pygame.draw.rect(screen, (0,255,0), restart_btn)        restart_text = font.render("重新开始", True, (0,0,0))        screen.blit(game_over, (120, 100))        screen.blit(restart_text, (155, 210))        # 点击重新开始,切换回游戏界面        for event in pygame.event.get():            if event.type == pygame.MOUSEBUTTONDOWN:                if restart_btn.collidepoint(event.pos):                    scene = 1    pygame.display.update()

🎯 新手实战:30分钟写一个简单的“打方块”小游戏

看完上面的内容,我们来实战一下——用Pygame写一个简单的打方块游戏,整合基础用法和进阶操作,新手也能跟着写!

核心逻辑:用键盘左右移动挡板,接住下落的方块,接住一个得1分,没接住则游戏结束。

import pygameimport random# 初始化Pygamepygame.init()screen = pygame.display.set_mode((400, 500))pygame.display.set_caption("打方块小游戏")clock = pygame.time.Clock()# 定义颜色WHITE = (255,255,255)BLUE = (0,0,255)RED = (255,0,0)# 挡板设置paddle = pygame.Rect(150, 450, 100, 10)paddle_speed = 8# 方块设置block = pygame.Rect(random.randint(0, 350), 0, 50, 50)block_speed = 5# 分数score = 0font = pygame.font.SysFont("Times New Roman", 24)running = Truegame_over = Falsewhile running:    screen.fill(WHITE)  # 白色背景    if not game_over:        # 1. 事件处理(移动挡板)        keys = pygame.key.get_pressed()        if keys[pygame.K_LEFT] and paddle.left > 0:            paddle.x -= paddle_speed        if keys[pygame.K_RIGHT] and paddle.right < 400:            paddle.x += paddle_speed        # 2. 方块下落        block.y += block_speed        # 方块落地,游戏结束        if block.bottom > 500:            game_over = True        # 3. 碰撞检测(挡板接住方块)        if paddle.colliderect(block):            block.y = 0  # 方块回到顶部            block.x = random.randint(0, 350)  # 随机位置            score += 1  # 得分+1            block_speed += 1  # 速度加快,增加难度        # 绘制挡板和方块        pygame.draw.rect(screen, BLUE, paddle)        pygame.draw.rect(screen, RED, block)        # 绘制分数        score_text = font.render(f"Scores: {score}", True, BLUE)        screen.blit(score_text, (10, 10))    else:        # 游戏结束界面        game_over_text = font.render(f"Game Over! Final score: {score}", True, RED)        restart_text = font.render("Press SPACE to start again~", True, BLUE)        screen.blit(game_over_text, (50, 200))        screen.blit(restart_text, (70, 250))        # 按空格键重新开始        keys = pygame.key.get_pressed()        if keys[pygame.K_SPACE]:            game_over = False            score = 0            block = pygame.Rect(random.randint(0, 350), 0, 50, 50)            block_speed = 5    # 关闭窗口    for event in pygame.event.get():        if event.type == pygame.QUIT:            running = False    pygame.display.update()    clock.tick(60)pygame.quit()

💡 新手避坑指南(必看!)

  • ❌ 坑1:图片/音效路径错误 → 建议将图片、音效文件和代码放在同一文件夹,避免使用中文路径;

  • ❌ 坑2:窗口卡住不动 → 忘记写pygame.display.update(),或者主循环中没有处理事件;

  • ❌ 坑3:动画太快/太慢 → 用clock.tick(帧率)控制,一般60帧率比较合适;

  • ❌ 坑4:中文显示乱码 → 字体设置为“微软雅黑”“宋体”等支持中文的字体,避免默认字体;

  • ✅ 小技巧:遇到问题时,打印调试信息(比如print(rect1.pos)),快速定位错误。

往期回顾:

Python游戏开发神器|Pygame库全面解析,从基础到进阶全吃透(上集)

Python学习笔记——从入门到报废(八、逻辑判断与分支结构(下))

Python学习笔记——从入门到报废(七、逻辑判断与分支结构(上))

最新文章

随机文章