MC.Steve 发表于 2026-2-13 10:21:13

【萌新初入学习Pygame】Pygame之小典籍

本帖最后由 MC.Steve 于 2026-3-7 22:00 编辑



推荐网站:pygame首页
如果想找到指定页面,请点击上方目录]
开放给所有鱼油的免费贴子
送20次,1鱼币,送完不补,限量
制作不易,鱼油们帮忙评个分呗
萌新看完才有可能看的懂那些大佬的代码

static/image/hrline/1.gif

观看须知!!!:
请务必在Python中下载好Pygmae
此文章篇幅较长,请做好心理准备
{:9_218:}
纯文字,无图
适合萌新观看
{:9_228:}
如没有下载,请输入以下指令:
pip install pygame
好的,正片马上开始!!!
本文章均为原创,无任何抄袭



当你打开编辑器,敲下 import pygame 这行代码时,你是否想过,这简单的几个字符背后,藏着一段怎样的历史?

在很多人的印象里,Pygame 只是一个用来学习 Python 图形编程的库,是新手村的“入门工具”。但如果你把时间轴拨回 2000 年,你会发现,它的诞生本身就是一场对“技术壁垒”的革命。

黑暗森林时代
那是千禧年之初,互联网刚刚萌芽。如果你想做一个电子游戏,摆在你面前的只有一条艰难的路:C 或 C++。

你需要直接操作内存,需要理解复杂的指针,需要自己编写代码去驱动显卡绘制每一个像素。那时候,游戏开发是少数精英程序员的特权,像是一座高耸入云的冰山,普通人连山脚都看不到。对于无数热爱游戏却不懂底层硬件的年轻人来说,“创造世界”只是一个遥不可及的梦。

挑战者:Pete Shinners 和他的疯狂想法
直到 Pete Shinners 的出现。

Pete 并不是什么大型游戏公司的 CEO,他更像是一个典型的“极客”——敏锐、执着,且充满理想主义色彩。当时,一门名为 Python 的新语言正在悄然兴起。它以优雅、简洁著称,读起来就像英语一样自然。

但是,当时的主流观点非常悲观:"Python 太慢了,它只能写写脚本,根本不可能用来做实时渲染的游戏。”

大多数人听到这句话就放弃了,但 Pete 不信邪。他在想:“如果我能给 Python 借一副强壮的躯体,会发生什么?”

他找到了一个强大的底层多媒体库 SDL (Simple DirectMedia Layer)。SDL 性能强劲,能直接操控硬件,但它的使用门槛极高,充满了晦涩的 C 语言接口。

Pete 做了一个大胆的决定:他要充当“翻译官”和“桥梁”。他要写一层胶水代码,将 Python 的简洁易用与 SDL 的强大性能完美融合。

2000 年 10 月:魔法诞生的时刻
2000 年 10 月,Pygame 的第一个版本正式发布了。

那一刻,魔法发生了。 原本需要几百行 C 代码才能实现的窗口显示,现在只需要几行 Python。 原本令人头秃的内存管理,现在被 Python 自动接管。 突然之间,游戏开发的门槛被夷为平地。

但 Pete Shinners 做的最伟大的一件事,并不是技术上的突破,而是他的选择。

在发布 Pygame 时,他选择了 开源(Open Source),并遵循 LGPL/GPL 协议免费提供给全世界。他没有把它锁起来卖钱,没有设置付费墙,而是把它扔进了互联网的海洋,对所有人说:

“这是给你们的工具。拿去用,拿去学,拿去创造属于你们的世界。”

薪火相传:一种精神的延续
从那天起,Pygame 不再仅仅是一个软件库,它变成了一种精神符号。

在过去的 20 多年里,它是无数程序员的“初恋”:

它是许多孩子在暑假写出的第一个会动的方块;
它是许多大学生计算机课上最兴奋的课题;
它是许多独立游戏开发者验证创意原型的秘密武器。
Pygame 也许不是性能最强的引擎,它可能无法做出画面最华丽的 3A 大作。但它的使命从来不是商业竞争,而是教育与启蒙。 它的存在,是为了保护每一个初学者的热情,是为了让“创造游戏”这件事,不再高不可攀。

入门篇
1.1了解Pygame
Pygame 是一个开源的 Python 模块集合,用于创建 2D 游戏和多媒体应用程序。它简单易学,非常适合初学者入门游戏开发,同时也被广泛用于教学、原型设计和小型项目。

Pygame 的主要功能:
图形显示:创建窗口、绘制形状、加载图片、动画渲染、
事件处理:响应键盘、鼠标、游戏手柄等用户输入
声音播放:支持加载和播放 .wav、.mp3 等音频文件
时间控制:控制帧率(FPS),实现平滑动画
碰撞检测:提供多种方式判断对象是否相撞
字体与文本:显示自定义字体的文字信息

Pygame 核心模块简介
pygame.display:控制窗口和屏幕显示
pygame.event:获取用户的输入事件(如点击关闭按钮)
pygame.draw:绘制基本图形(线、圆、矩形等)
pygame.image:加载和保存图像(支持 PNG、JPG 等格式)
pygame.mixer:播放音效和音乐
pygame.font:渲染文字
pygame.time:控制时间和帧率
pygame.sprite:管理游戏中的角色(精灵)和组
pygame.Rect:表示矩形区域,常用于位置和碰撞检测

开发小游戏的基本结构:
import pygame
pygame.init()
#设置游戏窗口
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("小游戏")
#加载资源(图片、声音、字体)
font = pygame.font.SysFont('SimHei', 32)
sound = pygame.mixer.Sound('click.wav')   # 示例音效
#游戏变量
score = 0
player_pos =
# 主循环
clock = pygame.time.Clock()
running = True
while running:
    dt = clock.tick(60) / 1000# 时间增量(秒)
    #事件处理
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            running = False
      elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                score += 1
                sound.play()
    #键盘输入检测(持续按下)
    keys = pygame.key.get_pressed()
    if keys:
      player_pos -= 200 * dt
    if keys:
      player_pos += 200 * dt
    #更新逻辑(如移动、碰撞等)
    #绘图
    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 0, 0), (*player_pos, 50, 50))
    # 显示分数(注意中文字体可能需要额外处理)
    text = font.render(f"得分: {score}", True, (255, 255, 255))
    screen.blit(text, (10, 10))
    pygame.display.flip()
pygame.quit()


注意事项:
Pygame 不适合开发大型 3D 游戏。
对中文支持有限(字体路径问题),建议使用英文或提前准备中文字体文件(如 simhei.ttf)。

1.2入门(1)
1.2.1基础知识
熟悉基本结构,能创建窗口、处理事件、绘制图形和响应输入。

核心知识点
pygame.init():初始化所有子模块
pygame.display.set_mode():创建游戏窗口
pygame.event.get():获取用户事件(如关闭窗口)
pygame.draw.*:绘制形状(矩形、圆形、线条等)
pygame.time.Clock():控制帧率(FPS)
pygame.key.get_pressed():检测按键是否被按下

基本程序结构模板:
import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
running = True

while running:
    # 事件处理
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
            running = False

    # 清屏
    screen.fill("black")

    # 绘图逻辑(例如画一个圆)
    pygame.draw.circle(screen, "red", (400, 300), 50)

    # 更新屏幕
    pygame.display.flip()

    # 控制帧率
    clock.tick(60)

pygame.quit()

1.2.2坐标系与颜色系统
坐标系(左上角为原点)
(0,0) ──→ x轴


↓ y轴
(0,0) 是左上角
向右 x 增加,向下 y 增加

颜色表示法
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# 也可以用字符串(仅限基本颜色)
screen.fill("red")
pygame.draw.circle(screen, "blue", (100, 100), 30)


1.2.3 绘图基础(pygame.draw)
draw.rect(surface, color, rect):画矩形
draw.circle(surface, color, center, radius):画圆
draw.line(surface, color, start_pos, end_pos, width):画线
draw.polygon(surface, color, points):画多边形
示例:# 画一个红色矩形
pygame.draw.rect(screen, "red", )

# 画一条蓝线
pygame.draw.line(screen, "blue", (0, 0), (800, 600), 5)


1.2.4显示文字(支持中文需指定字体路径)
例如:
# 方法一:使用系统字体(可能不支持中文)
font = pygame.font.SysFont("SimHei", 32, bold=True)# Windows 黑体

# 方法二:加载本地字体文件(更可靠)
font = pygame.font.Font("fonts/SimHei.ttf", 32)

# 创建文本表面
text_surface = font.render("得分: 100", True, (255, 255, 255))# anti-aliasing=True
screen.blit(text_surface, (10, 10))

中文乱码解决办法:

使用 .ttf 字体文件
确保文件编码为 UTF-8
不要用默认字体如 "arial" 显示中文


1.2.5.1输入事件处理
空格      K_SPACE      空格键
回车      K_RETURN      Enter 键
ESC      K_ESCAPE      退出菜单
方向键      K_LEFT, K_RIGHT, K_UP, K_DOWN      ← ↑ → ↓
字母键      K_a, K_b, ..., K_z      小写形式
数字键      K_0 ~ K_9      主键盘数字
功能键      K_F1, K_TAB, K_LSHIFT      F1、Tab、左Shift等

小技巧:可以用 pygame.key.name(event.key) 获取按键名称字符串
print(pygame.key.name(event.key))# 输出 'space', 'a', 'up' 等


1.2.5.2使用 pygame.key.get_pressed()
适用于 需要持续响应的操作,比如角色移动。

它返回一个布尔数组,表示当前哪些键正处于“被按下”的状态。
keys = pygame.key.get_pressed()

if keys or keys:
    player.x -= 5
if keys or keys:
    player.x += 5
if keys:
    player.y -= 5
if keys:
    player.y += 5

优点:
支持组合键(如同时按 W+A 斜向移动)
更适合高频控制(如平台跳跃)
缺点:
无法区分是第几次按下(不适合“按一下切换模式”类功能)

1.2.6精灵系统与碰撞检测
精灵系统实现:
#基础精灵类(专业OOP设计)
class GameObject(pygame.sprite.Sprite):
    """所有游戏对象的基类"""
    def __init__(self, image_path, position):
      super().__init__()
      self.image = pygame.image.load(image_path).convert_alpha()
      self.rect = self.image.get_rect(center=position)
      self.mask = pygame.mask.from_surface(self.image)# 像素级碰撞掩码
   
    def update(self, delta_time):
      """子类应重写此方法实现具体行为"""
      pass

#玩家类(继承与多态应用)
class Player(GameObject):
    def __init__(self, position):
      super().__init__('assets/player.png', position)
      self.speed = 300# 像素/秒(专业单位设定)
      self.health = 100
   
    def update(self, delta_time):
      # 获取键盘状态(帧率无关移动)
      keys = pygame.key.get_pressed()
      dx, dy = 0, 0
      
      if keys: dx -= 1
      if keys: dx += 1
      if keys: dy -= 1
      if keys: dy += 1
      
      # 对角线移动归一化(专业数学处理)
      if dx != 0 and dy != 0:
            magnitude = (dx**2 + dy**2)**0.5
            dx, dy = dx/magnitude, dy/magnitude
      
      # 应用速度与时间增量
      self.rect.x += dx * self.speed * delta_time
      self.rect.y += dy * self.speed * delta_time
      
      # 边界限制(专业实践)
      screen_rect = pygame.display.get_surface().get_rect()
      self.rect.clamp_ip(screen_rect)

#碰撞检测系统(专业实现)
def check_collisions(player, enemies):
    #矩形碰撞(快速筛选)
    collisions = pygame.sprite.spritecollide(
      player, enemies, False,
      collided=pygame.sprite.collide_rect
    )
   
    # 像素级碰撞(精确检测)
    precise_collisions = [
      enemy for enemy in collisions
      if pygame.sprite.collide_mask(player, enemy)
    ]
   
    return precise_collisions


知识点:
精灵组管理:pygame.sprite.Group实现高效对象管理
碰撞检测优化:
第一级:边界框检测(collide_rect)
第二级:圆形粗略检测(collide_circle)
第三级:像素级精确检测(collide_mask)
帧率无关运动:速度 × delta_time 实现跨设备一致体验
向量归一化:解决对角线移动速度过快问题


进阶篇
2.1.1游戏状态管理

状态机实现

class GameState:
    """游戏状态管理基类"""
    def handle_events(self, events):
      pass
   
    def update(self, delta_time):
      pass
   
    def render(self, screen):
      pass

class MainMenuState(GameState):
    def __init__(self):
      self.font = pygame.font.SysFont(None, 48)
      self.options = ["开始游戏", "设置", "退出"]
      self.selected = 0
   
    def handle_events(self, events):
      for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                  self.selected = (self.selected - 1) % len(self.options)
                elif event.key == pygame.K_DOWN:
                  self.selected = (self.selected + 1) % len(self.options)
                elif event.key == pygame.K_RETURN:
                  if self.selected == 0:
                        return GameState.PLAYING
                  elif self.selected == 2:
                        return GameState.QUIT
   
    def render(self, screen):
      screen.fill((0, 0, 0))
      for i, option in enumerate(self.options):
            color = (255, 255, 0) if i == self.selected else (255, 255, 255)
            text = self.font.render(option, True, color)
            screen.blit(text, (400, 200 + i * 60))

# 游戏主循环中的状态管理
current_state = MainMenuState()
while running:
    events = pygame.event.get()
    for event in events:
      if event.type == pygame.QUIT:
            running = False
   
    # 状态转换
    next_state = current_state.handle_events(events)
    if next_state == GameState.QUIT:
      running = False
    elif next_state:
      current_state = next_state
   
    # 状态更新与渲染
    current_state.update(delta_time)
    current_state.render(screen)
   
    pygame.display.flip()
    delta_time = clock.tick(FPS) / 1000.0

优势:

关注点分离:每个状态独立处理自身逻辑
可扩展性:轻松添加新状态(如暂停、设置菜单)
避免巨型条件语句:符合软件工程最佳实践
状态堆栈支持:实现嵌套状态(如"游戏内暂停"→"主菜单")

2.2 高级渲染技术

渲染技巧
def create_gradient_surface(width, height, start_color, end_color):
    """创建垂直渐变背景(专业图形技术)"""
    surface = pygame.Surface((width, height), pygame.SRCALPHA)
    for y in range(height):
      # 线性插值计算颜色
      r = int(start_color + (end_color - start_color) * y / height)
      g = int(start_color + (end_color - start_color) * y / height)
      b = int(start_color + (end_color - start_color) * y / height)
      pygame.draw.line(surface, (r, g, b), (0, y), (width, y))
    return surface

def render_with_shadows(screen, game_objects):
    """带阴影效果的渲染(专业视觉效果)"""
    # 创建离屏表面用于阴影渲染
    shadow_surface = pygame.Surface(screen.get_size(), pygame.SRCALPHA)
   
    # 绘制阴影(模糊效果)
    for obj in game_objects:
      shadow_rect = obj.rect.inflate(10, 10)
      pygame.draw.rect(shadow_surface, (0, 0, 0, 100), shadow_rect, border_radius=5)
   
    # 应用高斯模糊(简化版)
    for _ in range(3):# 模拟多次模糊
      shadow_surface.blit(shadow_surface, (1, 0))
      shadow_surface.blit(shadow_surface, (-1, 0))
      shadow_surface.blit(shadow_surface, (0, 1))
      shadow_surface.blit(shadow_surface, (0, -1))
   
    # 4. 绘制阴影和游戏对象
    screen.blit(shadow_surface, (0, 0))
    for obj in game_objects:
      screen.blit(obj.image, obj.rect)


图形学概念:

离屏渲染:先绘制到隐藏表面,再合成到主屏幕
线性插值:实现平滑颜色过渡
高斯模糊:通过多次偏移叠加模拟真实模糊效果
Alpha混合:利用透明度通道实现半透明效果



开发实践篇
3.1 项目组织最佳实践
my_game/
├── main.py                # 主程序入口
├── game/
│   ├── __init__.py      # 包声明
│   ├── game.py            # 游戏主逻辑
│   ├── states/            # 游戏状态模块
│   │   ├── __init__.py
│   │   ├── menu.py
│   │   ├── playing.py
│   │   └── game_over.py
│   ├── entities/          # 游戏实体
│   │   ├── __init__.py
│   │   ├── player.py
│   │   ├── enemy.py
│   │   └── bullet.py
│   └── utils/             # 工具函数
│       ├── __init__.py
│       ├── resources.py   # 资源管理
│       └── collision.py   # 碰撞检测工具
├── assets/                # 资源目录
│   ├── images/            # 图像资源
│   ├── sounds/            # 音频资源
│   └── fonts/             # 字体资源
└── requirements.txt       # 依赖声明


3.2 专业开发流程
需求分析:明确游戏核心机制和功能
架构设计:确定模块划分和交互方式
原型开发:快速实现核心玩法
迭代完善:逐步添加新功能和优化
测试验证:确保功能正确性和性能
文档编写:记录设计决策和使用说明


辅助篇(选看)
4.1常见问题
游戏卡顿      未使用delta_time      实现帧率无关运动
内存增长      未清理不再需要的对象      使用kill()方法,定期清理
碰撞检测慢      未优化碰撞检测                实现分层碰撞检测策略
资源加载慢      运行时加载资源                预加载资源到内存

#性能分析工具
import cProfile
cProfile.run('main_game_loop()', 'profile_stats')

#可视化调试辅助
def draw_debug_info(screen, player, clock):
    """绘制调试信息(专业开发实践)"""
    font = pygame.font.SysFont(None, 24)
   
    # FPS显示
    fps_text = font.render(f"FPS: {clock.get_fps():.1f}", True, (255, 255, 0))
    screen.blit(fps_text, (10, 10))
   
    # 玩家状态
    pos_text = font.render(f"Position: ({player.rect.x:.1f}, {player.rect.y:.1f})", True, (255, 255, 0))
    screen.blit(pos_text, (10, 40))
   
    # 碰撞框可视化(专业调试技巧)
    pygame.draw.rect(screen, (255, 0, 0), player.rect, 1)




冷知识~~~

5.1功能隐藏技(你可能不知道它能做这些)
5.1.2自带“示例代码库”

很多人安装完 Pygame 就忘了它自带了一个完整的示例库。你可以直接在命令行运行官方写好的小游戏,并查看源码学习。

# 查看所有可用示例
python -m pygame.examples

# 直接运行某个示例(比如外星人入侵)
python -m pygame.examples.aliens
冷点:这些示例代码通常就在你的 Python 安装目录下的 site-packages/pygame/examples 里,是学习架构的绝佳素材

5.2.2自定义事件(不用每帧轮询)
除了键盘鼠标事件,你可以创建定时器事件,让 Pygame 自动往事件队列里塞东西。适合做“每隔 1 秒生成一个敌人”这种逻辑,不用在循环里写 if time % 60 == 0

# 定义一个用户事件 ID
ADD_ENEMY_EVENT = pygame.USEREVENT + 1

# 设置每 1000 毫秒触发一次
pygame.time.set_timer(ADD_ENEMY_EVENT, 1000)

# 在主循环里监听
for event in pygame.event.get():
    if event.type == ADD_ENEMY_EVENT:
      spawn_enemy()


5.2.3像素级碰撞检测(Mask 模块)
rect.colliderect 是矩形碰撞,但如果你的人物是 L 形或圆形,矩形碰撞会不准。Pygame 内置了 pygame.mask 模块,基于像素透明度进行精确碰撞。
mask1 = pygame.mask.from_surface(image1)
mask2 = pygame.mask.from_surface(image2)
offset = (x2 - x1, y2 - y1)
if mask1.overlap(mask2, offset):
    print("像素级碰撞!")

冷点:虽然精度高,但计算量大,通常只用于子弹命中或关键道具判定

5.2.4音频合成(sndarray 模块)
Pygame 不仅能播放 mp3/wav,还能结合 numpy 直接操作声波数组,实现程序化生成音乐或音效(类似合成器)
import pygame.sndarray as sndarray
import numpy as np

# 生成一个 440Hz 的正弦波声音
sample_rate = 44100
duration = 1.0
t = np.linspace(0, duration, int(sample_rate * duration))
wave = np.sin(2 * np.pi * 440 * t)
sound_array = (wave * 32767).astype(np.int16)
sound = sndarray.make_sound(sound_array)
sound.play()


5.2.5 更好的字体渲染(freetype 模块)
标准的 pygame.font 渲染中文有时会有问题,且不支持高级排版。Pygame 内置了 pygame.freetype,渲染质量更高,支持旋转、样式修改
import pygame.freetype as freetype
font = freetype.Font("msyh.ttc", 24)# 微软雅黑
font.render_to(screen, (10, 10), "你好", fgcolor=(255, 255, 255))


5.3性能黑科技(老手才知道的优化)
5.3.1 convert() 与 convert_alpha() 的区别
convert():将图片转换为当前屏幕格式,速度最快,但不支持透明通道。
convert_alpha():支持透明通道,但混合速度稍慢。
冷知识:如果你的背景图不需要透明,千万别用 convert_alpha(),否则在低端设备上帧率会掉。
5.3.2离屏Surface缓存(脏矩形技术的简化版)
如果你有一堆静态元素(如复杂的 UI 背景、地图块),不要每帧都重新 blit 几十次。
技巧:创建一个和屏幕一样大的 Surface,把静态内容画上去,然后每帧只 blit 这张大 Surface 一次。

# 预渲染背景
static_bg = pygame.Surface(screen.get_size())
static_bg.blit(map_image, (0, 0))
static_bg.blit(ui_bar, (0, 500))

# 主循环
screen.blit(static_bg, (0, 0))# 一次操作代替了十几次
screen.blit(player, player_rect) # 只画动态物体
5.3.3pygame.event.pump() 的重要性
如果你的游戏逻辑在某些帧不需要处理事件(比如加载画面),你必须调用 pygame.event.pump()。
原因:Pygame 需要与操作系统消息队列保持通信。如果不泵送事件,Windows 可能会认为你的程序“未响应”并变白屏。

5.3.4硬件表面(HWSURFACE)已e~~~
在旧教程中,你会看到 pygame.HWSURFACE 标志。
冷知识:在现代操作系统(Win10/11, macOS, Linux)和 Pygame 2.0+ 中,这个标志基本被忽略或不再推荐使用。所有 Surface 现在默认都在内存中管理,SDL 底层会自动处理硬件加速,手动设置反而可能出错。

5.3.5锁定 Surface 直接操作像素
对于粒子系统或特效,Surface.set_at() 太慢了。你可以“锁定”Surface,直接获取像素数组进行修改(类似操作显存)。
pixels_array = pygame.PixelArray(screen)
pixels_array = (255, 0, 0) # 直接写像素
del pixels_array # 必须手动删除以解锁
警告:锁定期间无法对该 Surface 进行 blit 操作,用完必须解锁

5.4历史与生态冷知识
5.4.1Pygame 2.0 等了 11 年
Pygame 1.9 版本发布于 2009 年,而 Pygame 2.0 直到 2020 年才发布。中间长达 11 年的停滞期导致很多新人转向了 Unity 或 Godot。2.0 版本主要修复了 Python 3 兼容性和一些底层 Bug。

5.4.2Pygame CE(社区版)的崛起
最新冷知识(2023-2024):由于原作者 Pete Shinners 逐渐隐退,社区 fork 了一个版本叫 Pygame Community Edition (pygame-ce)。 现在 pip install pygame 实际上安装的就是社区维护的版本。它的更新频率比官方原版快得多,修复了大量 Bug 并增加了新功能(如控制器热插拔)。

5.4.3许可证陷阱(LGPL)
Pygame 使用 LGPL 许可证。
冷知识:这意味着你可以免费用 Pygame 开发商业游戏并闭源销售。但是,如果你修改了 Pygame 库本身的源码,你必须开源你对库的修改。单纯开发游戏逻辑不受影响。

5.4.4 它其实是个“包装器”
Pygame 本身不画图,它只是 SDL (Simple DirectMedia Layer) 的 Python 包装器。
冷知识:如果你遇到底层图形 Bug,有时候去查 SDL 的文档或问题列表,能找到根源。

5.4.5支持手柄热插拔(Pygame 2.0+)
在旧版本中,游戏启动后插入手柄是识别不到的。Pygame 2.0+ 支持 JOYDEVICEADDED 事件,允许在游戏中动态识别新插入的控制器。

5.5一个极易踩坑的“冷”Bug
问题:为什么我的 pygame.key.get_pressed() 在长按时会有停顿?
现象:按住右键移动,角色会“走 - 停 - 走 - 停”。
原因:这是操作系统的键盘重复延迟设置,不是 Pygame 的 Bug。
解决:永远不要用 KEYDOWN 事件做连续移动,必须用 key.get_pressed()。如果用了 get_pressed() 还有停顿,检查是否在循环里加了不必要的 time.sleep() 或耗时操作。

总结:
Pygame 虽然看似简单,但深耕下去会发现它提供了很多底层控制能力(如像素操作、音频合成、事件队列控制)。掌握这些冷知识,能让你的游戏运行更流畅,代码更优雅


结语
建议:
从模仿开始:分析优秀游戏代码,理解设计思路
小步快跑:每次只添加一个功能,确保稳定
文档先行:设计前先写注释,明确目标
持续学习:关注Pygame社区,了解最新实践

拓展学习路径
深入Pygame:研究源码,理解底层机制
游戏设计理论:学习游戏平衡性、关卡设计
其他引擎:探索Unity、Godot等专业引擎
计算机图形学:理解渲染管线、着色器

完结~~~~~~

你们的评分就是我最大的支持(累晕了{:10_261:} {:5_99:} {:9_231:} {:13_459:} )
最后一页~~~~
你们的鱼币也是喔~~~~


呵呵呵,这一页啥也没~~~~不!!!   有~~~~~
有用:
1. 32位cpu和64位cpu的区别
2. 助于学习的软件:Xmind
业余:
1.sweezycursors网站

日出之前 发表于 2026-2-13 17:42:54

沙发沙发{:10_256:}

MC.Steve 发表于 2026-2-13 17:45:48

本帖最后由 MC.Steve 于 2026-2-14 18:58 编辑

日出之前 发表于 2026-2-13 17:42
沙发沙发

送了哈

某一个“天” 发表于 2026-2-17 14:49:44

支持

cjjJasonchen 发表于 2026-2-20 21:28:13

非常好!

57696935 发表于 2026-2-20 23:09:02

无条件支持

FC_ayo 发表于 2026-2-22 10:08:41

顶顶顶!!!{:10_256:}

MC.Steve 发表于 2026-2-22 19:48:37

本帖最后由 MC.Steve 于 2026-2-22 20:00 编辑

接下来的煤油了窝
分页有点问题,大家将就着看

1997xx 发表于 2026-2-24 13:05:39

66666666666666666666

1997xx 发表于 2026-2-24 13:06:19

6666666666666666666666666666666666666

MC.Steve 发表于 2026-2-24 14:35:04

1997xx 发表于 2026-2-24 13:06
6666666666666666666666666666666666666

禁止水贴

不二如是 发表于 2026-2-26 17:15:59

真棒!

MC.Steve 发表于 2026-2-27 12:48:47

不二如是 发表于 2026-2-26 17:15
真棒!

嗯,我蒸蚌

gkxawy 发表于 2026-2-28 17:24:35

鱼币

MC.Steve 发表于 2026-2-28 18:01:14

gkxawy 发表于 2026-2-28 17:24
鱼币

你怎么能这样呢?{:10_243:}

2813830470 发表于 2026-3-1 19:58:46

{:10_269:}

iHobe 发表于 2026-3-2 08:03:43

萌新来看看了~

MC.Steve 发表于 2026-3-2 10:07:00

iHobe 发表于 2026-3-2 08:03
萌新来看看了~

欢迎萌新哦{:5_95:}

甲友 发表于 6 天前

{:5_110:}

iHobe 发表于 4 天前

收藏,打卡!
页: [1] 2
查看完整版本: 【萌新初入学习Pygame】Pygame之小典籍