我正在编写一个小游戏作为编程任务的一部分。我有我的精灵/图像以我想要的方式移动,除非它们非常生涩。这是我如何加载图像:
//missile and paint are private members of the animation thread
missile = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.missile));
paint = new Paint();
paint.setAntiAlias(true);
startTime = new Date().getTime();
我的主题的run
方法是这样的:
@Override
public void run() {
while(running) {
Canvas canvas = null;
try {
canvas = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
updatePhysics();
doDraw(canvas);
}
} finally {
if(canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
updatePhysics
只是执行计算并将值存储在名为projectilePosition
的线程的私有成员中:
function updatePhysics() {
projectilePosition = interceptionCalculationService.positionAtTime((startTime - new Date().getTime()) / 1000);
}
然后,在我的doDraw
方法中,我做了:
private void doDraw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
...
//I update the position of the missile
canvas.drawBitmap(missile, (int) projectilePosition.getDistance() * 2, (int) (getHeight() - (95 + projectilePosition.getHeight())), paint);
canvas.restore();
}
问题是动画非常生涩。导弹遵循正确的路径,但它根本不顺利。我假设这是因为我没有真正控制调用线程run
方法的时间间隔。如何让我的动画更流畅?我在看TranslateAnimation
,但我无法弄清楚如何使用它。
这是我第一次写游戏和做图形/动画,所以我不太清楚最佳实践甚至工具。我通过查阅大量的教程来实现这一目标。
答案 0 :(得分:0)
是的,doDraw方法的调用速度与处理器可以处理和操作系统允许的速度一样快,这意味着它受其他进程的影响,也意味着它使用了大量的处理器时间。作为一个相当简单但不推荐的解决方案,在while循环中添加Thread.Sleep(50)。查看如何使用计时器进行动画制作。
答案 1 :(得分:0)
我的解决方案是停止依赖系统时间并使用名为currentTime
的变量(即线程的私有成员),该变量在doDraw
或updatePhysics
中递增。所以updatePhysics
变为:
function updatePhysics() {
projectilePosition = interceptionCalculationService.positionAtTime(currentTime);
currentTime++;
}
currentTime
在线程的构造函数中初始化为0。这使我的动画流畅。