Gogot 引擎错误问题:"body set shape disabled" 和 "body set shape as one-way collision"
Gogot Engine error issue: "body set shape disabled" and "body set shape as one-way collision"
我的引擎 Godot 有问题,出现错误“body set shape disabled”和“body set shape as one-way collision”。
在我的项目中我构建了四个场景:
由(StaticBody2D
构成的platform
场景有childobjects(CollisionShape2D
,Sprite
, Position2D
, Area2D
依次有 child object(Collisionshape2D
))
由(RigidBody2D
构成的missile
场景有childobjects(CollisionShape2D
和Sprite
));
由(Kinematicbody2D
组成的spaceship
场景有childobjects(Sprite
和CollisionShape2D
));
作为根节点Node
和childobject的main
场景:(平台和宇宙飞船)。
另外我有两个脚本:一个在spaceship
场景中,在Kinematicbody2D
节点上;然后在 StaticBody2D
节点上的 platform
场景中。
基本上当我开始游戏时,在顶部中心有 platform
,然后是 Area2D
(用 CollisionShape2D
来检测 body进入该区域,然后还有我设置的 Position2D
位置,它应该在运行时实例化导弹。
当 body 进入 Area2D
时,platform
应该实例化一个 missile
(目前什么都不做)。
当我将 spaceship
指向 Area2D
并且 platform
多次实例化导弹(每秒超过 200-300 次)时出现问题,这是游戏崩溃的瞬间。我收到上面写的错误,然后我必须关闭它。
飞船代码:
extends KinematicBody2D
var target
var click
var dir
var collision
var speed = 200
func _input(event):
if event is InputEventMouseButton:
target = get_global_mouse_position()
click = true
func _physics_process(delta):
if click:
dir = position.direction_to(target)
collision = move_and_collide(dir * speed * delta)
if collision:
pass
平台代码:
extends StaticBody2D
var trigger
var missileScene = preload("res://scenes/Missile.tscn")
var missile
func _on_DangerArea_body_entered(body):
if body is KinematicBody2D:
trigger = true
while(trigger):
missile = missileScene.instance()
$SpawnPosition.add_child(missile)
yield(get_tree().create_timer(3),"timeout")
func _on_DangerArea_body_exited(body):
if body is KinematicBody2D:
trigger = false
每个进入 Area2D
的 PhysicsBody2D
(KinematicBody2D
、RigidBody2D
、StaticBody2D
)都会发生信号 body_entered
。这包括导弹。
是的,您正在检查 body 是否是 KinematicBody2D
。但是当一个 KinematicBody2D
进入时,它将 trigger
设置为 true,允许所有主体进入循环。
首先,我建议通过返回来拒绝主体:
func _on_DangerArea_body_entered(body):
if not body is KinematicBody2D:
return
# ...
其次,您可以使用常规计时器来生成导弹(这样,您也知道最多有一个计时器 运行):
extends StaticBody2D
var timer:Timer
var missileScene:PackedScene = preload("res://scenes/Missile.tscn")
func _ready():
timer = Timer.new()
add_child(timer)
timer.set_wait_time(3)
timer.connect("timeout", self, "instance_missile")
func _on_DangerArea_body_entered(body):
if not body is KinematicBody2D:
return
timer.start()
func _on_DangerArea_body_exited(body):
if not body is KinematicBody2D:
return
timer.stop()
func instance_missile():
var missile := missileScene.instance()
$SpawnPosition.add_child(missile)
以下内容可能对您的游戏有用,也可能没有用:您可以使用 node groups, or register classes,这样您就可以比 is KinematicBody2D
更具体。您可以做的另一件事是在他们进入时将您关心的机构添加到 Array
,并在他们退出时将其删除,这样您就知道他们何时全部退出。
顺便说一句,我在抄写代码时注意到的第一件事是:您从未将 click
设置为 false(或其他非 true 的值)。
您似乎想要处理一个物理框架的点击。为此,您不需要 _input
。在 _physics_process
中改用 Input.is_action_just_pressed
。 事实上,我鼓励以这种方式开始,只有在需要时才转到 _input
。很多时候你不会。
我的引擎 Godot 有问题,出现错误“body set shape disabled”和“body set shape as one-way collision”。
在我的项目中我构建了四个场景:
由(
StaticBody2D
构成的platform
场景有childobjects(CollisionShape2D
,Sprite
,Position2D
,Area2D
依次有 child object(Collisionshape2D
))由(
RigidBody2D
构成的missile
场景有childobjects(CollisionShape2D
和Sprite
));由(
Kinematicbody2D
组成的spaceship
场景有childobjects(Sprite
和CollisionShape2D
));作为根节点
Node
和childobject的main
场景:(平台和宇宙飞船)。
另外我有两个脚本:一个在spaceship
场景中,在Kinematicbody2D
节点上;然后在 StaticBody2D
节点上的 platform
场景中。
基本上当我开始游戏时,在顶部中心有 platform
,然后是 Area2D
(用 CollisionShape2D
来检测 body进入该区域,然后还有我设置的 Position2D
位置,它应该在运行时实例化导弹。
当 body 进入 Area2D
时,platform
应该实例化一个 missile
(目前什么都不做)。
当我将 spaceship
指向 Area2D
并且 platform
多次实例化导弹(每秒超过 200-300 次)时出现问题,这是游戏崩溃的瞬间。我收到上面写的错误,然后我必须关闭它。
飞船代码:
extends KinematicBody2D
var target
var click
var dir
var collision
var speed = 200
func _input(event):
if event is InputEventMouseButton:
target = get_global_mouse_position()
click = true
func _physics_process(delta):
if click:
dir = position.direction_to(target)
collision = move_and_collide(dir * speed * delta)
if collision:
pass
平台代码:
extends StaticBody2D
var trigger
var missileScene = preload("res://scenes/Missile.tscn")
var missile
func _on_DangerArea_body_entered(body):
if body is KinematicBody2D:
trigger = true
while(trigger):
missile = missileScene.instance()
$SpawnPosition.add_child(missile)
yield(get_tree().create_timer(3),"timeout")
func _on_DangerArea_body_exited(body):
if body is KinematicBody2D:
trigger = false
每个进入 Area2D
的 PhysicsBody2D
(KinematicBody2D
、RigidBody2D
、StaticBody2D
)都会发生信号 body_entered
。这包括导弹。
是的,您正在检查 body 是否是 KinematicBody2D
。但是当一个 KinematicBody2D
进入时,它将 trigger
设置为 true,允许所有主体进入循环。
首先,我建议通过返回来拒绝主体:
func _on_DangerArea_body_entered(body):
if not body is KinematicBody2D:
return
# ...
其次,您可以使用常规计时器来生成导弹(这样,您也知道最多有一个计时器 运行):
extends StaticBody2D
var timer:Timer
var missileScene:PackedScene = preload("res://scenes/Missile.tscn")
func _ready():
timer = Timer.new()
add_child(timer)
timer.set_wait_time(3)
timer.connect("timeout", self, "instance_missile")
func _on_DangerArea_body_entered(body):
if not body is KinematicBody2D:
return
timer.start()
func _on_DangerArea_body_exited(body):
if not body is KinematicBody2D:
return
timer.stop()
func instance_missile():
var missile := missileScene.instance()
$SpawnPosition.add_child(missile)
以下内容可能对您的游戏有用,也可能没有用:您可以使用 node groups, or register classes,这样您就可以比 is KinematicBody2D
更具体。您可以做的另一件事是在他们进入时将您关心的机构添加到 Array
,并在他们退出时将其删除,这样您就知道他们何时全部退出。
顺便说一句,我在抄写代码时注意到的第一件事是:您从未将 click
设置为 false(或其他非 true 的值)。
您似乎想要处理一个物理框架的点击。为此,您不需要 _input
。在 _physics_process
中改用 Input.is_action_just_pressed
。 事实上,我鼓励以这种方式开始,只有在需要时才转到 _input
。很多时候你不会。