首页 > 解决方案 > 字符类选择

问题描述

所以我目前正在做一个 2D 角色扮演游戏,尝试自学,同时尽可能多地寻求其他人的帮助。

这篇文章的目的是角色类选择和可能的精灵生成和基于指定选择的特定玩家。

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

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

例如; 职业选择场景会选择战士、弓箭手、法师等。如果默认统计数据类似于:

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

我可能有类似的代码来根据选择的类设置值吗?

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

任何提示、技巧或想法都将不胜感激,以使此过程更容易或使事情顺利进行。

标签: godotgdscript

解决方案


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

给定一个资源路径(以String开头的a "res://",请参阅数据路径) ,您可以使用load、或(请参阅后台加载实例化场景)来获取. 一旦你有了一个,你就可以在它上面调用它,它会给你一个对实例化场景的根节点的引用。然后你只需将它添加到当前场景树中。preloadResourceLoader.loadResourceLoader.load_interactivePackedScenePackedSceneinstanceadd_child

重申一下,您从一个资源路径开始,即String. 然后你加载它,它会给你一个PackedScene. 然后你实例化它,它给你一个Node,然后你可以将它添加到场景树中add_child


当然,如果你可以用 来添加它add_child,你也可以用 来删除它 remove_child。在那一点上,如果您删除了该节点,也Node不会free断开其信号。queue_free会做这一切。您可能也对和感兴趣Node.is_inside_tree,但我离题了。Object.is_queued_for_deletionis_instance_valid

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


您需要了解的其他内容是自动加载(单例)。

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

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


我的玩家场景与世界场景完全不同

好的。

因为我可以将玩家场景固有到多个世界场景中。

我不确定你是什么意思。无论如何,像上面描述的那样做实例。

有没有办法制作角色选择场景

你做了一个角色选择场景,正确的。

将在玩家开始新游戏时使用

因此,当玩家选择新游戏时,它会将他们带到角色选择场景(这可能是场景的实际变化,也可能是您在具有菜单的场景中实例化它)。

我可以以某种方式对玩家选择的角色进行编码以在游戏中生成

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

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

当你在它的时候,把你需要保留的任何其他信息(例如健康、生命、弹药、库存)存储在那里,然后……猜猜你可以把代码放在哪里来保存和加载玩家进度……那是对的,自动加载。


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

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

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

作为资源,您可以使用、load或加载它。就像现场一样。那是因为场景是一种资源。关于这一点,您还可以使用(注意:如果您想保存场景,请参阅并注意)来保存资源。preloadResourceLoader.loadResourceLoader.load_interactiveResourceSaver.savePackedScene.packowner

顺便说一句,使用这样的资源来创建 - 例如 - RPG 项目是一个好主意。您可能需要数百甚至数千种不同类型的物品。如果它们仅在数据上有所不同,那么为每个类创建一个类是不值得的,也不是一个好的设计。

然后,您可以将属性 ( export var) 设置为您想要的资源... 警告:您将无法导出自定义资源类型的变量,只是Resource. 使用 setter 过滤它(使用setget)。另请参阅提案Add first-class custom resource support(您可以在那里找到一些解决方法)。

可以使用具有资源的阵列制作简单的清单。


推荐阅读