Pygame 是一个功能强大的 2D 游戏开发框架,适合用来学习编程和开发小游戏。如果您想从入门到精通 Pygame,以下是一个全面的学习路线和内容清单。
目标:理解什么是 pygame,学会安装和运行简单的程序。
了解 pygame:
pygame 是一个专门用于 2D 游戏开发的 Python 库,基于 SDL(Simple DirectMedia Layer)。
特点:跨平台、简单易学、适合小游戏开发。
pip install pygame
python -m pygame.examples.aliens
如果弹出一个小游戏窗口,说明安装成功。
了解 Pygame 的基本架构
Pygame 的核心是一个游戏循环,包括以下步骤:
第一个 Pygame 程序:
创建一个窗口并绘制简单图形。
代码示例:
import pygame
pygame.init()
# 设置窗口
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("我的第一个 Pygame 程序")
# 主循环
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 填充背景颜色
screen.fill((0, 128, 255))
# 绘制一个矩形
pygame.draw.rect(screen, (255, 0, 0), (350, 250, 100, 100))
# 更新屏幕
pygame.display.flip()
pygame.quit()
目标:熟悉 Pygame 的常用模块,学会创建简单的交互动画。
学习如何捕获键盘、鼠标事件,例如:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN: # 键盘按下
print(f"键 {event.key} 被按下")
elif event.type == pygame.MOUSEBUTTONDOWN: # 鼠标点击
print(f"鼠标位置: {event.pos}")
1.重要模块:
Pygame 提供了丰富的绘图 API,例如:
2.制作简单动画:
pygame.draw.circle(screen, (255, 0, 0), (400, 300), 50) # 红色圆心
示例代码:
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("简单动画")
clock = pygame.time.Clock()
x, y = 100, 100 # 初始坐标
speed_x, speed_y = 5, 3 # 移动速度
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 更新物体位置
x += speed_x
y += speed_y
# 碰撞检测
if x <= 0 or x >= 800 - 50: # 边界检测
speed_x = -speed_x
if y <= 0 or y >= 600 - 50:
speed_y = -speed_y
# 绘制
screen.fill((0, 0, 0)) # 黑色背景
pygame.draw.rect(screen, (0, 255, 0), (x, y, 50, 50)) # 绘制矩形
pygame.display.flip()
# 控制帧率
clock.tick(60)
pygame.quit()
3.图像、文字和音效:
image = pygame.image.load("path_to_image.png")
screen.blit(image, (100, 100)) # 绘制图片
pygame.font.Font
渲染文字。font = pygame.font.Font(None, 36) # 系统字体,大小36
text = font.render("你好,Pygame!", True, (0, 0, 0))
screen.blit(text, (100, 100)) # 显示文字
pygame.mixer.Sound
加载并播放音效。pygame.mixer.init()
pygame.mixer.music.load("background_music.mp3")
pygame.mixer.music.play(-1) # 循环播放
sound = pygame.mixer.Sound("effect.wav")
sound.play()
目标:完成一个功能完整的小型游戏,例如“打砖块”、“贪吃蛇”(在文章结尾有脚本可展示)等。
1.游戏循环逻辑:
class Player:
def __init__(self, x, y):
self.x = x
self.y = y
self.speed = 5
def move(self, keys):
if keys[pygame.K_LEFT]:
self.x -= self.speed
if keys[pygame.K_RIGHT]:
self.x += self.speed
def draw(self, screen):
pygame.draw.rect(screen, (0, 0, 255), (self.x, self.y, 50, 50))
# 在主循环中:
player = Player(100, 100)
keys = pygame.key.get_pressed()
player.move(keys)
player.draw(screen)
2.碰撞检测:
pygame.Rect.colliderect()
rect1 = pygame.Rect(100, 100, 50, 50)
rect2 = pygame.Rect(150, 120, 50, 50)
if rect1.colliderect(rect2):
print("碰撞发生!")
3.资源管理:
4.示例:打砖块游戏:
目标:学习游戏优化和设计复杂的游戏机制。
1.帧率优化:
clock = pygame.time.Clock()
clock.tick(60) # 限制帧率为60帧每秒
动画:
x = 0
while running:
x += 5 # 每帧更新位置
screen.blit(image, (x, 100)) # 绘制移动的图片
pygame.display.flip()
2.物理引擎:
pymunk
)增加物理效果。3.关卡设计:
4.高级图形效果:
pygame.sprite.Group
和 pygame.sprite.Sprite
)。5.网络与多人游戏:
socket
编程实现局域网多人游戏。PyGame
结合 asyncio
开发实时交互。state = "menu" # "game", "pause"
if state == "menu":
draw_menu()
elif state == "game":
run_game()
pygame.sprite.Group
管理大量精灵。目标:开发一款完整的 2D 游戏,掌握项目开发全流程。
1.项目架构设计:
这里可以尝试一些小游戏的开发:经典的打砖块游戏;2D 飞机射击游戏;简单的 RPG 游戏。
2.测试和调试:
unittest
编写单元测试。Pygame 的 sprite
模块可以方便地管理对象:
player = pygame.sprite.Sprite()
group = pygame.sprite.Group(player)
group.draw(screen)
group.update()
3.发布和打包:
pyinstaller
将游戏打包为独立的可执行文件。4.团队协作:
5.扩展功能:
socket
或 pygame-net
)。官方文档:
书籍推荐:
在线教程:
使用 pygame 初始化窗口、设置标题和时钟。
使用列表维护蛇的身体,每个元素表示蛇的一个部分。
初始蛇由几个小方块组成,后续会随着吃到食物而变长。
随机生成食物的位置,确保它不与蛇的位置重叠。
通过键盘控制蛇的方向(上下左右)。
蛇的身体按方向移动,头部添加新位置,尾部移除最后一节。
碰撞墙壁:判断蛇头是否超出窗口边界。
撞到自身:判断蛇头是否与身体其他部分重叠。
当蛇吃到食物时,得分增加,蛇长度增长。
包含事件监听、蛇的移动更新、碰撞检测、画面刷新等。
撞墙或撞到自己后游戏结束,显示分数。
下面是完整代码。
import pygame
import random
import sys
# 初始化 Pygame
pygame.init()
# 定义窗口大小和格子大小
WIDTH, HEIGHT = 600, 400
BLOCK_SIZE = 20
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇")
# 定义颜色
WHITE = (255, 255, 255)
GREEN = (0, 128, 0)
RED = (255, 0, 0)
BLACK = (0, 0, 0)
# 初始化贪吃蛇
snake = [(100, 100), (90, 100), (80, 100)] # 蛇的初始位置
snake_dir = 'RIGHT' # 初始方向
food_pos = (random.randrange(1, WIDTH // BLOCK_SIZE) * BLOCK_SIZE,
random.randrange(1, HEIGHT // BLOCK_SIZE) * BLOCK_SIZE)
score = 0
# 定义时钟
clock = pygame.time.Clock()
def draw_snake(snake):
for segment in snake:
pygame.draw.rect(screen, GREEN, pygame.Rect(segment[0], segment[1], BLOCK_SIZE, BLOCK_SIZE))
def draw_food(food_pos):
pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], BLOCK_SIZE, BLOCK_SIZE))
def move_snake(snake, direction):
x, y = snake[0]
if direction == 'UP':
y -= BLOCK_SIZE
elif direction == 'DOWN':
y += BLOCK_SIZE
elif direction == 'LEFT':
x -= BLOCK_SIZE
elif direction == 'RIGHT':
x += BLOCK_SIZE
new_head = (x, y)
snake.insert(0, new_head)
return snake
def check_collision(snake):
# 撞到墙
head_x, head_y = snake[0]
if head_x < 0 or head_x >= WIDTH or head_y < 0 or head_y >= HEIGHT:
return True
# 撞到自己
if snake[0] in snake[1:]:
return True
return False
# 游戏主循环
while True:
screen.fill(BLACK) # 填充背景
# 事件监听
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and snake_dir != 'DOWN':
snake_dir = 'UP'
elif event.key == pygame.K_DOWN and snake_dir != 'UP':
snake_dir = 'DOWN'
elif event.key == pygame.K_LEFT and snake_dir != 'RIGHT':
snake_dir = 'LEFT'
elif event.key == pygame.K_RIGHT and snake_dir != 'LEFT':
snake_dir = 'RIGHT'
# 移动蛇
snake = move_snake(snake, snake_dir)
# 检测吃到食物
if snake[0] == food_pos:
score += 1
food_pos = (random.randrange(1, WIDTH // BLOCK_SIZE) * BLOCK_SIZE,
random.randrange(1, HEIGHT // BLOCK_SIZE) * BLOCK_SIZE)
else:
snake.pop() # 没吃到食物就移除尾部
# 检测碰撞
if check_collision(snake):
print(f"游戏结束!你的得分是:{score}")
pygame.quit()
sys.exit()
# 绘制蛇和食物
draw_snake(snake)
draw_food(food_pos)
# 更新屏幕
pygame.display.flip()
# 控制帧率
clock.tick(10)
功能总结
1.蛇通过上下左右键控制移动。
2.吃到红色方块时增长长度并加分。
3.撞到墙或自己时游戏结束。
可扩展功能
1.添加速度加快:随着得分增加,逐渐提高帧率。
2.多种食物类型:添加不同颜色的食物,有的增加得分,有的减少得分。
3.背景音乐和音效:增加吃食物或碰撞时的音效。
4.排行榜:记录最高得分。