私はこの問題を2日以上解決しようとしていますが、かなり必死になっています.
Android用の「チェッカーのような」ボードゲームを書きたいです。ゲーム エンジン自体はちょっと完成していますが、ビューの更新に問題があります。
私の問題を示すために、小さなサンプル クラスを書きました。
public class GameEngineView extends View {
private static final String TAG = GameEngineView.class.getSimpleName();
private int px;
private int py;
private int cx;
private int cy;
private boolean players_move;
private int clickx;
private int clicky;
Random rgen;
private RefreshHandler mRedrawHandler = new RefreshHandler();
class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) {
GameEngineView.this.update();
GameEngineView.this.invalidate();
Log.d(TAG, "invalidate()");
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
public GameEngineView(Context context) {
super(context);
setFocusable(true);
players_move = true;
rgen = new Random();
}
public void update() {
updateGame();
Log.d(TAG, "update -> sleep handler");
mRedrawHandler.sleep(100);
}
public void updateGame() {
if(players_move) {
px = clickx;
py = clicky;
} else {
calcAIMove();
switchMove();
}
}
public void switchMove() {
players_move = !players_move;
}
public void calcAIMove() {
for(int i = 0; i < 20000; i++) {
cx = rgen.nextInt(getWidth());
cy = rgen.nextInt(getHeight());
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG, "event");
int eventaction = event.getAction();
if(eventaction == MotionEvent.ACTION_DOWN) {
Log.d(TAG, "action_down");
clickx = (int) event.getX();
clicky = (int) event.getY();
switchMove();
update();
}
return super.onTouchEvent(event);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint green = new Paint();
green.setColor(Color.GREEN);
Paint red = new Paint();
red.setColor(Color.RED);
canvas.drawColor(Color.BLACK);
canvas.drawCircle(px, py, 25, green);
canvas.drawCircle(cx, cy, 25, red);
}
}
関数 calcAIMove() は、ボード ゲームでの位置の実際の評価をシミュレートするために時間を費やすだけです。
今私の問題は次のとおりです。プレーヤーがクリックすると(移動すると)、aiの移動計算が完了すると、緑色のボールが最初に描画されます。したがって、両方の動きが同時に描かれます。
これをどのように達成するのだろうか: -プレーヤーのクリック -緑のボールが描かれる -AIが計算する -赤いボールが描かれる -など..
ウェブを検索すると、多くのゲームループの例が見つかりましたが、それらはすべて、一定のポーリングを行うスレッドが必要です..プログラム全体が順次実行されるため、これがなくても可能であるはずです..そうですか?
アドバイスを期待しています。
ありがとう、デイブ