🎮 附录 示例代码、相关工具及网络资源
📄 一句话概括

三个项目的目录都是同一个形状:入口、配置、场景、角色、数据、素材。 素材的许可证分五档,能不能商用、能不能改是两件事,得分开看。 换引擎要重学 API,但状态、场景、循环、碰撞、绘制这五样一次都不用重学。

📝 本章和前面几章的关系

正文七章写完了,这一篇收尾:代码在哪、用什么工具、素材怎么合法地用。 教材的附录是「示例代码、相关工具及网络资源」,原书没有编号,本课按 A.1 记。 这一篇没有新概念,只有清单和判断标准。但「许可证」那一段建议认真看一遍。 许可证对照表和判断结果都是真跑出来的。

一、示例代码长什么样

附录里给的示例代码,解开之后大致是这个形状:

项目根目录
├── main.py          入口
├── config.py        所有参数
├── scenes/          场景:菜单、游戏、结算
├── actors/          角色:马里奥、敌人、道具
├── maps/            地图数据(Tiled 导出的 json)
└── assets/          图片、声音

前三章做的三个项目,目录都是这个形状。场景、角色、数据、素材,四块分开。 为什么入口要单独一个文件?因为读别人的代码是从入口读起的。 入口里应该一眼能看出「程序从哪开始、加载了什么、切到哪个场景」。

为什么参数要单独一个文件? 前面反复说过:改一个数全项目生效。写到第八个文件的时候,你就知道这一步有多值。

二、工具清单

工具 干什么 要不要装
Python 3.8+ 跑代码 必须
Pygame 第 2、3 章用它 必须
cocos2d 第 4 到 7 章用它 看你的 Python 版本
Tiled 画瓦片地图,导出 json 做第 6、7 章要
PyCharm 或 VS Code 写代码 建议
Aseprite 或 GIMP 画像素图、切图片集 自己画素材才要

cocos2d 那一行就是本课开头反复说的坑。它声明只支持 pyglet 1.x, 而 pyglet 1.5 在 Python 3.13 上导不进来。 所以这本书的第 4 到 7 章,想原样跑通,得装一个 Python 3.8 或 3.9 的旧解释器。 不值得为一个过时的库折腾环境——本课选择把机制用 Pygame 重写一遍。 Tiled 值得单独说一句:它是画地图的工具,导出的 json 就是本课第七篇讲的那张二维表。 工具变了,数据形状不变。

三、素材从哪找

去处 是什么 要注意
Kenney 成套的免费素材,像素风为主 大多 CC0,连署名都不用
OpenGameArt 社区素材站,量大 每份许可证不同,逐个看
itch.io 免费区 独立开发者放的素材包 同上看单页说明
自己画 最稳 费时间,但完全干净

同一站点里不同素材的许可证可能不一样,所以「这个站能用」不等于「这里的都能用」。 这条看着啰嗦,但它是真会出事的地方:做完一个项目准备上线,才发现某张图只能个人使用, 要么换图,要么整个项目重做美术。 最省事的办法:下载的时候就把许可证记在一个 CREDITS.txt 里。一个文件、几行字, 省掉未来的一次返工。

四、五种常见许可证

许可证 能商用 能改 要注意
CC0 能 能 基本等于放弃一切权利
CC-BY 能 能 必须署名
CC-BY-SA 能 能 署名,且衍生作品也要开源
CC-BY-NC 不能 能 只能非商业用途
仅个人使用 不能 不能 改都不行

「能商用」和「能改」是两件事,必须分开看。CC-BY-NC 就是「能改但不能商用」, 「仅个人使用」是两样都不行。 CC-BY-SA 那个 SA 是「相同方式共享」,意思是你基于它做出来的东西也得用同样的许可证。 商业项目用它,可能被要求把整个游戏开源——这一条最容易忽略。 演示把五档跑了一遍,把「能商用」「能改」两个维度都打了出来。 做项目之前查一次,比事后补救便宜得多。

五、署名怎么写

CC-BY 要求署名,一般写在三个地方:游戏里的「关于」或「制作名单」页、源码仓库里的 CREDITS 文件、 素材目录里的 CREDITS.txt。 三处都写,成本很低。但漏了就是违约,跟「忘了」没关系。 署名的内容一般包括:作者名、素材名、来源链接、许可证名称。四样,一行一个。

顺带一句:自己画的素材不用署名, 但建议也在 CREDITS 里写一句「美术由本人制作」——别人接手的时候省得猜。

六、怎么读别人的代码

步骤 做什么
一 先跑起来,看它长什么样
二 从入口文件读起,别从最复杂的读起
三 找出「状态放哪」和「循环在哪」
四 改一个小地方,看哪里跟着变
五 再回去读那个跟着变的地方

第四步最有用。改一个数看一圈反应,比从头读一遍快十倍——因为你能立刻看出「谁依赖谁」。 这也是本课每一个 Demo 的做法:先跑一个小东西,看它输出什么,再回头读代码。 先看现象,再看实现,比反过来快。

七、这本书最后留下什么

三个项目、同一套骨架:状态、场景、主循环、碰撞、绘制。 换引擎要重学 API,但这五样一次都不用重学。 换语言也一样——Python 换成 C++ 换成 JavaScript,五样的形状不变。 这就是为什么本课在 Cocos2d 跑不起来的时候,还是把每一个机制用 Pygame 重写了一遍。API 会过时, 机制不会。

如果只记一句话,记这句:先想清楚「状态放哪、一帧做什么」,再挑引擎。反过来做的人, 最后都在给引擎打补丁。

八、动手 Demo:附录:目录、工具与许可证

先看示例代码的目录形状,再看工具清单。 然后重点看许可证:五档,「能商用」和「能改」是两个维度。 最后看怎么读别人的代码。

LICENSES = {
    'CC0':      (True,  True,  '放弃一切权利,随便用'),
    'CC-BY':    (True,  True,  '能用能改,必须署名'),
    'CC-BY-SA': (True,  True,  '能用能改,衍生作品也要开源'),
    'CC-BY-NC': (True,  False, '能用,不能商用'),
    '仅个人使用': (False, False, '改都不能改'),
}

def info(s):
    print('  ' + s)

def sec(t):
    print(); print('  ' + t); print('  ' + '-' * 68)

# ① 目录
sec('① 项目目录')
for line in ('main.py      入口', 'config.py    参数',
             'scenes/      场景', 'actors/      角色',
             'maps/        地图数据', 'assets/      素材'):
    info('  ' + line)

# ② 许可证判断
sec('② 许可证能干什么')
for name, (comm, mod, tip) in LICENSES.items():
    info('%-10s 商用 %s  改 %s  %s'
         % (name, '能' if comm else '不能', '能' if mod else '不能', tip))

# ③ 只有一种能随便用
sec('③ 筛一遍')
ok = [n for n, (c, m, _) in LICENSES.items() if c and m]
info('既能商用又能改的:%s' % '、'.join(ok))
info('只能非商业用:%s'
     % '、'.join(n for n, (c, m, _) in LICENSES.items() if c and not m))
info('两样都不行:%s'
     % '、'.join(n for n, (c, m, _) in LICENSES.items() if not c and not m))

实跑输出:

--------------------------------------------------------------------
附录:例程、工具与许可证
--------------------------------------------------------------------

  ① 示例代码长什么样
  --------------------------------------------------------------------
    项目根目录
    ├── main.py            入口
    ├── config.py          所有参数
    ├── scenes/            场景:菜单、游戏、结算
    ├── actors/            角色:马里奥、敌人、道具
    ├── maps/              地图数据(Tiled 导出的 json)
    └── assets/            图片、声音
  ! 前三章做的三个项目,目录都是这个形状。场景、角色、数据、素材,四块分开。

  ② 工具清单
  --------------------------------------------------------------------

| 工具 | 干什么 | 要不要装 |
|---|---|---|
| Python 3.8+ | 跑代码 | 必须 |
| Pygame | 书里第 2、3 章用它 | 必须 |
| cocos2d | 书里第 4~7 章用它 | 看你的 Python 版本 |
| Tiled | 画瓦片地图,导出 json | 做第 6、7 章要 |
| PyCharm / VS Code | 写代码 | 建议 |
| Aseprite / GIMP | 画像素图、切图片集 | 自己画素材才要 |

  ! cocos2d 那一行就是本课前面反复说的坑:新版 Python 上装不上,别硬扛。

  ③ 素材从哪找
  --------------------------------------------------------------------

| 去处 | 是什么 | 要注意 |
|---|---|---|
| Kenney | 成套的免费素材,像素风为主 | 大多 CC0,署名都不用 |
| OpenGameArt | 社区素材站,量大 | 每份许可证不同,逐个看 |
| itch.io 免费区 | 独立开发者放的素材包 | 同上看单页说明 |
| 自己画 | 最稳 | 费时间,但完全干净 |

  ! 同一站点里不同素材的许可证可能不一样,所以「这个站能用」不等于「这里的都能用」。

  ④ 五种常见许可证
  --------------------------------------------------------------------

| 许可证 | 能商用 | 能改 | 一句话 |
|---|---|---|---|
| CC0 | 能 | 能 | 放弃一切权利,随便用 |
| CC-BY | 能 | 能 | 能用能改,必须署名 |
| CC-BY-SA | 能 | 能 | 能用能改,必须署名,衍生作品也要开源 |
| CC-BY-NC | 能 | 不能 | 能用,不能商用 |
| 仅个人使用 | 不能 | 不能 | 改都不能改,别说商用 |

  ! 商业项目只用前三种,而且 CC-BY-SA 要小心——它可能要求你的整个游戏也开源。

  ⑤ 署名怎么写
  --------------------------------------------------------------------
  CC-BY 要求署名,一般写在三个地方:
    一、游戏里的「关于」或「制作名单」页
    二、源码仓库里的 CREDITS 文件
    三、素材目录里放一个 CREDITS.txt
  ! 三处都写,成本很低。但漏了就是违约,跟「忘了」没关系。

  ⑥ 怎么读别人的代码
  --------------------------------------------------------------------

| 步骤 | 做什么 |
|---|---|
| 一 | 先跑起来,看它长什么样 |
| 二 | 从入口文件读起,别从最复杂的读起 |
| 三 | 找出「状态放哪」和「循环在哪」 |
| 四 | 改一个小地方,看哪里跟着变 |
| 五 | 再回去读那个跟着变的地方 |

  ! 第四步最有用。改一个数看一圈反应,比从头读一遍快十倍。

  ⑦ 这本书到最后留下什么
  --------------------------------------------------------------------
  三个项目、同一套骨架:状态、场景、主循环、碰撞、绘制。
  换引擎要重学 API,但这五样一次都不用重学。
  ! 这就是为什么本课在 Cocos2d 跑不起来的时候,还是把机制一个个用 Pygame 重写了一遍。
  API 会过时,机制不会。

第一段那个目录形状,三个项目一模一样。 这不是巧合,是「场景、角色、数据、素材」四块分开的直接结果。 第二段那张表最该看的是 CC-BY-NC 和「仅个人使用」这两行: 一个能改不能商用,一个两样都不行。很多人以为「免费下载」就等于「随便用」。 第三段那个筛选是这一篇唯一有点「程序」味道的地方。用代码筛一遍比用眼睛看五张图可靠。 这段代码纯 Python 能跑。 许可证判断跟游戏引擎一点关系都没有——它更像一个「决定能不能开工」的前置检查。 最后提醒: 本课所有 Demo 都是自己生成的图和数据,没有引用任何第三方素材。所以你抄这里的代码不用管许可证。

30 秒实验

  1. 在 LICENSES 里加一档 '公有领域': (True, True, '随便用'),重跑第二段,看它排在哪。
  2. 把 CC-BY-SA 的「能改」改成 False,重跑第三段,看它被分到哪一组。
  3. 在目录那一段里加一行 tests/,重跑,看输出怎么变。

常见误区

  1. 「网上免费下载的就能随便用。」免费和授权是两件事。下载前先看许可证,别做完才发现。
  2. 「CC-BY 只要署名就行,随便改。」署名之外还要看有没有 SA、NC 这些后缀。 后缀决定商用和开源义务。
  3. 「示例代码肯定没版权问题。」示例代码也有许可证。抄之前看一眼仓库根目录的 LICENSE 文件。
自测三问(点开对答案) 1. CC-BY-NC 的素材,商业项目能用吗? —— 不能。NC 是 Non-Commercial,只能非商业用途。 但它是可以改的——**「能商用」和「能改」是两个独立的维度。** 2. CC-BY-SA 里的 SA 是什么意思?会带来什么后果? —— SA 是 ShareAlike,相同方式共享。 你基于它做的衍生作品也必须用同样的许可证,**可能意味着你的整个游戏都得开源。** 3. 为什么本课在 Cocos2d 跑不起来的时候还要继续讲这本书? —— 因为这本书真正要教的是「状态、场景、主循环、碰撞、绘制」这五样结构,它们跟引擎无关。 **API 会过时,机制不会。**

全书到这里结束。三个项目、一套骨架,剩下的就是自己动手做第四个。

相关笔记