如何在Area2D中使用queue_free()

时间:2019-05-06 23:54:07

标签: godot

当一个对象进入Area2D时,我希望一个输入的对象被删除,但是什么也没发生

我尝试了queue_free(area)和Area2d.queue_free()

Timer _timer;
int _start = 0;

void startTimer() {
  const oneSec = const Duration(seconds: 1);
  _timer = new Timer.periodic(
      oneSec,
      (Timer timer) => setState(() {
            if (_start > 60) {
              timer.cancel();
            } else {
              _start = _start + 1;
            }
          }));
}

@override
void dispose() {
  _timer.cancel();
  super.dispose();
}

Widget build(BuildContext context) {
  return new Scaffold(
      appBar: AppBar(title: Text("Timer test")),
      body: Column(
        children: <Widget>[
          RaisedButton(
            onPressed: () {
              startTimer();
            },
            child: Text("start"),
          ),
          Text("$_start")
        ],
      ));
}

就像上面说的那样,当对象进入Area2d时什么也没有发生

1 个答案:

答案 0 :(得分:0)

好的。我做了一个简单的项目,以测试queue_free()KinematicBody之间的交互作用的碰撞和Area2D过程。基本上,Area2D是检测到冲突并发出信号的对象(KinematicBody可能导致冲突,但无法检测到冲突)。因此,Area2D的工作是检测身体何时进入(或在这种情况下,当它进入身体时),然后它可以发出碰撞信号,然后在碰撞中调用_on_Area2D_body_entered函数。其他对象,然后按照指示执行queue_free()

我的节点设置如下:

Node2D
|_Area2D - (SIGNAL ATTACHED - "_on_body_entered()" - CONNECTED TO KINEMATIC BODY)
|   |_Sprite
|   |_CollisionShape2D
|
|_KinematicBody2D
    |_Sprite
    |_CollisionShape2D

为进行试验,将Area2D对象放置在同一水平轴上,并位于KinematicBody的左侧

已将脚本粘贴到AREA2D:

extends Area2D

func _ready():
    pass 

func _process(delta):
    self.position.x += 1  #So it moves into and collides with other object.

脚本附于运动体:

extends KinematicBody2D

func _ready():
    pass 

func _on_Area2D_body_entered(body): # This is called when Area2D detects a collision
    queue_free()
    print("HIT!!!!!") #To doubly confirm the collision is recognized

不幸的是,这一定是这种方式。由于Area2D是此方案中唯一能够检测并发出冲突的对象,因此无法将其命令给queue_free()本身,因为Godot尝试这样做会引发错误。

不过,或者,如果您想要相反的方法,则使KinematicBodyArea2D对象移动,并在受到影响时将其删除。只需将整个增量过程从Area2D脚本移到KinematicBody上方的_on_Area2D_body_entered(body)脚本中,然后将self.position.x更改为-= 1。将信号留在Area2D上。