第3部分 主场景
Main scene(主场景)将游戏的所有部分联系在一起。它将管理玩家,硬币,计时器和游戏的其他部分。
节点设置
创建一个新场景并添加一个名为Main的节点。要将Player添加到场景中,请单击Instance(实例)按钮并选择已保存的Player.tscn:
实例现在,添加以下节点作为Main的子节点,命名如下:
- TextureRect(命名为Background) - 用于背景图像
- Node(名为CoinContainer) - 保存所有硬币
- Position2D(名为PlayerStart) - 标记Player的起始位置
- Timer(名为GameTimer) - 跟踪时间限制
确保Background是第一个子节点。节点按所示顺序绘制,因此在这种情况下背景将位于Player后面。通过将grass.png图像从assets文件夹拖到Texture属性,将图像添加到Background节点。将Stretch Mode更改为Tile,然后单击Layout | Full Rect可将帧大小调整为屏幕大小,如以下屏幕截图所示:
布局|全铺将PlayerStart节点的Position属性设置为(240、350)。
您的场景布局应如下所示:
主场景节点树主脚本
将脚本添加到Main节点(使用Empty模板)并添加以下变量:
extends Node
export (PackedScene) var Coin
export (int) var playtime
var level
var score
var time_left
var screensize
var playing = false
单击Main时,Coin和Playtime属性现在将显示在Inspector中。从FileSystem面板拖动Coin.tscn并将其放在Coin属性中。将Playtime属性设置为30(这是游戏将持续的时间)。其余的变量将在稍后的代码中使用。
文档
PackedScene
初始化
接下来,添加_ready()
函数:
func _ready():
randomize()
screensize = get_viewport().get_visible_rect().size
$Player.screensize = screensize
$Player.hide()
文档
_ready()
函数在节点及其所有子节点进入活动场景时调用。注意:_ready()
并不是构造器;构造器是_init()
。
randomize()
Viewport
在GDScript中,您可以使用$来按名称引用特定节点。这允许您查找屏幕的大小并将其分配给Player的screensize变量。 hide()使玩家开始不可见(你会在游戏实际开始时让它们出现)。
在$表示法中,节点名称是相对于运行脚本的节点。例如,$Node1/Node2将引用Node1的子节点Node2,Node1本身是当前运行脚本的子节点。 Godot的自动完成功能会在您键入时建议树中的节点名称。请注意,如果节点的名称包含空格,则必须在其周围加上引号,例如$"My Node"
提示
如果希望每次运行场景时“随机”数字序列不同,则必须使用randomize()。从技术上讲,这为随机数生成器选择随机种子。
开始新游戏
接下来,new_game()
函数将初始化新游戏的所有内容:
func new_game():
playing = true
level = 1
score = 0
time_left = playtime
$Player.start($PlayerStart.position)
$Player.show()
$GameTimer.start()
spawn_coins()
除了将变量设置为其起始值之外,此函数还调用Player的start()
函数以确保它移动到正确的起始位置。游戏计时器启动,将计算游戏中的剩余时间。
您还需要一个能够根据当前关卡创建多个硬币的功能
func spawn_coins():
for i in range(4 + level):
var c = Coin.instance()
$CoinContainer.add_child(c)
c.screensize = screensize
c.position = Vector2(rand_range(0, screensize.x),
rand_range(0, screensize.y))
文档
add_child()
在此函数中,您将创建Coin对象的多个实例(这次是在代码中,而不是单击Instance a Scene按钮),并将其添加为CoinContainer的子项。每当您实例化一个新节点时,都必须使用add_child()
将其添加到树中。最后,你选择一个随机位置让硬币出现。你将在每个关卡的开头调用此函数,每次产生更多的硬币。
最终,当玩家点击开始按钮时,你会想要调用new_game()
。现在,要测试一切是否正常,请在_ready()
函数的末尾添加new_game()
,然后单击右上方运行按钮Play Custom Scene(Control+shift+F5)。当系统提示您选择主场景时,请选择Main.tscn。现在,无论何时运行项目,都会启动主场景。
此时,您应该会在屏幕上看到您的Player和五个Coin。当玩家碰触硬币时,硬币会消失。
检查剩余硬币
主脚本需要检测玩家是否已经拿起所有硬币。由于硬币都是CoinCointainer的子项,因此您可以在此节点上使用get_child_count()
来查找剩余的硬币数量。将它放在_process()
函数中,以便每帧都检查它:
func _process(delta):
if playing and $CoinContainer.get_child_count() == 0:
level += 1
time_left += 5
spawn_coins()
如果没有剩余硬币,则玩家前进到下一关卡。
网友评论