Game1硬币收集 - 第3部分 主场景 - Godot引擎游戏开发项目实践

第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()

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352