如何解决基础 Node2D 中不存在的函数 apply_impulse
为什么当我将它运行到我的应用程序时已关闭并写入它 - 基础 Node2D 中不存在函数 apply_impulse。我看到 Godot 的文档,我发现它是方法,你的父母是 RigidBidy2D,但我通过视频做了这个代码,他使用 KinematicBody2D 并且没关系
extends KinematicBody2D
var movespeed = 500
var bulletspeed = 2000
var bullet = preload("res://Bullet.tscn")
func _ready():
pass
func _physics_process(delta):
var motion = Vector2()
if Input.is_action_pressed('up'):
motion.y -= 1
if Input.is_action_pressed('down'):
motion.y += 1
if Input.is_action_pressed('right'):
motion.x += 1
if Input.is_action_pressed('left'):
motion.x -= 1
motion = motion.normalized()
motion = move_and_slide(motion * movespeed)
look_at(get_global_mouse_position())
if Input.is_action_just_pressed('LMB'):
fire()
func fire():
var bullet_instance = bullet.instance()
bullet_instance.position = get_global_position()
bullet_instance.rotation_degrees = rotation_degrees
bullet_instance.apply_impulse(Vector2(),Vector2(bulletspeed,0).rotated(rotation))
get_tree().get_root().call_deferred("add_child",bullet_instance)
解决方法
如您所见,apply_impulse
存在于 RigidBody
(或 RigidBody2D
)中。
您提供的代码使用 apply_impulse
,此处:
bullet_instance.apply_impulse(Vector2(),Vector2(bulletspeed,0).rotated(rotation))
如果可行,则意味着 bullet_instance
必须是 RigidBody
(或 RigidBody2D
)。让我们看看你在哪里定义 bullet_instance
:
var bullet_instance = bullet.instance()
这意味着 bullet_instance
是您称为 PackedScene
的 bullet
的实例。嗯,那个场景一定是RigidBody
(或RigidBody2D
)。让我们看看你在哪里定义 bullet
:
var bullet = preload("res://Bullet.tscn")
因此,"res://Bullet.tscn"
必须是 RigidBody
(或 RigidBody2D
)。更准确地说,该场景的根节点必须是 RigidBody
(或 RigidBody2D
)。
另一方面,如果这条线(或其他类似的线)不起作用:
bullet_instance.apply_impulse(Vector2(),0).rotated(rotation))
并且您收到错误“在基础 Node2D 中不存在函数‘apply_impulse’”,这意味着您在 apply_impulse
上调用 Node2D
而不是 RigidBody
(或 {{ 1}}).
在这种情况下,这意味着 RigidBody2D
是 bullet_instance
但不是 Node2D
(或 RigidBody
)的实例。然后与之前相同的过程将引导我们到 RigidBody2D
的根节点是 "res://Bullet.tscn"
但不是 Node2D
(或 RigidBody
)的实例。
因此,请仔细检查 RigidBody2D
。根节点的类型必须是 "res://Bullet.tscn"
(或 RigidBody
),RigidBody2D
才能处理它。
明确地说,如果您像这样调用 apply_impulse
:
apply_impuse
或者像这样:
apply_impulse(Vector2(),0).rotated(rotation))
然后您在具有写入脚本的节点上调用它(在本例中为 self.apply_impulse(Vector2(),0).rotated(rotation))
,没有 KinematicBody2D
,因此不起作用)。
重申一下,当您编写 apply_impulse
时,您是在该 object.function(...)
上调用 function
。如果您编写 object
,那么您将在具有您编写该脚本的脚本的对象上调用 self.function(...)
。如果您只写 function
,则与 function(...)
相同。
为了以防万一,我还要提一下,如果您使用 self.function(...)
,上述内容也适用。例如,$
将在名为“object”的子节点上调用 $object.function(...)
。
为了使该代码起作用,您调用该函数的对象必须具有它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。