首页 > 解决方案 > Godot 3.3.2:刷新查询时无法更改此状态。使用 call_deferred() 或 set_deferred() 来改变监控状态(错误)

问题描述

我正在开发的游戏,我的角色可以杀死敌人,但是当敌人死亡时,他们不会丢失碰撞框,当我运行游戏并杀死敌人时,标题中出现错误。

整个敌人代码粘贴在下面:

extends KinematicBody2D

const GRAVITY = 10
const SPEED = 30 
const FLOOR = Vector2(0, -1)

var velocity = Vector2()

var direction = 1

var is_dead = false

func _ready():
    pass 
    
func dead():
    is_dead = true
    velocity = Vector2(0, 0)
    $AnimatedSprite.play("dead")
    $CollisionShape2D.disabled = true
    $Timer.start()

func _physics_process(delta):
    if is_dead == false:
        velocity.x = SPEED * direction
        
        if direction == 1:
            $AnimatedSprite.flip_h = false
        else:
            $AnimatedSprite.flip_h = true 
            
        $AnimatedSprite.play("walk")
        
        velocity.y += GRAVITY
        
        velocity = move_and_slide(velocity, FLOOR)
    
    
    if is_on_wall():
        direction = direction * -1
        $RayCast2D.position.x *= -1
        
    if $RayCast2D.is_colliding() == false:
        direction = direction * -1
        $RayCast2D.position.x *= -1


func _on_Timer_timeout():
    queue_free()

如果有人能解决这个问题,那就太好了,因为我想不通。

标签: godotgdscript

解决方案


据我所知※,解决方案是使用set_deferred禁用碰撞形状:

$CollisionShape2D.set_deferred("disabled", true)

※:问题标题中的错误只会发生在disabledmonitorablemode或的变化中one_way_collision。而且我只disabled在代码中看到。编辑:对于我在网上找到的内容,它也可能在冲突期间添加或删除节点。


推荐阅读