首页 > 解决方案 > 为什么我的敌人在godot引擎启动时消失了

问题描述

我对 godot 引擎比较陌生,并且在版本 3.3.2 上遇到了关于敌人消失的问题。在编辑器中,敌人节点的位置正确。但是,当我单击播放按钮时,它们会从游戏中消失。这是我的敌人脚本:

extends KinematicBody2D

var motion = Vector2()

var Health = 100

var bullet = preload("res://Art/Bullet.png")
var explosion = load("res://Particles.tscn").instance()
var bulletSpeed = 1000

func _process(delta):


  if Health <= 0:
     queue_free()
     print(position)

func _physics_process(delta):
    var world = get_parent()
    var Player = world.get_node("Player")


    position += (Player.position - position)/40
    
    move_and_collide(motion)



func _on_Area2D_body_entered(body):

    
    Health -= 20

   body.queue_free()
   queue_free()

这是我的整个项目:https ://github.com/Ripple-Studios/Godot-Wild-Jam-36-Game-Ripple-Studios 。在这种情况下有什么问题?

谢谢,

标签: godot

解决方案


通过查看问题中的代码:

  • 如果动作出现问题,它可能会使敌人移动到意想不到的位置:
    • 除非您从其他代码中设置它,否则该变量motion将始终存在。Vector2.ZERO
    • 看来您的所有动作都是由写入驱动的position
  • 你有电话queue_free可以消除敌人。

此外,您还有未使用的变量。


运行链接代码后:

  • 所有敌人的运动都是由position(知道碰撞不会阻止它的运动)驱动的,你motion什么move_and_slide都不做。
  • Area2D播放器是具有无效信号连接的孩子。这Area2D也与它的父级(在本例中为玩家)发生冲突。这会导致错误,因为它找不到要调用的方法。
  • 敌人有一个孩子Area2D会触发"body_entered"信号,因为它正在与它的父母(敌人本身)发生碰撞。这导致调用_on_Area2D_body_entered,导致调用queue_free,从而消除敌人。这是你要问的问题。

对于解决方案,您可以:

  • 检查它与_on_Area2D_body_entered什么相撞,如果它是它自己,什么也不做。利用is_in_group. 另请参阅
  • 使用碰撞层和遮罩使Area2D不与其父对象发生碰撞。请注意,图层和蒙版可能无法按预期工作。有一个改变它的建议:使物理层和掩码逻辑简单一致

推荐阅读