三个项目的目录都是同一个形状:入口、配置、场景、角色、数据、素材。 素材的许可证分五档,能不能商用、能不能改是两件事,得分开看。 换引擎要重学 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 秒实验
- 在
LICENSES里加一档'公有领域': (True, True, '随便用'),重跑第二段,看它排在哪。 - 把
CC-BY-SA的「能改」改成False,重跑第三段,看它被分到哪一组。 - 在目录那一段里加一行
tests/,重跑,看输出怎么变。
常见误区
- 「网上免费下载的就能随便用。」免费和授权是两件事。下载前先看许可证,别做完才发现。
- 「CC-BY 只要署名就行,随便改。」署名之外还要看有没有 SA、NC 这些后缀。 后缀决定商用和开源义务。
- 「示例代码肯定没版权问题。」示例代码也有许可证。抄之前看一眼仓库根目录的 LICENSE 文件。
自测三问(点开对答案)
1. CC-BY-NC 的素材,商业项目能用吗? —— 不能。NC 是 Non-Commercial,只能非商业用途。 但它是可以改的——**「能商用」和「能改」是两个独立的维度。** 2. CC-BY-SA 里的 SA 是什么意思?会带来什么后果? —— SA 是 ShareAlike,相同方式共享。 你基于它做的衍生作品也必须用同样的许可证,**可能意味着你的整个游戏都得开源。** 3. 为什么本课在 Cocos2d 跑不起来的时候还要继续讲这本书? —— 因为这本书真正要教的是「状态、场景、主循环、碰撞、绘制」这五样结构,它们跟引擎无关。 **API 会过时,机制不会。**全书到这里结束。三个项目、一套骨架,剩下的就是自己动手做第四个。
- ☐ (全书完)