美文网首页
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