Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线太慢了。更好的代码执行方式(Android和Engine)?_Android_Multithreading_Handler_Andengine - Fatal编程技术网

线太慢了。更好的代码执行方式(Android和Engine)?

线太慢了。更好的代码执行方式(Android和Engine)?,android,multithreading,handler,andengine,Android,Multithreading,Handler,Andengine,我正在开发一个游戏,用户每次触摸都会创建精灵。然后我运行一个线程来检查这些精灵是否与其他精灵发生碰撞。问题是,如果点击太快,会导致空指针异常错误。我相信这是因为我点击的速度比线程运行的速度快。这是我的思路: public class grow implements Runnable{ public grow(Sprite sprite){ } @Override public void run() { f

我正在开发一个游戏,用户每次触摸都会创建精灵。然后我运行一个线程来检查这些精灵是否与其他精灵发生碰撞。问题是,如果点击太快,会导致空指针异常错误。我相信这是因为我点击的速度比线程运行的速度快。这是我的思路:

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));
        }
    }
public类grow实现可运行{
公共种植(雪碧雪碧){
}
@凌驾
公开募捐{
浮动半径,rads;//填充半径/固定半径
浮点数fx=0,fy=0,sx,sy;
当(向下){
如果(spriteC[spriteNum].active){
spriteC[spriteNum].sprite.setScale(spriteC[spriteNum].scale+=0.001);
if(spriteC[spriteNum].sprite.collizeswith(地面)| | spriteC[spriteNum].sprite.collizeswith(屋顶)||
spriteC[spriteNum]。sprite.CollizeSwith(左)| | spriteC[spriteNum]。sprite.CollizeSwith(右)){
向下=假;
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”+浮点数toString(fx)、浮点数toString(fy));
如果(spriteNum>0)

对于(int x=0;x,您需要同步“grow”Runnable的执行,以便在快速按下按钮时run()方法不会与自身交错,正如您所指出的。您可能可以使用简单的同步方法或块来实现这一点,但如果您需要更高级的控制,也可以使用队列


至于速度,请使用traceview对其进行分析并找出瓶颈。正如上面一位用户所评论的那样,日志记录可能非常昂贵。

我花了一段时间才弄清楚如何做到这一点,但更新处理程序工作得非常好。我只使用了场景更新处理程序。在OnCreateSecene中创建场景时,请实现以下代码:

        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.
    }

如果有人需要更多信息,请在下午发送rphello101。

您的日志记录与实际碰撞检测的工作一样多!是的,这也有帮助。谢谢。同步和删除日志确实有很大帮助,但我仍然可以使其崩溃。还有其他想法吗?