【问题标题】:Moving an instanced player with move_and_slide使用 move_and_slide 移动实例化玩家
【发布时间】:2021-06-03 20:46:13
【问题描述】:

我可能想多了,或者以完全错误的方式去做。基本上我想在我评论过的实例播放器(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

【问题讨论】:

  • 请描述您使用这种方法遇到的问题。我猜你在_Move 上给vSelf.move_and_slide(...) 打过电话,对吧?它做了什么意想不到的事情吗?你收到错误了吗? - 编辑:如果Player.tscn(的根节点)不是运动体,我认为这可能是一个错误。对于一些意想不到的事情,也许你在那个场景中有一些其他的代码会导致冲突。
  • 添加了播放器场景的图像。 vSelf.move_and_slide(etc) 报告“在基本 Node2d 中不存在函数...

标签: godot gdscript


【解决方案1】:

截图中的 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) 作为场景的根。 在第二次单击“场景”面板时,上下文菜单中有一个“Make Scene Root”,它将执行此操作。

您也可以使用get_node 进入场景,例如:

vSelf.get_node("Body").move_and_slide(...)

或者例如:

onready var aPlayer = preload("res://Scenes/Player.tscn").instance().get_node("Body")

附录:如果您考虑一下,还有另一种方法。您可以将脚本添加到根节点 (Player) 并在那里声明您想要的任何函数,包括但不限于委托给 KinematicBody2D (Body) 的 move_and_slide

我还应该指出move_and_slide 将移动KinematicBody2D,但不会移动它的父级。所以Player 节点上的position 属性将不再是KinematicBody2D 的位置。而且,如果您将KinematicBody2D 设置为根目录,就可以避免所有麻烦。

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多