は、Androidでの2Dゲームを描画するためのSurfaceViewを使用するにはAndroidのSurfaceViewでCPU速度とは無関係に描画、私はこれがで使う主な活動のonCreate()
:計算を作成し、
setContentView(new GameView(this));
:
public class GameView extends SurfaceView implements SurfaceHolder.Callback
また、私はそのrun()
機能付きのスレッドがあります
public void run() {
Canvas c;
while (_run) {
c = null;
try {
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
_panel.updatePhysics();
_panel.onDraw(c);
}
}
finally { // when exception is thrown above we may not leave the surface in an inconsistent state
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
で
私はいくつかの計算を行います。彼らは、もちろん、この簡単な例よりも複雑ですが、同じように動作:
public void updatePhysics() {
GraphicObject.Coordinates coord;
GraphicObject.Speed speed;
for (GraphicObject graphic : _allElements) {
coord = graphic.getCoordinates();
speed = graphic.getSpeed();
coord.setX(coord.getX() + speed.getX());
coord.setY(coord.getY() + speed.getY());
...
}
}
をそしてonDraw()
に、私はキャンバスにすべてを描く:
@Override
public void onDraw(Canvas canvas) {
canvas.drawBitmap(BITMAP, xPos, yPos, null);
...
}
は、これが正常に動作します - すべてを。私のデバイスでそれをテストしたところ、かなり見栄えが良かった。しかし、私が他の人にそれを渡して試合をしたとき、オブジェクトははるかに速く動いていました!なぜこれはそうですか?スレッドはできるだけ頻繁にupdatePhysics()
を呼び出します。これは、高速デバイスがこの機能をより頻繁に呼び出すことを意味しますか?
どのように私はこれを防ぐ、すべてのデバイスに均等に高速なゲームを作ることができますか?このようなもの?
private long lastRun = System.currentTimeMillis();
public void updatePhysics() {
long millisPassed = System.currentTimeMillis()-lastRun;
...
float newCoord = (coord.getX() + speed.getX()) * millisPassed/33;
coord.setX(newCoord);
...
}
ありがとうございます!
まさにあなたが提案したもののように。システムクロックを参照する必要があります。一定の間隔で更新する(フレームレートを制限し、それによって悪くなる可能性があります)、または時間に基づいて物事を計算してください。 – zapl
フレーム依存ではなく提案(2)のように直接依存する時間にしてください。したがって、すべてのフレームが同じ期間を意味するわけではありません。 –
ありがとう、ザップルとグスタボ!ですから、毎回の計算を '* milli_seconds_passed/40'のようなもので包む必要がありますか?そして定数「40」では、すべての速さが決まります。 – caw