要使用 SurfaceView 在 Android 中绘制 2D 游戏,我在主要活动中使用它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);
}
}
}
}
在updatePhysics()
我做一些计算。当然,它们比这个简单的例子更复杂,但工作方式相同:
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);
...
}
谢谢你的帮助!