【问题标题】:Nonexisten function apply_impulse in base Node2D基础 Node2D 中不存在函数 apply_impulse
【发布时间】:2021-07-11 01:53:46
【问题描述】:

为什么当我将它运行到我的应用程序时已关闭并编写它 - 基础 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)

【问题讨论】:

  • 能否请您显示一下错误堆栈?

标签: documentation game-development godot gdscript


【解决方案1】:

正如您所发现的,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 是您称为bulletPackedScene 的一个实例。好吧,那个场景一定是RigidBody(或RigidBody2D)。让我们看看你在哪里定义bullet

var bullet = preload("res://Bullet.tscn") 

因此,"res://Bullet.tscn" 必须是 RigidBody(或 RigidBody2D)。更准确地说,该场景的根节点必须是RigidBody(或RigidBody2D)。


另一方面,如果这条线(或其他类似的线)不起作用:

bullet_instance.apply_impulse(Vector2(), Vector2(bulletspeed, 0).rotated(rotation))

并且您收到错误“在基本 Node2D 中不存在函数 'apply_impulse'”,这意味着您在 Node2D 上调用 apply_impulse 而不是 RigidBody(或 RigidBody2D)。

在这种情况下,这意味着bullet_instanceNode2D 的一个实例,但不是RigidBody(或RigidBody2D)。然后与之前相同的过程将引导我们到达"res://Bullet.tscn" 的根节点,它是Node2D 但不是RigidBody(或RigidBody2D)的实例。


因此,请仔细检查"res://Bullet.tscn"。根节点的类型必须是RigidBody(或RigidBody2D),apply_impulse 才能对其进行处理。


需要明确的是,如果您像这样调用apply_impuse

apply_impulse(Vector2(), Vector2(bulletspeed, 0).rotated(rotation))

或者像这样:

self.apply_impulse(Vector2(), Vector2(bulletspeed, 0).rotated(rotation))

然后,您在具有编写脚本的节点上调用它(在这种情况下是 KinematicBody2D,它没有 apply_impulse,因此这不起作用)。


重申一下,当你写object.function(...) 时,你是在调用function 那个object。如果您写self.function(...),那么您正在调用function,该对象具有您编写该脚本的脚本。如果你只写function(...),那就和self.function(...)一样。

以防万一,我还要提一下,如果您使用$,上述内容也适用。例如,$object.function(...) 将在名为“object”的子节点上调用 function

要使该代码正常工作,您调用该函数的对象必须具有它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多