Pygame 速查表
版本unknown 更新日志2025-12-10 GitHubpygame/pygame
340px

🔧 核心初始化 >>>

  • pygame.init():初始化所有pygame模块
  • pygame.quit():退出pygame,释放资源
  • pygame.display.set_mode((width, height)):创建显示窗口
  • pygame.display.set_caption(title):设置窗口标题

🎮 游戏循环 >>>

import pygame

pygame.init()
screen = pygame.display.set_mode((1280, 720))
clock = pygame.time.Clock()
running = True

dt = 0
player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2)

while running:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    # 绘制
    screen.fill("purple")
    pygame.draw.circle(screen, "red", player_pos, 40)
    
    # 显示更新
    pygame.display.flip()
    
    # 帧率控制
    dt = clock.tick(60) / 1000

pygame.quit()
基本游戏循环结构,包含事件处理、绘制和帧率控制

🎯 事件处理 >>>

事件类型

  • pygame.QUIT:窗口关闭
  • pygame.KEYDOWN:按键按下
  • pygame.KEYUP:按键释放
  • pygame.MOUSEBUTTONDOWN:鼠标按下
  • pygame.MOUSEBUTTONUP:鼠标释放
  • pygame.MOUSEMOTION:鼠标移动

事件获取

  • pygame.event.get():获取所有事件
  • pygame.event.poll():获取单个事件

⌨️ 键盘输入 >>>

keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
    player_pos.y -= 300 * dt
if keys[pygame.K_s]:
    player_pos.y += 300 * dt
if keys[pygame.K_a]:
    player_pos.x -= 300 * dt
if keys[pygame.K_d]:
    player_pos.x += 300 * dt

鼠标输入

  • pygame.mouse.get_pos():获取鼠标位置
  • pygame.mouse.get_pressed():获取鼠标按键状态
  • pygame.mouse.set_pos(pos):设置鼠标位置

🖌️ 图形绘制 >>>

  • screen.fill(color):填充背景
  • pygame.draw.rect(surface, color, rect, width=0):绘制矩形
  • pygame.draw.circle(surface, color, center, radius, width=0):绘制圆形
  • pygame.draw.line(surface, color, start_pos, end_pos, width=1):绘制直线
  • pygame.draw.polygon(surface, color, points, width=0):绘制多边形
  • pygame.draw.ellipse(surface, color, rect, width=0):绘制椭圆

🎨 颜色 >>>

  • RGB元组:(r, g, b) 范围0-255
  • 预定义颜色字符串:"red", "green", "blue", "purple", "yellow"
  • pygame.Color 类:提供颜色操作

👾 精灵系统 >>>

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.image.fill((255, 0, 0))
        self.rect = self.image.get_rect()
    
    def update(self):
        # 更新逻辑
        pass

# 创建精灵组
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

# 游戏循环中
all_sprites.update()
all_sprites.draw(screen)

🖼️ 图像与表面 >>>

  • pygame.image.load(filename):加载图像
  • image.convert():转换图像格式,提高性能
  • image.convert_alpha():转换带透明通道的图像
  • image.get_rect():获取图像矩形
  • pygame.transform.scale(image, size):图像缩放
  • pygame.transform.rotate(image, angle):图像旋转

📝 文本渲染 >>>

# 初始化字体模块
pygame.font.init()

# 创建字体
font = pygame.font.SysFont(None, 36)  # 系统字体
# font = pygame.font.Font("custom.ttf", 36)  # 自定义字体

# 渲染文本
text = font.render("Hello Pygame", True, (255, 255, 255))

# 绘制文本
screen.blit(text, (x, y))

⏰ 时间与时钟 >>>

  • pygame.time.Clock():创建时钟对象
  • clock.tick(FPS):控制帧率,返回帧时间(ms)
  • clock.get_fps():获取实际帧率
  • pygame.time.get_ticks():获取自初始化以来的毫秒数

🔊 音频 >>>

  • pygame.mixer.init():初始化音频模块
  • pygame.mixer.music.load(filename):加载音乐
  • pygame.mixer.music.play(loops=0, start=0.0):播放音乐
  • pygame.mixer.music.pause():暂停音乐
  • pygame.mixer.Sound(filename):创建音效对象
  • sound.play():播放音效

📐 数学向量 >>>

  • pygame.math.Vector2:2D向量
  • pygame.math.Vector3:3D向量
  • 向量运算:+, -, *, /
  • vector.length():向量长度
  • vector.normalize():归一化
  • vector.dot(other):点积
pos = pygame.Vector2(100, 200)
vel = pygame.Vector2(5, 5)

# 更新位置
pos += vel

# 计算距离
dist = (pos - target_pos).length()

💥 碰撞检测 >>>

  • rect.colliderect(other_rect):矩形碰撞
  • rect.collidepoint(point):点与矩形碰撞
  • pygame.sprite.spritecollide(sprite, group, dokill):精灵与组碰撞
  • pygame.sprite.groupcollide(group1, group2, dokill1, dokill2):组与组碰撞
  • pygame.sprite.spritecollideany(sprite, group):检查是否有碰撞

🖥️ 显示模式 >>>

  • pygame.FULLSCREEN:全屏模式
  • pygame.RESIZABLE:可调整大小
  • pygame.NOFRAME:无边框
  • pygame.SCALED:自动缩放
# 创建全屏窗口
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)

# 创建可调整大小的窗口
screen = pygame.display.set_mode((800, 600), pygame.RESIZABLE)

⚡ 性能优化 >>>

  • 使用 convert()/convert_alpha() 转换图像
  • 使用精灵组批量绘制
  • 避免在循环中加载资源
  • 使用 clock.tick() 控制帧率
  • 合理使用碰撞检测方法
  • 及时释放不再使用的资源