提交 cecebd6a 编写于 作者: 幻灰龙's avatar 幻灰龙

Merge branch 'master' into 'master'

Godot版Flappy Bird教程及习题 Version 1

See merge request !2
{
"node_id": "game-a7419380ac974efcbc5fb1d347933d04",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{ {
"type": "code_options", "type": "code_options",
"author": "hello_tute", "author": "hello_tute",
"source": "flappybird_godot.md", "source": "learn.md",
"notebook_enable": false, "notebook_enable": false,
"exercise_id": "c821a21bb363442eab64f0aea124f3bd" "exercise_id": "c821a21bb363442eab64f0aea124f3bd"
} }
\ No newline at end of file
# 用Godot Engine开发一个FlappyBird小游戏
请先阅读本节讲义[《出道即巅峰,先做个盈利千万的小项目》](https://blog.csdn.net/ttm2d/article/details/104516098)
著名的网红游戏Flappy Bird出自以下哪位游戏制作人之手?
## 答案
[越南]阮哈东
## 选项
### A
[中国]开发游戏的老王
### B
[日本]宫本茂
### C
[美国]Cory Barlog
\ No newline at end of file
{
"node_id": "game-ddebb8f9c33e499ebf70e857f5e57244",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "a5bdb0b8efce48ce8e225fd2996702e3"
}
\ No newline at end of file
# 无尽水管子滚滚来(一)
请先阅读本节讲义⬇
[《无尽水管子滚滚来(一)》](https://orzgame.blog.csdn.net/article/details/104730795)
在构造一对水管子的时候,为什么要按照下图所示的结构构造?
![水管子的场景结构](https://img-blog.csdnimg.cn/20200318183720887.png#pic_center)
## 答案
让上下水管以及中间的得分区都作为Pipe节点的子节点,这样只要控制Pipe节点的移动其它节点也就可以同步移动了
## 选项
### A
并没有特别的原因,仅仅是为了好看
### B
这是Godot引擎的要求,必须要这样做
### C
这样比较好看
{
"node_id": "game-4609ca19969744c3af113a1c273f6aa3",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "3324da1bb1d64bdd837ee14a6a4c168b"
}
\ No newline at end of file
# 无尽水管子滚滚来(二)
请先阅读本节讲义⬇
[《无尽水管子滚滚来(二)》](https://orzgame.blog.csdn.net/article/details/104919515)
我想构造一个取值范围在(-500.0,0.0)之间的随机小数,可以如何使用 randf函数?
## 答案
randf()*(-500)
## 选项
### A
randf(500.0)
### B
randf(-500.0)
### C
randf(-1.0)*500.0
{
"node_id": "game-54ed259122714ae3b146ff5d5e3e9b9d",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "daf9fa18992d4cbebc83f65dc5ed906d"
}
\ No newline at end of file
# [知识点]用自动加载(AutoLoad)实现单例模式(Singleton Pattern)
请先阅读本节讲义⬇
[《用自动加载(AutoLoad)实现单例模式(Singleton Pattern)》](https://orzgame.blog.csdn.net/article/details/105040614)
使用Godot Engine 3.x版本的GDScript语言开发项目时,如何实现设计模式中的单例模式?
## 答案
用自动加载(AutoLoad)可以实现单例模式
## 选项
### A
和其它面向对象语言完全一样的实现方法
### B
Godot引擎根本无法实现单例模式
### C
使用信号机制实现单例模式
{
"node_id": "game-9820c7f433f94ad4a61bfebce0e86afb",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "1b38b5fcaaee476a9e82cd9b60ee1b5c"
}
\ No newline at end of file
# 来点MUSIC(音效系统)
请先阅读本节讲义⬇
[《来点MUSIC(音效系统)》](https://blog.csdn.net/ttm2d/article/details/104990374)
下列节点中负责播放音效的节点是?
## 答案
AudioStreamPlayer
## 选项
### A
AnimationTree
### B
AnimationPlayer
### C
AutoLoad
{
"node_id": "game-fcc7df8805b04aa7a3885c23b6de0ee5",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "830f0b494d6448a8ac3228c09ef1b0da"
}
\ No newline at end of file
# [知识点]本地数据存取的帮助类(加密非加密)
请先阅读本节讲义⬇
[《本地数据存取的帮助类(加密非加密)》](https://blog.csdn.net/ttm2d/article/details/103575079)
在游戏开发中对于本地玩家的数据采取加密的方式存储最主要原因是什么?
## 答案
防止玩家作弊
## 选项
### A
减少数据体积
### B
保护玩家隐私
### C
提高玩家数据的读取速度
{
"node_id": "game-ce44239c61d3458b90a37dc93822ebe4",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "e8910b2c32c0461693a1051b0fb9dc57"
}
\ No newline at end of file
# 心里有数(计分系统)
请先阅读本节讲义⬇
[《心里有数(计分系统)》](https://orzgame.blog.csdn.net/article/details/105103786)
在Windows系统中`Use Custom User Dir`对应的文件夹在哪里?
## 答案
"用户名/AppData/Roaming/应用名"
## 选项
### A
游戏资源目录下
### B
C盘根目录下
### C
没有特定对应的文件夹
{
"node_id": "game-abe61f57685e4d5b948f58b4403890bc",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "47bc92c64e5e486fb849147d509d310e"
}
\ No newline at end of file
# [知识点]如何使用外部字体和Label节点制作一个计时器
请先阅读本节讲义⬇
[《如何使用外部字体和Label节点制作一个计时器》](https://orzgame.blog.csdn.net/article/details/105073585)
在Godot中想使用自定义字体,需要新建的资源类型是?
## 答案
`DynamicFont`
## 选项
### A
Label
### B
Control
### C
Node2D
{
"node_id": "game-e4484e530d7544e1bd2203e39705b51c",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "7e055dcee08f4bf28216e61ce67d3abb"
}
\ No newline at end of file
# 让数据说话(显示分数)
请先阅读本节讲义⬇
[《让数据说话(显示分数)》](https://orzgame.blog.csdn.net/article/details/105123050)
在FlappyBird游戏中,当小鸟顺利通过一对水管子之间的空隙,则视为得1分,那么触发得分的逻辑应该放在哪个函数中?
## 答案
`_on_body_exited`
## 选项
### A
`_ready`
### B
`_process`
### C
`_on_body_enter`
{
"node_id": "game-c9d47730e8154a7f8e09f2f0faf3846e",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "275b608abf8d4774ad570bc0e3985062"
}
\ No newline at end of file
# [知识点]两行代码实现观察者模式(Observer Pattern),就问你服不服?
请先阅读本节讲义⬇
[《两行代码实现观察者模式(Observer Pattern),就问你服不服?》](https://orzgame.blog.csdn.net/article/details/105120001)
在Godot引擎中最直接且最快速实现观察者模式的机制是什么?
## 答案
Godot的组(Group)机制
## 选项
### A
Godot的AutoLoad机制
### B
Godot的信号(Signal)机制
### C
Godot节点树
{
"node_id": "game-4f8ddd4a0c8c4800b0153cf5e0a97731",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "2702090fbaab43ed9ff517fbea4150f3"
}
\ No newline at end of file
# 天下没有不OVER的GAME
请先阅读本节讲义⬇
[《天下没有不OVER的GAME(上)》](https://orzgame.blog.csdn.net/article/details/105148296)
[《天下没有不OVER的GAME(下)》](https://orzgame.blog.csdn.net/article/details/105156048)
游戏结束以后自动弹出显示分数的看板UI,下列哪个节点最适合用于在UI上显示图片
## 答案
`TextureRect`
## 选项
### A
`AnimationPlayer`
### B
`Label`
### C
`Sprite`
{
"node_id": "game-564e4ed11c3c4dd881b09fb29eaf0833",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "350edfb5ba6f4e67a0874accbc12f04d"
}
\ No newline at end of file
# 新建Godot项目
请先阅读本节讲义[《新建Godot项目》](https://blog.csdn.net/ttm2d/article/details/104478190)
本教程中使用的Godot Engine版本是什么?
## 答案
Godot Engine 3.x
## 选项
### A
Godot Engine 1.x
### B
Godot Engine 2.x
### C
Godot Engine 4.x
\ No newline at end of file
{
"node_id": "game-bb9e4ae20c1c4af38af69636d09793ee",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "d0091914c6bb43bf9f15a2e9beed5979"
}
\ No newline at end of file
# [知识点]用Call Method Track(方法回调轨道)实现动画回调
请先阅读本节讲义⬇
[《用Call Method Track(方法回调轨道)实现动画回调》](https://orzgame.blog.csdn.net/article/details/105230844)
我们想让某段动画播放到特定帧时自动触发(调用)一个函数,下列那种机制是最佳方案?
## 答案
Call Method Track(方法回调轨道)
## 选项
### A
手动计算时间并使用Timer延时触发
### B
使用Group机制
### C
没有开箱即用的方法,只能纯代码实现
{
"node_id": "game-1eb635fc0e784edbac7264db4d12a7ff",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "5e328793a87c43c485eb3152a019b0a0"
}
\ No newline at end of file
# 大不了从头再来(新局启动)
请先阅读本节讲义⬇
[《大不了从头再来(新局启动)》](https://orzgame.blog.csdn.net/article/details/105161381)
将一个节点通过其父节点的`remove_child`从场景树中移除后,为什么还要调用其自身的`queue_free`函数?
## 答案
`remove_child`只是将它从场景树上移除,但其内存资源并未释放,所以要调用`queue_free`将其放到待释放队列中,由引擎释放其内存资源
## 选项
### A
没有必要调用
### B
调用其自身的`queue_free`以后就可以重复使用了
### C
可以给其赋值为null来代替`queue_free`
{
"node_id": "game-6baed610886c4dfab45c04c6d1a4c74d",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "30a0ab7ff4cd4e699bffdf4a88ec537d"
}
\ No newline at end of file
# 番外篇:罗永浩都抖音了,要不咱们也抖一抖?(屏幕震动)
请先阅读本节讲义⬇
[《Godot Engine:屏幕振动效果的实现》](https://blog.csdn.net/ttm2d/article/details/103809442)
[《番外篇:罗永浩都抖音了,要不咱们也抖一抖?(屏幕震动)》](https://orzgame.blog.csdn.net/article/details/105262867)
下列选项中那些效果可以提高游戏的“打击感”?
## 答案
包括(但不限于)其他全部选项
## 选项
### A
屏幕震动
### B
音效
### C
一些粒子特效
{
"node_id": "game-e2f919f34b524b43b50dc61ec09f9989",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "a025720311664644b941c4523f644f8f"
}
\ No newline at end of file
# 3.Godot界面介绍
请先阅读本节讲义[《Godot界面介绍》](https://blog.csdn.net/ttm2d/article/details/104479758)
在引擎编辑器中运行(测试)Godot游戏的快捷键是?
## 答案
`F5`
## 选项
### A
`P`
### B
`Alt + P`
### C
`Enter`
{
"node_id": "game-204ac394144042d8aad5e5e90079a0e8",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "4eab4cb819514d7baf3c4c239a4c5cc3"
}
\ No newline at end of file
# 3.Hello World
请先阅读本节讲义[《Hello World》](https://blog.csdn.net/ttm2d/article/details/104534235)
使用Godot引擎制作2D游戏时,负责表现一个2D角色的常用节点是?
## 答案
Sprite节点
## 选项
### A
Spatial节点
### B
Node2D节点
### C
Node节点
{
"node_id": "game-7837069511e14a209a18d8f21f7c1cdb",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "e9f852892d9f4182a57b0b319fda381f"
}
\ No newline at end of file
# 4.坠落吧,小鸟
请先阅读本节讲义[《坠落吧,小鸟》](https://blog.csdn.net/ttm2d/article/details/104542478)
使用Godot引擎制作2D游戏时,负责描述一个2D角色物理轮廓(碰撞时的“外壳”)的节点是?
## 答案
CollisionShape2D节点
## 选项
### A
Rigidbody2D节点
### B
Node2D节点
### C
Sprite节点
{
"node_id": "game-92d76053805145d591d22d3c9679eef4",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "55c977ff0bdd44848ac845e51b8cd6a8"
}
\ No newline at end of file
# 5.在哪坠落就在哪飞起来
请先阅读本节讲义[《FlappyBird:在哪坠落就在哪飞起来》](https://orzgame.blog.csdn.net/article/details/104606205)
下列Node节点的生命周期函数中,哪个函数在每一帧都会被调用?
## 答案
_process(delta)
## 选项
### A
_ready()
### B
_init()
### C
_enter_tree()
{
"node_id": "game-cd00e66431484f1087cb6b779a7bfdbb",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "33d770d84c7f45ae96cab88c0b711bb6"
}
\ No newline at end of file
# 6.无限循环的地面
请先阅读本节讲义⬇
无限循环的地面使用了三种完全不同的方法实现:
- [**Godot青年版**](https://orzgame.blog.csdn.net/article/details/104709354)主要是想展示一下方便好用的 AnimationPlayer,并且此方法一行代码也不用写;
- [**普通青年版**](https://orzgame.blog.csdn.net/article/details/104717644)是比较常规的方法,用 Godot的脚本语言实现(初级阶段最推荐的方法);
- [**文艺青年版**](https://orzgame.blog.csdn.net/article/details/104703946)使用了自定义Shader实现,无需新建多余的节点,并且方便复用,是实现该效果的最佳方法。不过该方法需要着色器知识,目前略有超纲;
使用Godot青年版实现无限循环地面的时候在_process方法中判断`offset.x <= -530.0`的意义是?
## 答案
当地面向左移动到-530.0个像素位置时,将其位置归零
## 选项
### A
地面移动速度不能大于530.0像素/帧
### B
地面移动速度不能小于-530.0像素/帧
### C
地面移动速度不能大于200.0像素/帧
{
"node_id": "game-b0e23a8f1f624ff1b4e0d214deb76942",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "ee8733182987449b91608cb7a6ea8e96"
}
\ No newline at end of file
# 5种碰撞体以及RigidBody的4种模式
请先阅读本节讲义⬇
[《5种碰撞体以及RigidBody的4种模式》](https://orzgame.blog.csdn.net/article/details/104822436)
使用实例:[《碰撞和碰撞检测的简单实例(RigidBody2D与Area2D碰撞)》](https://orzgame.blog.csdn.net/article/details/104824983)
使用实例:[《碰撞和碰撞检测的简单实例(RigidBody2D与StaticBody2D碰撞)》](https://orzgame.blog.csdn.net/article/details/104804192)
在Godot引擎构造的游戏世界中,如果想构造一个能够挡住子弹但自身不会移动的“墙”,应该将“墙”的RigidBody设置为如下哪种模式?
## 答案
`StaticBody`
## 选项
### A
`KinematicBody`
### B
`RigidBody`
### C
`Area`
{
"node_id": "game-d519f3f21c60416aa6f1adc345fd11ee",
"keywords": [],
"children": [],
"export": [
"learn.json"
],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
\ No newline at end of file
{
"type": "code_options",
"author": "hello_tute",
"source": "learn.md",
"notebook_enable": false,
"exercise_id": "b389662531f143f18259638378976bdd"
}
\ No newline at end of file
# [知识点]Timer节点使用范例
请先阅读本节讲义⬇
[《Timer节点使用范例》](https://orzgame.blog.csdn.net/article/details/104905971)
如果我想让一个Timer节点每隔0.5秒触发一次,那么应该将该节点的哪个属性设置为0.5?
## 答案
`Wait Time`
## 选项
### A
`One Shot`
### B
`Autostart`
### C
`Process Mode`
{
"node_id": "game-3763515eddfe4932887fd39c826f317e",
"keywords": [],
"children": [
{
"游戏开发入门": {
"keywords": [
"游戏开发",
"入门"
],
"children": [],
"keywords_must": [
"起源"
],
"keywords_forbid": [],
"node_id": "game-8b79c45606e74fd48485bcdca73de39e"
}
}
],
"export": [
"flappybird_godot.json"
],
"keywords_must": [],
"keywords_forbid": []
}
\ No newline at end of file
# 一个简单的 Python 小游戏
我们可以使用 python 的 pygame 快速建立一个弹球游戏,环境依赖
* 安装 python
* 使用 python 的包管理程序,安装依赖的 pygame 包:`pip install pygame`
编写你的第一游戏代码`game.py`,代码如下:
```python
import sys
import pygame
# 初始化
pygame.init()
# 游戏对话框大小
size = width, height = 320, 240
# 小球移动速度
speed = [2, 2]
# 黑色背景
black = 0, 0, 0
# 创建游戏屏幕
screen = pygame.display.set_mode(size)
# 加载小球 gif
ball = pygame.image.load("ball.gif")
# 获取游戏图片的矩形框
ballrect = ball.get_rect()
# 游戏循环
while 1:
# 判断是否退出
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 按 speed 速度,计算移动小球后的矩形框
ballrect = ballrect.move(speed)
# 更新速度(大小和方向)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
# 绘制黑色背景
screen.fill(black)
# 绘制小球
screen.blit(ball, ballrect)
# 使用双缓存机制刷新屏幕
pygame.display.flip()
```
其中小球 gif 资源如下:
![](./test/ball.gif)
使用命令`python game.py`启动游戏,游戏启动后的画面如下
![](./test/ball_game.gif)
以下关于上述游戏代码说法错误的是?
## 答案
编写游戏只能使用 pygame
## 选项
### A
一个游戏程序,一般有一个死循环,反复绘制游戏画面
### B
许多游戏的渲染,都会采用双缓存机制,在背后的帧里面做渲染,再一次性刷新到前台帧
### C
在游戏循环里,可以检测各种交互事件,并响应事件,从而完成游戏玩家和游戏的互动,例如:退出游戏
\ No newline at end of file
import sys
import pygame
pygame.init()
size = width, height = 320, 240
speed = [2, 2]
black = 0, 0, 0
screen = pygame.display.set_mode(size)
ball = pygame.image.load("ball.gif")
ballrect = ball.get_rect()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
screen.fill(black)
screen.blit(ball, ballrect)
pygame.display.flip()
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
"keywords": [], "keywords": [],
"children": [ "children": [
{ {
"简易游戏": { "Godot Engine入门": {
"node_id": "game-8693485194904570b938d427a3f7e562", "node_id": "game-8693485194904570b938d427a3f7e562",
"keywords": [ "keywords": [
"Godot Engine", "Godot Engine",
...@@ -19,24 +19,219 @@ ...@@ -19,24 +19,219 @@
"children": [ "children": [
{ {
"用Godot Engine开发一个FlappyBird小游戏": { "用Godot Engine开发一个FlappyBird小游戏": {
"node_id": "game-3763515eddfe4932887fd39c826f317e", "node_id": "game-a7419380ac974efcbc5fb1d347933d04",
"keywords": [], "keywords": [],
"children": [ "children": [],
{ "keywords_must": [],
"游戏开发入门": { "keywords_forbid": [],
"keywords": [ "group": 0
"游戏开发", }
"入门" },
], {
"children": [], "新建Godot项目": {
"keywords_must": [ "node_id": "game-564e4ed11c3c4dd881b09fb29eaf0833",
"起源" "keywords": [],
], "children": [],
"keywords_forbid": [], "keywords_must": [],
"node_id": "game-8b79c45606e74fd48485bcdca73de39e" "keywords_forbid": [],
} "group": 0
} }
], },
{
"Godot界面介绍": {
"node_id": "game-e2f919f34b524b43b50dc61ec09f9989",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"Hello World": {
"node_id": "game-204ac394144042d8aad5e5e90079a0e8",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"坠落吧,小鸟": {
"node_id": "game-7837069511e14a209a18d8f21f7c1cdb",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"在哪坠落就在哪飞起来": {
"node_id": "game-92d76053805145d591d22d3c9679eef4",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"无限循环的地面": {
"node_id": "game-cd00e66431484f1087cb6b779a7bfdbb",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"[知识点]5种碰撞体以及RigidBody的4种模式": {
"node_id": "game-b0e23a8f1f624ff1b4e0d214deb76942",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"[知识点]Timer节点使用范例": {
"node_id": "game-d519f3f21c60416aa6f1adc345fd11ee",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"无尽水管子滚滚来(一)": {
"node_id": "game-ddebb8f9c33e499ebf70e857f5e57244",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"无尽水管子滚滚来(二)": {
"node_id": "game-4609ca19969744c3af113a1c273f6aa3",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"[知识点]用自动加载(AutoLoad)实现单例模式(Singleton Pattern)": {
"node_id": "game-54ed259122714ae3b146ff5d5e3e9b9d",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"来点MUSIC(音效系统)": {
"node_id": "game-9820c7f433f94ad4a61bfebce0e86afb",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"[知识点]本地数据存取的帮助类(加密非加密)": {
"node_id": "game-fcc7df8805b04aa7a3885c23b6de0ee5",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"心里有数(计分系统)": {
"node_id": "game-ce44239c61d3458b90a37dc93822ebe4",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"[知识点]如何使用外部字体和Label节点制作一个计时器": {
"node_id": "game-abe61f57685e4d5b948f58b4403890bc",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"让数据说话(显示分数)": {
"node_id": "game-e4484e530d7544e1bd2203e39705b51c",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"[知识点]两行代码实现观察者模式(Observer Pattern),就问你服不服?": {
"node_id": "game-c9d47730e8154a7f8e09f2f0faf3846e",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"天下没有不OVER的GAME": {
"node_id": "game-4f8ddd4a0c8c4800b0153cf5e0a97731",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"[知识点]用Call Method Track(方法回调轨道)实现动画回调": {
"node_id": "game-bb9e4ae20c1c4af38af69636d09793ee",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"大不了从头再来(新局启动)": {
"node_id": "game-1eb635fc0e784edbac7264db4d12a7ff",
"keywords": [],
"children": [],
"keywords_must": [],
"keywords_forbid": [],
"group": 0
}
},
{
"番外篇:罗永浩都抖音了,要不咱们也抖一抖?(屏幕震动)": {
"node_id": "game-6baed610886c4dfab45c04c6d1a4c74d",
"keywords": [],
"children": [],
"keywords_must": [], "keywords_must": [],
"keywords_forbid": [], "keywords_forbid": [],
"group": 0 "group": 0
......
pip install -r requirements.txt
pause
\ No newline at end of file
python main.py
pause
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册