スプライトが画面に表示され、ユーザーがスプライトをタップして削除する 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)