【问题标题】:Godot 3.3.2 - Changing child variables from the parent without them being resetGodot 3.3.2 - 从父级更改子变量而不重置它们
【发布时间】:2021-06-04 23:38:03
【问题描述】:

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

船舶点火代码:

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,但我不确定如何解决这个问题。谢谢。

【问题讨论】:

    标签: godot gdscript


    【解决方案1】:

    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)
    

    我会给出几种解决方法:

    • 如果您希望每次设置angle 时都更新direction,您可以使用setget 创建一个设置器。像这样:

      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))
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2012-09-13
      • 2016-03-27
      • 2018-08-24
      • 1970-01-01
      • 2017-10-09
      • 2022-08-04
      相关资源
      最近更新 更多