1

intentこのメソッドを使用して、gameViewから新しいものを開始しようとしています。

    if(happy.getHP() <= 0){ //if my main-character dies
            thread.setRunning(false);
            Context context = getContext();
            Intent intent = new Intent("nielsen.happy.activities.ENDSCREEN");
            context.startActivity(intent);

}

なしthread.setRunning(false);で実行すると、endScreenは表示されますが、ボタンは機能しませんが、mainThreadを停止すると機能します。

とにかく、このコードの問題は、キャラクターが死ぬと、3〜4秒間フリーズし、エンドスクリーンが1秒間点滅し、次にgameViewが1秒間点滅し、エンドスクリーンが実際に表示されてボタンが機能することです。

メニューの[ゲームの開始]を押したときのように、別のアクティビティからアクティビティを開始しても、この問題は発生しません。ここで何が起こっているのか、このように遅れているのか、私は本当に理解していません。

以下に私のスレッドを追加します:

    public void run() {
    Canvas canvas;
    Log.d(TAG, "Starting game loop");
    // initialise timing elements for stat gathering
    initTimingElements();

    long beginTime;     // the time when the cycle begun
    float time1 = System.currentTimeMillis();
    float time2;
    //long timeDiff;        // the time it took for the cycle to execute
    int sleepTime;      // ms to sleep (<0 if we're behind)
    int framesSkipped;  // number of frames being skipped 

    sleepTime = 0;

    while (running) {
        canvas = null;
        // try locking the canvas for exclusive pixel editing
        // in the surface
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                beginTime = System.currentTimeMillis();
                framesSkipped = 0;  // resetting the frames skipped
                // update game state 
                this.gamePanel.update();
                // render state to the screen
                // draws the canvas on the panel
                this.gamePanel.render(canvas);              
                // calculate how long did the cycle take
                timeDiff = System.currentTimeMillis() - beginTime;
                // calculate sleep time
                sleepTime = (int)(FRAME_PERIOD - timeDiff);

                if (sleepTime > 0) {
                    // if sleepTime > 0 we're OK
                    try {
                        // send the thread to sleep for a short period
                        // very useful for battery saving
                        Thread.sleep(sleepTime);    
                    } catch (InterruptedException e) {}
                }

                while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
                    // we need to catch up
                    this.gamePanel.update(); // update without rendering
                    sleepTime += FRAME_PERIOD;  // add frame period to check if in next frame
                    framesSkipped++;
                }

                // for statistics
                framesSkippedPerStatCycle += framesSkipped;
                // calling the routine to store the gathered statistics
                storeStats();
            }
        } finally {
            // in case of an exception the surface is not left in 
            // an inconsistent state
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }   // end finally
    }
}

以下にメソッド全体を追加します。

    private void checkCollision(Canvas canvas) {
    Rect h1 = happy.getBounds();
    for (int i = 0; i < enemies.size(); i++) {
        Rect e1 = enemies.get(i).getBounds();
        if (h1.intersect(e1)){
            if(enemies.get(i).getX() < controls.pointerPosition.x){
                enemies.get(i).setX(-20);
            }else if (enemies.get(i).getX() > controls.pointerPosition.x){
                enemies.get(i).setX(20);
            }else if(enemies.get(i).getY() < controls.pointerPosition.y){
                enemies.get(i).setY(-20);
            }else if(enemies.get(i).getY() > controls.pointerPosition.y){
                enemies.get(i).setY(20);
            }
            if(enemies.get(i).getCooldown() <= 0){
            happy.damageHP(10);
            score.incScore(-10);
            enemies.get(i).setCooldown();
            }
        }
        if(happy.getHP() <= 0){

            thread.setRunning(false);
            try {
                thread.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Context context = getContext();
            Intent intent = new Intent("nielsen.happy.activities.ENDSCREEN");
            context.startActivity(intent);
            //end-screen                           !!!!!!!
        }
        if(enemies.get(i).getHP() <= 0){
            enemies.get(i).death(canvas, enemies);
            score.incScore(5);
            break;
        }   
        for (int j = 0; j < bullets.size(); j++) {
            Rect b1 = bullets.get(j).getBounds();
            if (b1.intersect(e1)) {
                enemies.get(i).damageHP(5);
                bullets.remove(j);
            }
        }
    }
}
4

1 に答える 1

1

確実にスレッドが何をしているのかを確認する必要がありますが、次のようなことが起こっていると確信しています。

  • スレッドクラスにフラグを設定するsetRunning(false)を呼び出します。

  • 新しいインテントを開始しましたが、実行中のフラグをチェックする部分に到達していないため、スレッドはまだ停止していません

  • スレッド(まだ一時停止していません)がGUIに変更を加え始めます。これにより、ビューが非アクティブである必要があると考えるAndroidUIが混乱します。

  • スレッドはsetRunning(true)を待機するポイントに到達し、すべてが再び幸せになります。

これがtrueの場合、setRunning(true)でスレッドがブロックされるまで待ってから、新しいインテントを作成することで修正できます。

于 2012-09-05T00:18:11.827 に答える