godot - 为什么我的敌人在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 。在这种情况下有什么问题?
谢谢,
解决方案
通过查看问题中的代码:
- 如果动作出现问题,它可能会使敌人移动到意想不到的位置:
- 除非您从其他代码中设置它,否则该变量
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
不与其父对象发生碰撞。请注意,图层和蒙版可能无法按预期工作。有一个改变它的建议:使物理层和掩码逻辑简单一致。
推荐阅读
- fedora - Fedora 28 未启动:“acpi MST0101:00:平台设备创建失败”
- winapi - VirtualAlloc 一个可写的、无支持的“丢弃”垃圾范围?
- android - 如何在 SAM 中调用挂起函数?
- c - 如何将 gcc 与 fsanitize=address 一起使用?
- flask - flask-admin 如何在 viewmodel 中访问模型
- angular - 在 Angular 的反应形式中,为什么在 formControlName 中传递的参数作为字符串传递?
- hazelcast-jet - Hazelcast-jet:使用直接查找丰富流时出错
- c - 如何从Linux内核中的当前获取父线程名称
- c++ - 使用 for 循环查找一组数字的总和
- angular - Mat-tab-group header 更快的动画滚动