円を表示する単純なゲーム ループ (実際にはまだゲームではない) を作成しようとしています。100 回ティックした後、別の円を描画します。また、ループが実行された回数を表示するテキスト フィールドもあります。関連するコードは次のとおりです。
主な活動
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
DrawView v = new DrawView(this);
v.setBackgroundColor(Color.WHITE);
setContentView(v);
}
}
DrawView
public class DrawView extends SurfaceView implements SurfaceHolder.Callback
{
Paint p = new Paint();
MainThread thread;
private int y=0;
public DrawView(Context c)
{
super(c);
thread = new MainThread(this, getHolder());
thread.running = true;
getHolder().addCallback(this);
setFocusable(true);
}
public void draw(Canvas c)
{
if(c==null)
return;
super.onDraw(c);
p.setColor(Color.RED);
p.setTextSize(32);
p.setTypeface(Typeface.SANS_SERIF);
c.drawCircle(getWidth()/2-100,getHeight()/2, 50, p);
c.drawText("y = " + y, 50, 50, p);
if(y==100)
c.drawCircle(getWidth()/2+100,getHeight()/2, 50, p);
else
y++;
}
public void surfaceCreated(SurfaceHolder p1)
{
thread.start();
}
メインスレッド
public class MainThread extends Thread
{
private DrawView page;
private SurfaceHolder holder;
public boolean running;
public MainThread(DrawView p, SurfaceHolder h)
{
super();
page = p;
holder = h;
}
@Override
public void run()
{
while(running)
{
Canvas c = holder.lockCanvas();
page.draw(c);
holder.unlockCanvasAndPost(c);
}
}
}
最初の円と「y = 2」というテキストが表示されるだけです。何も更新されないように見えるか、2 回実行してから停止します。私は Android プログラミングは初めてですが、Java は初めてです。私は単純なものが欠けていると確信しています。助けてくれてありがとう。
編集: さらに観察すると、スレッドがランダムにクラッシュするようです。アプリを実行するたびに、「y =」が表示され、毎回異なる数値が表示されます。クラッシュするまでにそれほど多くのティックがかかると思います。アプリを閉じると、「残念ながら、MyApp は停止しました」というメッセージが表示されます。Androidがクラッシュする理由を知るには、Androidがどのように機能するかについて十分に知りません。
編集 2: 行 holder.unlockCanvasAndPost(c) で IllegalArgumentException をスローしていることを発見しました。繰り返しますが、理由はわかりません。何が起こっているのか、それを修正する方法を誰かが説明できますか?
編集 3: 各ティックの y の値をログに記録すると、正しく計算され、意図したとおりに 100 に達すると停止することがわかります。画面上で起こることは、何らかの理由でそれを反映していません。