如何解决使用 move_and_slide 移动实例化玩家
我可能是想太多了,或者以完全错误的方式去做。基本上我想在我评论过的实例化播放器(aPlayer)上使用 move_and_slide,#MOVE。此脚本附加到我的 Tilemap 实例化场景 Level_Test 上。
为这篇文章精简了屏幕截图中的代码,因为它目前不相关且不起作用。
extends TileMap
onready var aPlayer = preload("res://Scenes/Player.tscn").instance()
var cSpawn1 = Vector2.ZERO
func _ready() -> void:
aPlayer.position = cSpawn1
add_child(aPlayer)
func _physics_process(delta) -> void:
if Input.is_action_just_released("iPlayerInteract"):
_Interact()
else:
var vInputDirection = Vector2(Input.get_action_strength("iPlayerRight") - Input.get_action_strength("iPlayerLeft"),Input.get_action_strength("iPlayerDown") - Input.get_action_strength("iPlayerUp"))
if vInputDirection != Vector2.ZERO:
_Move(aPlayer,vInputDirection)
func _Interact():
pass
func _Move(vSelf,vDirection):
#MOVE
pass
解决方法
截图中的 player.tscn 场景结构如下:
Player (Node2d)
└ Body (KinematicBody2D)
├ Camera (Camera2D)
├ Collision (CollisionShape2D)
└ Sprite (Sprite)
这是在这里实例化的:
onready var aPlayer = preload("res://Scenes/Player.tscn").instance()
这将 aPlayer
设置为实例化场景的根节点,即 Node2D
。
因此你传递给 _Move
(_Move(aPlayer,vInputDirection)
) 的是一个 Node2D
,它没有 move_and_slide
,因此调用 move_and_slide
结果错误。
相反,move_and_slide
存在于 KinematicBody
(3D) 和 KinematicBody2D
中。
简单而优雅的解决方案是让 KinematicBoyd2D
(Body
) 成为场景的根。 在“场景”面板上二次单击时,上下文菜单中有一个“使场景根”,这将执行此操作。
或者,您也可以使用 get_node
进入场景,例如:
vSelf.get_node("Body").move_and_slide(...)
或者例如:
onready var aPlayer = preload("res://Scenes/Player.tscn").instance().get_node("Body")
附录:如果您考虑一下,还有另一种方法。您可以将脚本添加到根节点 (Player
) 并在那里声明您想要的任何函数,包括但不限于委托给 move_and_slide
(KinematicBody2D
).
我还应该指出,Body
将移动 move_and_slide
,但不会移动其父项。因此,KinematicBody2D
节点上的 position
属性将不再是 Player
的位置。而且,如果您将 KinematicBody2D
设为根,则可以避免所有麻烦。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。