Как сделать анимацию менее резкой? - PullRequest
2 голосов
/ 23 октября 2011

Я пишу небольшую игру как часть задания по программированию. Мои спрайты / изображения перемещаются так, как я хочу, за исключением того, что они очень резкие. Вот как я загружаю изображение:

//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 голосов
/ 25 октября 2011

Мое решение состояло в том, чтобы перестать полагаться на системное время и использовать переменную (которая является частным членом потока) с именем currentTime, которая увеличивается на doDraw или updatePhysics. Так updatePhysics становится:

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

currentTime инициализируется в 0 в конструкторе потока. Это сделало мою анимацию гладкой.

0 голосов
/ 24 октября 2011

Да, метод doDraw вызывается настолько быстро, насколько позволяет процессор, и операционная система позволяет, что означает, что на него влияют другие процессы, а также означает, что он использует тонну процессорного времени. Как довольно простое, но не рекомендуемое решение, добавьте Thread.Sleep (50) в цикл while. Посмотрите, как использовать таймеры для анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...