之前是使用「Filter」來設定「BodyComponent可以發生碰撞的對象」。
但其實只要將BodyComponent設定為「Sensor」,就可以讓它處於「偵測接觸,但無碰撞」的狀態。——biginContact與endContact這次有正常運作了!
既然biginContact與endContact有正常運作,那就可以進一步改造之前的做法,讓它變得效能更好!
原本是將「判斷」交由「Ball」來處理,但改為「Hole」處理。
首先要廢除下面這段「Ball」的程式碼:
List<Hole> holes = [];
addHole(Hole hole){
holes.add(hole);
}
removeHole(Hole hole){
holes.remove(hole);
}
然後修改「Hole」:
List<Ball> balls = [];
@override
void beginContact(Object other, Contact contact) {
if(other is Ball){
if(other.radius <= radius) {
balls.add(other);
}
}
super.beginContact(other, contact);
}
@override
void endContact(Object other, Contact contact) {
if(other is Ball){
if(other.radius <= radius) {
balls.remove(other);
}
}
super.beginContact(other, contact);
}
//update
if(balls.length > 0){
for(Ball ball in balls){
if((ball.body.position - body.position).length < radius){
world.remove(ball);
}
}
}
這樣就能省去許許多多的麻煩了!
本意是想要藉由在「Filter」的「maskBits」設定多組條件來完成。
fixtureDef.filter.maskBits = 條件ㄧ | 條件二 | 條件三 ... ;
但是此路不通!(沒有發生正常效果,似乎只有條件一會起作用。)
其實這條路直得繼續研究下去,但是這有點偏離主題,所以做、但是先完成主要目標吧!