字符 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_tree
、Object.is_queued_for_deletion
和 is_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 面板中编辑它的属性。
作为资源,您可以使用 load
、preload
、ResourceLoader.load
或 ResourceLoader.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
(您可以找到一些解决方法)。
可以使用具有资源的阵列进行简单的清点。
所以我目前正在开发 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_tree
、Object.is_queued_for_deletion
和 is_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 面板中编辑它的属性。
作为资源,您可以使用 load
、preload
、ResourceLoader.load
或 ResourceLoader.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
(您可以找到一些解决方法)。
可以使用具有资源的阵列进行简单的清点。