如何让我的动画不那么生涩?

时间:2011-10-23 18:02:30

标签: android animation

我正在编写一个小游戏作为编程任务的一部分。我有我的精灵/图像以我想要的方式移动,除非它们非常生涩。这是我如何加载图像:

//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,但我无法弄清楚如何使用它。

这是我第一次写游戏和做图形/动画,所以我不太清楚最佳实践甚至工具。我通过查阅大量的教程来实现这一目标。

2 个答案:

答案 0 :(得分:0)

是的,doDraw方法的调用速度与处理器可以处理和操作系统允许的速度一样快,这意味着它受其他进程的影响,也意味着它使用了大量的处理器时间。作为一个相当简单但不推荐的解决方案,在while循环中添加Thread.Sleep(50)。查看如何使用计时器进行动画制作。

答案 1 :(得分:0)

我的解决方案是停止依赖系统时间并使用名为currentTime的变量(即线程的私有成员),该变量在doDrawupdatePhysics中递增。所以updatePhysics变为:

function updatePhysics() {
    projectilePosition = interceptionCalculationService.positionAtTime(currentTime);
    currentTime++;
}

currentTime在线程的构造函数中初始化为0。这使我的动画流畅。