Godot 3.3.2 - 在不重置父变量的情况下更改父变量

Godot 3.3.2 - Changing child variables from the parent without them being reset

我是 godot 的新手,我正在尝试制作一个小行星类型的游戏。但是我无法让我的 space 飞船开火。 问题是我无法让子弹朝船的方向开火。我在 ship 中设置了一个 'angle' 变量,并在实例化后将其分配给 bullet,但我不确定如何在 bullet 中使用它。无论船的角度如何,子弹都会向右移动。

船舶点火代码:

func _process(_delta):
if Input.is_action_just_pressed("action_fire"):
    var Bullet_Instance = Bullet.instance()
    Bullet_Instance.angle = angle
    owner.add_child(Bullet_Instance)

项目符号代码:

extends KinematicBody2D

var angle = 0

var direction = Vector2(cos(angle), sin(angle))

func _physics_process(_delta):
    move_and_slide(direction*500)

我很确定角度变量在发货代码中设置后在子弹代码中被重置为 0,但我不确定如何解决这个问题。谢谢

angle 变量没有被重置。当您设置 angle.

时,direction 变量未更新

场景实例化时,这里:

var Bullet_Instance = Bullet.instance()

这些变量获得它们的值:

var angle = 0

var direction = Vector2(cos(angle), sin(angle))

然后你设置angle,这里:

Bullet_Instance.angle = angle

但是您不再使用 angle,而是使用 direction:

func _physics_process(_delta):
    move_and_slide(direction*500)

我会给出一些解决方法:

  • 如果你希望direction每次设置angle时更新,你可以用setget做一个setter。像这样:

    var angle = 0 setget set_angle
    
    func set_angle(new_value) -> void:
        angle = new_value
        direction = Vector2(cos(angle), sin(angle))
    
  • 您可以直接从其他脚本编写 direction,根本没有 angle 变量。 事实上,你可以设置一个velocity,并且每次都省去500的乘积。

  • 您可以在 _physics_process 上计算矢量(无论如何您已经在进行矢量缩放操作):

    func _physics_process(_delta):
        move_and_slide(Vector2(cos(angle)*500, sin(angle)*500))
    

可能有更多方法可以解决这个问题。由你决定。