字符 Class 选择

Character Class Selection

所以我目前正在开发 2D RPG,尝试自学,同时尽可能多地寻求他人的帮助。

这个 post 的目的是角色 Class 选择和可能的精灵生成以及基于指定选择的特定玩家。

我目前有一个基本的菜单屏幕、一个角色选择屏幕和一个基本的世界场景,它们将用作游戏的第一个 level/area。我的玩家场景与世界场景完全分开,因为我可以将玩家场景内嵌到多个世界场景中。

有没有办法制作一个 class 选择场景,当玩家开始新游戏时,我可以用某种方式编码玩家选择的角色 class 来设置特定的玩家统计数据在游戏中,而不是仅仅强迫玩家只扮演一个角色 class?

例如; class 选择场景可以选择战士、弓箭手、法师等。 如果默认统计信息类似于:

var health = 0
var melee_dmg = 0
var ranged_dmg = 0
var splash_dmg = 0
var range = 0
var defence = 0
var speed = 0

我是否可以使用类似于此的代码来根据选择的 class 设置值?

func _CharSelect()
    if Warrior:
        var health = 5
        var melee_dmg = 5
        var ranged_dmg = 0
        var splash_dmg = 0
        var range = 2
        var defence = 5
        var speed = 2
    if Archer:
        var health = 3
        var melee_dmg = 0
        var ranged_dmg = 5
        var splash_dmg = 0
        var range = 10
        var defence = 2
        var speed = 5
    if Mage:
        var health = 2
        var melee_dmg = 0
        var ranged_dmg = 0
        var splash_dmg = 5
        var range = 5
        var defence = 2
        var speed = 5

如果有任何提示、技巧或想法可以简化此过程或使事情顺利进行,我们将不胜感激。

你有场景,你可以实例化它们,并将它们添加到其他场景中。

给定资源路径(以 "res://" 开头的 String,参见 Data Paths), you can use either load, preload, ResourceLoader.load or ResourceLoader.load_interactive (see Background Loading and Instancing scenes) to get a PackedScene. Once you have a PackedScene you can call on it instance on it, which will give you a reference to the root node of the instanced scene. And then you just add it to the current scene tree with add_child

重申一下,您从资源路径开始,它是 String。然后你加载它,它给你一个 PackedScene。然后你实例化它,它给你一个 Node,然后你可以用 add_child.

将它添加到场景树中

当然,如果您可以使用 add_child 添加它,您也可以使用 remove_child 将其删除。关于这一点,如果您删除不 free 节点的 Node,也不会断开其信号。 queue_free 会做这一切。您可能还对 Node.is_inside_treeObject.is_queued_for_deletionis_instance_valid 感兴趣,但我跑题了。

这意味着您可以删除 Node 然后将其添加到其他地方。


您还需要了解自动加载(单例)。

您可以从项目设置 -> 自动加载选项卡中设置自动加载。自动加载可以是脚本或场景。自动加载对象将可从您设置的游戏的全局变量中获得。当场景改变时它会保留。因此,如果您需要一些信息始终可用,即使场景发生变化,您也可以将其放在那里……

你在想我在想什么吗?存储玩家在自动加载中选择的角色。


My player scene is a completely separate from the world scene

很好。

as I can just inherent the player scene into multiple world scenes.

我不太清楚你的意思。无论如何,像上面描述的那样做实例。

Is there a way to make a character selection scene

你做了一个角色select离子场景,正确。

that will be used when the player starts a new game

所以,当玩家 select 新游戏时,它会把他们带到角色 selection 场景(可以是实际的场景变化,也可以是你实例它在有菜单的场景中)。

that I can somehow code the player selected character to spawn in the game

实现此目的的一种方法是为每个角色设置一个场景,您将记住选择了哪个场景。您绝对可以加载角色场景以在角色 selection 场景中显示它们,并且只需将 selected 的场景保留在自动加载中。或者您可以只保留资源路径(同样是 String)。 或者它可以是统计数据和纹理,或者您喜欢将其切片。

你可能在自动加载中有一个例程,负责改变场景并将玩家角色从一个场景移动到另一个场景(你可以有占位符来知道放置玩家角色的位置,例如 Position2D).您可以在需要更改场景的任何地方调用它(而不是调用 change_scene/change_scene_to)。

当你这样做的时候,把你需要保存的任何其他信息(例如健康、生命、弹药、库存)存储在那里,然后......猜猜你可以把代码放在哪里保存而且加载播放器的进度会太……没错,自动加载。


附录:您可以创建自定义资源类型。

创建一个脚本并让它从资源扩展。然后添加您需要在此处定义角色的所有属性 (export var)。

然后您可以创建资源(通过二次单击和 select“新建资源...”打开文件系统面板的上下文菜单)。 Godot 会问你资源的类型是什么,你选择你创建的那个。然后你可以在 Inspector 面板中编辑它的属性。

作为资源,您可以使用 loadpreloadResourceLoader.loadResourceLoader.load_interactive 加载它。 就像现场一样。那是因为场景是一种资源。请注意,您还可以使用 ResourceSaver.save (note: if you want to save scene see PackedScene.pack and be aware of owner).

来节省资源

顺便说一句,使用这样的资源是创建(例如)RPG 项目的好主意。您可能需要成百上千种不同的物品。 如果它们仅在数据上不同,则为每个创建一个 class 是不值得的,也不是一个好的设计。

然后您可以将 属性 (export var) 设置为您想要的资源……警告:您将无法导出自定义资源类型的变量,只是Resource。使用 setter 对其进行过滤(使用 setget). See also the proposal Add first-class custom resource support(您可以找到一些解决方法)。

可以使用具有资源的阵列进行简单的清点。