当一个对象进入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时什么也没有发生
答案 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尝试这样做会引发错误。
不过,或者,如果您想要相反的方法,则使KinematicBody
向Area2D
对象移动,并在受到影响时将其删除。只需将整个增量过程从Area2D
脚本移到KinematicBody
上方的_on_Area2D_body_entered(body)
脚本中,然后将self.position.x
更改为-= 1
。将信号留在Area2D
上。