1

スプライトが画面に表示され、ユーザーがスプライトをタップして削除する Android ゲームを作成しています。スプライトが画面の下部に到達すると、プレーヤーの寿命が減少し、スプライトは削除されますが、プレーヤーの寿命を表示するテキスト ビューは更新されません。

スプライトを殺すために使用されるオンタッチリスナーに「更新」呼び出しを入れました。これにより、すべてが正常に更新されます(スプライトが殺されるとプレーヤーのスコアが増加します)。しかし、スプライトが画面の下部に到達したときにライフを更新する方法がわかりません。スプライトが削除されたときに更新しようとするたびに、アプリがクラッシュします。(TextView).setText() を使用して、スコアを表示するテキストビューを更新しています

アプリは、openGL を使用してスプライトをレンダリングします。

スプライトが削除されたときに更新するにはどうすればよいですか?

これは画面が設定されるクラスで、オンタッチリスナーも含まれています。

package com.JACSoft.game;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;

public class GamePlay extends Activity 
{
    public static GameGLSurfaceView mGLView;
    public static int PlayerScore = 0;
    public static int PlayerLives = 9;
    public static int counter = 0;
    static TextView PStatsView;         // creates text view to display stats
    static LinearLayout Stats;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Stats = new LinearLayout(this);             //creates an editable layout
    Stats.setOrientation(1);                                // makes it horizontal
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);
    mGLView = new GameGLSurfaceView(this);
    PStatsView = new TextView(this);
    PStatsView.setTextSize(20.0f);
    PStatsView.setText("Score : " + PlayerScore + "             " + "Lives : " + PlayerLives);          // puts the string version of score in the text view 
    Stats.addView(PStatsView);                              // adds views to layout
    Stats.addView(mGLView);                                 // adds views to layout
    setContentView(Stats);                                  // sets layout as the view
}

public boolean onTouchEvent(MotionEvent event) 
{
    switch(event.getAction())
    {
        case MotionEvent.ACTION_DOWN :
            GameGLRenderer.sprites.deleteSprite(event.getX(),event.getY(), 0);
            PStatsView.setText("Score : " + PlayerScore + "             " + "Lives : " + PlayerLives);          
            break;
    }
    return true;
}

}

これは、別のスレッドからテキストビューにアクセスできないと言っているビットですが、メインスレッドにあるスプライト削除スレッドから関数を呼び出して setText 関数を呼び出してみました

11-22 19:06:03.105: E/AndroidRuntime(27971): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

これはその行の後に来るものです

11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4865)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:979)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.view.ViewGroup.invalidateChild(ViewGroup.java:4306)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.view.View.invalidate(View.java:10519)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.view.View.invalidate(View.java:10474)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.widget.TextView.checkForRelayout(TextView.java:6598)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.widget.TextView.setText(TextView.java:3705)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.widget.TextView.setText(TextView.java:3563)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.widget.TextView.setText(TextView.java:3538)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at com.JACSoft.game.GameSprites.deleteSprite(GameSprites.java:120)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at com.JACSoft.game.GameSprite.BottomReached(GameSprite.java:61)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at com.JACSoft.game.GameSprite.moveBallDown(GameSprite.java:51)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at com.JACSoft.game.GameSprite.gravitate(GameSprite.java:25)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at com.JACSoft.game.GameSprites.draw(GameSprites.java:60)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at com.JACSoft.game.GameGLRenderer.onDrawFrame(GameGLRenderer.java:68)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
11-22 19:06:03.105: E/AndroidRuntime(27971):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
4

1 に答える 1

1

各ゲーム ループでスプライトを反復処理し、画面の下部に到達したスプライトがあるかどうかを確認してから、スプライトを削除してプレーヤーの統計を更新する必要があります。

多くのゲーム フレームワークには、ゲーム オブジェクトを描画および更新するための個別のスレッドがあります。setTextあなたの問題は、UI スレッドからではなく、そのスレッドからメソッドが呼び出されている可能性があります。このメソッドをアクティビティ クラスに追加します。

public void setPStatsText(String text) {
    this.runOnUiThread(new Runnable() {
        public void run() {
            PStatsView.setText(text);
        }
    }
}

それを呼び出してテキストを変更します。

これで問題が解決しない場合は、logcat から例外メッセージを投稿してください。

于 2012-11-22T18:16:18.953 に答える