为什么我的敌人在 godot 引擎启动时消失了
Why are my enemies disappearing on startup in the godot engine
我对 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。这种情况下的问题是什么?
谢谢,
通过查看问题中的代码:
- 如果动作有问题,可能会使敌人移动到意想不到的位置:
- 变量
motion
将始终为 Vector2.ZERO
,除非您通过其他代码设置它。
- 看来您的所有动作都是通过写入
position
来驱动的。
- 您调用了
queue_free
,这可能是在移除敌人。
此外,您还有未使用的变量。
在 运行 您的链接代码之后:
- 所有敌人的运动都是由
position
驱动的(知道碰撞不会阻止它的移动),你的motion
和move_and_slide
什么都不做。
- 播放器a child
Area2D
信号连接无效。 Area2D
也与其 parent(在本例中为玩家)发生碰撞。这会导致错误,因为它找不到要调用的方法。
- 敌人有一个 child
Area2D
会触发 "body_entered"
信号,因为它正在与其 parent(敌人本身)发生碰撞。结果调用 _on_Area2D_body_entered
,调用 queue_free
,移除敌人。 这就是你问的问题。
对于解决方案,您可以:
- 在
_on_Area2D_body_entered
中检查它碰撞的是什么,如果是它本身,什么也不做。 利用具有is_in_group
. See also Groups的节点组也是一种常见的做法。
- 使用碰撞层和蒙版使
Area2D
不会与其 parent 发生碰撞。 请注意,图层和蒙版可能无法按您预期的那样工作。有建议改一下:Make physics layers and masks logic simple and consistent.
我对 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。这种情况下的问题是什么?
谢谢,
通过查看问题中的代码:
- 如果动作有问题,可能会使敌人移动到意想不到的位置:
- 变量
motion
将始终为Vector2.ZERO
,除非您通过其他代码设置它。 - 看来您的所有动作都是通过写入
position
来驱动的。
- 变量
- 您调用了
queue_free
,这可能是在移除敌人。
此外,您还有未使用的变量。
在 运行 您的链接代码之后:
- 所有敌人的运动都是由
position
驱动的(知道碰撞不会阻止它的移动),你的motion
和move_and_slide
什么都不做。 - 播放器a child
Area2D
信号连接无效。Area2D
也与其 parent(在本例中为玩家)发生碰撞。这会导致错误,因为它找不到要调用的方法。 - 敌人有一个 child
Area2D
会触发"body_entered"
信号,因为它正在与其 parent(敌人本身)发生碰撞。结果调用_on_Area2D_body_entered
,调用queue_free
,移除敌人。 这就是你问的问题。
对于解决方案,您可以:
- 在
_on_Area2D_body_entered
中检查它碰撞的是什么,如果是它本身,什么也不做。 利用具有is_in_group
. See also Groups的节点组也是一种常见的做法。 - 使用碰撞层和蒙版使
Area2D
不会与其 parent 发生碰撞。 请注意,图层和蒙版可能无法按您预期的那样工作。有建议改一下:Make physics layers and masks logic simple and consistent.