我正在开发一款游戏,用户可以通过每次触摸创建精灵。然后我运行一个线程来检查这些精灵是否与其他精灵相撞。问题是,如果我点击太快,我会导致空指针异常错误。我相信这是因为我的线程比我的线程运行得快。这是我的主题:
public class grow implements Runnable{
public grow(Sprite sprite){
}
@Override
public void run() {
float radf, rads; //fill radius/stationary radius
float fx=0, fy=0, sx, sy;
while(down){
if(spriteC[spriteNum].active){
spriteC[spriteNum].sprite.setScale(spriteC[spriteNum].scale += 0.001);
if(spriteC[spriteNum].sprite.collidesWith(ground)||spriteC[spriteNum].sprite.collidesWith(roof)||
spriteC[spriteNum].sprite.collidesWith(left)||spriteC[spriteNum].sprite.collidesWith(right)){
down = false;
spriteC[spriteNum].active=false;
yourScene.unregisterTouchArea(spriteC[spriteNum].sprite);
}
fx = spriteC[spriteNum].sprite.getX();
fy = spriteC[spriteNum].sprite.getY();
radf=spriteC[spriteNum].sprite.getHeightScaled()/2;
Log.e("F"+Float.toString(fx),Float.toString(fy));
if(spriteNum>0)
for(int x=0;x<spriteNum;x++){
rads=spriteC[x].sprite.getHeightScaled()/2;
sx = spriteC[x].body.getWorldCenter().x * 32;
sy = spriteC[x].body.getWorldCenter().y * 32;
Log.e("S"+Float.toString(sx),Float.toString(sy));
Log.e(Float.toString((float) Math.sqrt(Math.pow((fx-sx),2)+Math.pow((fy-sy),2))),Float.toString((radf+rads)));
if(Math.sqrt(Math.pow((fx-sx),2)+Math.pow((fy-sy),2))<(radf+rads)){
down = false;
spriteC[spriteNum].active=false;
yourScene.unregisterTouchArea(spriteC[spriteNum].sprite);
Log.e("Collided",Boolean.toString(down));
}
}
}
}
spriteC[spriteNum].body = PhysicsFactory.createCircleBody(mPhysicsWorld, spriteC[spriteNum].sprite, BodyType.DynamicBody, FIXTURE_DEF);
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(spriteC[spriteNum].sprite, spriteC[spriteNum].body, true, true));
}
}
更好的解决方案?我知道与处理程序有关,但我不知道那是什么或如何使用它。
答案 0 :(得分:1)
如您所述,您需要同步“grow”Runnable的执行,以便当您快速按下按钮时run()方法不会与其自身交错。您可以使用简单的同步方法或块来执行此操作,但如果您需要更高级的控制,也可以使用队列。
至于速度,使用traceview对其进行分析并找出瓶颈。正如上面评论的用户,日志记录可能非常昂贵。
答案 1 :(得分:0)
花了一些时间来弄清楚如何做到这一点,但更新处理程序工作得很好。我刚刚使用了场景更新处理程序。在onCreateScene中创建场景时,请实现以下代码:
scene.registerUpdateHandler(new IUpdateHandler() {
@Override
public void reset() {
}
@Override
public void onUpdate(float pSecondsElapsed) {
//Whatever you want to update. Any moving or scaling object essentially.
}
如果有人需要更多信息,请在http://www.andengine.org/forums/上向rphello101发送PM。