Box2d碰撞检测与阵列
问题描述:
我在AndEngine中开发我几乎完成了我的游戏,但不幸的是,由于我在更新循环中检查.collides很多,偶尔会遇到低fps。我现在明白,这是问题所在,我一直试图用Box2d来改变它与理论上的物体,这正是我所需要的,但我无法抓住它!Box2d碰撞检测与阵列
基本上,我有4个数组;一个是汽车,三个是敌人。汽车从左到右驾驶,如果他们与这些敌人中的任何一个接触,则速度会有所不同。当我加载阵列时,是否必须为每辆汽车和敌人分配车身?然后我该如何检查?我是否运行for循环,然后运行isBodyContacted(carBody,iceBergBody);'在更新中看?这有点合作!
仅供参考,装我的车:
private void loadCar() {
for (int i = 0; i < rManager.getInstance().carArray.length; i++) {
rManager.getInstance().carArray[i] = new Car(new Sprite(
rManager.getInstance().spawnPoint[i].getSpawnPos().x,
rManager.getInstance().spawnPoint[i].getSpawnPos().y,
rManager.getInstance().car_region,
engine.getVertexBufferObjectManager()) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final float pTouchAreaLocalX,
final float pTouchAreaLocalY) {
if (pSceneTouchEvent.isActionMove()
&& GameManager.getInstance().getDebugMode() == true) {
this.setPosition(pSceneTouchEvent.getX(),
pSceneTouchEvent.getY());
}
return true;
}
});
}
for (int i = 0; i < rManager.getInstance().carArray.length; i++) {
rManager.getInstance().carArray[i].getCarSprite().setScale(0.5f);
rManager.getInstance().carArray[i].getCarSprite().setAnchorCenter(
0, 0);
colourX = (randNumber(2, 9));
colourY = (randNumber(2, 9));
colourZ = (randNumber(2, 9));
colourX /= 10;
colourY /= 10;
colourZ /= 10;
rManager.getInstance().carArray[i].getCarSprite().setColor(colourZ,
colourY, colourZ);
attachChild(rManager.getInstance().carArray[i].getCarSprite());
this.registerTouchArea(rManager.getInstance().carArray[i]
.getCarSprite());
this.setTouchAreaBindingOnActionDownEnabled(true);
}
}
加载一个敌人..
void loadIceBerg() {
for (int i = 0; i < rManager.getInstance().iceBergArray.length; i++) {
rManager.getInstance().iceBergArray[i] = new IceBergEnemy(
new Sprite(randNumber(200, 700), randNumber(0, 480),
rManager.getInstance().iceBerg_region,
engine.getVertexBufferObjectManager()) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
this.setPosition(pSceneTouchEvent.getX(), pSceneTouchEvent.getY());
if (this.getY() > rManager.getInstance().camera.getHeight() - (this.getHeight()/2) || this.getY() < 0 + (this.getHeight()/2))
{
this.setPosition(200 - (pDifficultyLevel * 20),
-100);
showScore(50, " ice berg!");
this.setVisible(false);
}
if(pSceneTouchEvent.isActionUp())
{
updateScore(50);
GameManager.getInstance().updateTotalIceBergEnemiesKilled();
}
return true;
}
});
rManager.getInstance().iceBergArray[i].getIceBergSprite()
.setPosition(
rManager.getInstance().iceBergArray[i]
.getIceBergSprite().getX(),
rManager.getInstance().iceBergArray[i]
.getIceBergSprite().getY());
rManager.getInstance().iceBergArray[i].getIceBergSprite().setScale(
0.8f);
this.registerTouchArea(rManager.getInstance().iceBergArray[i]
.getIceBergSprite());
this.setTouchAreaBindingOnActionDownEnabled(true);
attachChild(rManager.getInstance().iceBergArray[i]
.getIceBergSprite());
}
}
一些碰撞!
else if (rManager.getInstance().iceBergArray[2]
.getIceBergSprite().collidesWith(
rManager.getInstance().carArray[r]
.getCarSprite())) {
rManager.getInstance().carArray[r].setCarSpeed(0f);
}
else if (rManager.getInstance().iceBergArray[3]
.getIceBergSprite().collidesWith(
rManager.getInstance().carArray[r]
.getCarSprite())) {
rManager.getInstance().carArray[r].setCarSpeed(0f);
}
else if (rManager.getInstance().iceBergArray[4]
.getIceBergSprite().collidesWith(
rManager.getInstance().carArray[r]
.getCarSprite())) {
rManager.getInstance().carArray[r].setCarSpeed(0f);
}
else if (rManager.getInstance().iceBergArray[5]
.getIceBergSprite().collidesWith(
rManager.getInstance().carArray[r]
.getCarSprite())) {
rManager.getInstance().carArray[r].setCarSpeed(0f);
}
我发现有很多教程,但似乎没有一个参考对象的数组,而这正是我需要的。如果有人可以帮助我或提供某种快速教程,那么将不胜感激。谢谢!!
答
您不应该使用任何循环来检查每个可能的碰撞组合。相反,你应该为整个世界注册一个监听器,并在你的身体上设置用户数据(例如type =“car”,“enemy”)。然后在听众中,你只需检查哪两个物体相撞。看看这个例子:
http://www.andengine.org/forums/gles2/collision-events-t7140.html#p31300