美文网首页
Game1硬币收集 - 第3部分 主场景 - Godot引擎游戏

Game1硬币收集 - 第3部分 主场景 - Godot引擎游戏

作者: LYChao | 来源:发表于2020-09-14 11:09 被阅读0次

第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时,CoinPlaytime属性现在将显示在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的子节点Node2Node1本身是当前运行脚本的子节点。 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()

文档
get_child_count()

如果没有剩余硬币,则玩家前进到下一关卡。

相关文章

网友评论

      本文标题:Game1硬币收集 - 第3部分 主场景 - Godot引擎游戏

      本文链接:https://www.haomeiwen.com/subject/rharrqtx.html