游戏展示
游戏开发
游戏开发是复杂的,涉及到各种各样的知识和技能。为了创造一款现代游戏,你需要大量的基础技术才能创造出真正的游戏。想象一下,在你开始编程之前,你必须建造自己的电脑,编写自己的操作系统。如果你真的需要从头开始并创造你所需要的一切,游戏开发将会非常类似于此。
此外,每个游戏都有一些共同的需求。例如,不管游戏是什么,它都需要在屏幕上绘制东西。如果要做这些的代码已经写好了,那么重用它比为每个游戏重新创建它更有意义。这就是游戏框架和引擎的用武之地。
游戏框架
是一组带有辅助代码的库,帮助构建游戏的基本部分。它不一定提供所有的部分,而且您可能仍然需要编写大量的代码来将所有的部分联系在一起。因此,构建一个游戏需要从其他工具中导入内容,比如那些用于创建动画或3D模型的工具。
使用 游戏引擎
可以让开发者专注于构建他们的游戏,而不是创建所有需要的底层框架。对于小型或独立开发者来说,这可能意味着在一年而不是三年的开发后发行游戏,甚至是从未发行过游戏。
以下是游戏引擎提供的一些主要功能:
渲染(2D和3D)
: 渲染是在玩家的屏幕上显示游戏的过程。一个好的渲染管道必须考虑到现代 GPU 的支持,高分辨率的显示,以及像灯光、透视和视口这样的效果,同时保持一个非常高的帧速率。物理
: 虽然这是一个非常普遍的需求,但构建一个健壮而准确的物理引擎是一项艰巨的任务。大多数游戏都需要某种碰撞检测和响应系统,许多游戏都需要物理模拟,但很少有开发者愿意承担编写这样的游戏的任务,特别是如果他们曾经尝试过这样做的话。平台支持
: 在今天的市场中,大多数开发者都希望能够在多个平台上发布他们的游戏,例如主机,手机,PC 和/或网络。游戏引擎提供了一个统一的导出过程,可以在多个平台上发布,而不需要重写游戏代码或支持多个版本。通用开发环境
: 通过使用相同的统一界面制作多个游戏,你不必每次开始一个新项目时都重新学习一个新的工作流程。”
此外,还会有一些工具来帮助你实现一些功能,比如联网、简化处理图像和声音、动画、调试、关卡创建等等。通常,游戏引擎将包括从其他工具(如用于创建动画或 3D模型的工具)导入内容的能力。
使用游戏引擎可以让开发者专注于构建他们的游戏,而不是创建所有的底层内容。
框架需要使它工作。对于小型或独立开发者来说,这可能意味着在一年而不是三年的开发后发行游戏,甚至是从未发行过游戏。
现在市场上有很多流行的游戏引擎,例如 Unity, Unreal Engine, GameMaker Studio
等等。需要注意的一个重要事实是,大多数流行的游戏引擎都是商业产品。他们可能需要或不需要任何财务投资来开始,但如果你的游戏赚钱,他们将需要一些许可和/或版税。无论您选择哪种引擎,您都需要仔细阅读用户协议,并确保您了解您是什么以及不允许您使用该引擎,以及您可能要承担的隐藏成本(如果有的话)。
另一方面,也有一些非商业性和开源的引擎,比如 Godot
游戏引擎。
Godot
Godot 是一个功能齐全的现代游戏引擎,提供了上一节和更多内容中描述的所有功能。它也是完全免费和开源的,在非常宽松的 MIT
许可下发布。这意味着你的游戏没有费用,没有隐藏成本,也没有版税。你使用 Godot 所创造的一切都是属于你自己的,这与许多需要持续合同关系的商业游戏引擎不同。对于许多开发人员来说,这非常有吸引力。
如果您不熟悉开源、社区驱动开发的概念,那么您可能会觉得奇怪。然而,就像 Linux 内核、Firefox 浏览器和许多其他非常著名的软件一样,Godot 并不是由公司作为商业产品开发的。相反,热情的开发人员组成了一个专门的社区,贡献他们的时间和专业知识来构建引擎、测试和修复 bug、生成文档等等。
作为一名游戏开发者,使用 Godot 的好处是巨大的。因为它不受商业许可的限制,所以你可以完全控制游戏的发行方式和发行地点。许多商业游戏引擎都限制了你可以制作的项目类型,或者需要更昂贵的许可证才能在某些类别(如赌博)中制作游戏。
Godot 的开源特性也意味着它具有商业游戏引擎所不具备的透明度。例如,如果您发现某个特定的引擎特性不能完全满足您的需求,您可以自由地修改 引擎本身并添加您需要的新特性,不需要任何权限。这在调试大型项目时也非常有用,因为您可以完全访问引擎的内部工作。
Node
节点是在 Godot 中创建游戏的基本构建块。 节点是可以代表各种专用游戏功能的对象。 给定类型的节点可能会显示图形,播放动画或表示对象的 3D 模型。 该节点还包含属性的集合,允许您自定义其行为。 您添加到项目中的哪些节点取决于所需的功能。 这是一个模块化系统,旨在为您提供构建游戏对象的灵活性。
在您的项目中,您添加的节点被组织成树状结构。 在树中,将节点添加为其他节点的子代。 一个特定的节点可以有任意数量的子节点,但只能有一个父节点。 将一组节点收集到树中时,它称为 scene (场景)
,该树称为 scenes(场景树)
:
Coin Dash (金币冲冲冲)
Project Setup
- Project menu > Project Settings
- Display
- Window
- Size
- Width:
480
- Height:
720
- Width:
- Size
- Stretch
- Mode:
2d
- Aspect:
keep
- Mode:
- Window
- Rendering
- Quality
- 2d
- Use Pixel Snap:
On
- Use Pixel Snap:
- 2d
- Quality
- Display
Player Scene
- Scene
- Area2D:
Player
¬ selectable
- AnimatedSprite
- CollisionShape2D
- Area2D:
- Inspector
- AnimatedSprite
- Frames:
New SpriteFrames
- Animations
- hurt
- idle
- run
- Speed(FPS):
- 8
- Animations
- Playing
- On:
true
- On:
- Offset
- x:
0
- y:
-5
- x:
- Scale
- x:
3
- y:
3
- x:
- Frames:
- CollisionShape2D
- Shape
- RectangleShape2D
- Shape
- AnimatedSprite
- Player
- Script:
Player.cs
- Script:
1 | using Godot; |
2 | using System; |
3 | |
4 | public class Player : Area2D |
5 | { |
6 | // How fast the player will move (pixels/sec). |
7 | [ ] |
8 | public int Speed = 400; |
9 | |
10 | // Size of the game window. |
11 | private Vector2 screenSize; |
12 | // The player's movement vector. |
13 | private Vector2 velocity; |
14 | |
15 | public override void _Ready() |
16 | { |
17 | screenSize = GetViewport().GetSize(); |
18 | } |
19 | |
20 | public override void _Process(float delta) |
21 | { |
22 | _GetInput(); |
23 | |
24 | Position += velocity * delta; |
25 | |
26 | Position = new Vector2( |
27 | x: Mathf.Clamp(Position.x, 0, screenSize.x), |
28 | y: Mathf.Clamp(Position.y, 0, screenSize.y) |
29 | ); |
30 | |
31 | var animatedSprite = GetNode<AnimatedSprite>("AnimatedSprite"); |
32 | |
33 | if (velocity.Length() > 0) |
34 | { |
35 | animatedSprite.Animation = "run"; |
36 | animatedSprite.FlipH = velocity.x < 0; |
37 | } |
38 | else |
39 | { |
40 | animatedSprite.Animation = "idle"; |
41 | } |
42 | } |
43 | |
44 | private void _GetInput() |
45 | { |
46 | velocity = new Vector2(); |
47 | |
48 | if (Input.IsActionPressed("ui_right")) |
49 | { |
50 | velocity.x += 1; |
51 | } |
52 | |
53 | if (Input.IsActionPressed("ui_left")) |
54 | { |
55 | velocity.x -= 1; |
56 | } |
57 | |
58 | if (Input.IsActionPressed("ui_down")) |
59 | { |
60 | velocity.y += 1; |
61 | } |
62 | |
63 | if (Input.IsActionPressed("ui_up")) |
64 | { |
65 | velocity.y -= 1; |
66 | } |
67 | |
68 | if (velocity.Length() > 0) |
69 | { |
70 | velocity = velocity.Normalized() * Speed; |
71 | } |
72 | } |
73 | } |
未完待续
小结
参考:
下载
游戏
Release: https://github.com/GameDevLog/GameDevLogTemplete/releases
源码
GitHub: https://github.com/GameDevLog/GameDevLogTemplete
找到游戏列表对应的 GameDevLog