Разработка Android: Thread.sleep просто замедляет игру - PullRequest
1 голос
/ 15 июля 2011

У меня есть:

@Override
    public boolean onTouchEvent(MotionEvent event) {
        synchronized (event)  
        {  

        try {
            Thread.sleep(16);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if(event.getAction() == MotionEvent.ACTION_DOWN){

          isDown = true;
        }else if(event.getAction() == MotionEvent.ACTION_MOVE){

          isDown = true;
        }else if(event.getAction() == MotionEvent.ACTION_UP){

         isDown = false;
        }

        return true;
        } 

    }

Тогда в моем MainGame thread я использую setCharacterPosition();

 public void setCharacterPosition(){
    if(isDown){
CharacterX += 32;
}
    }

но это заставляет моего персонажа слишком быстро бегать, поэтому я попытался добавить:

Thread.sleep(500);

Потому что я хочу, чтобы мой персонаж увеличивался с 32 каждые полсекунды.

ЭТО работает, но мой FPS уменьшен до 2-3.

Как мне сделать это правильно?

// Simon

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Я мало знаю о Java или Android, но это кажется неправильным способом сделать это.

Что вам нужно, так это настроить игровой цикл (цикл, который непрерывно запускается и обновляет игровую логику, кадр за кадром).

Этот цикл выполняется через определенные интервалы времени (обычно 60 кадров в секунду или, возможно, меньше на мобильной платформе).

В каждом кадре вы можете масштабировать движения игрового объекта в зависимости от времени, прошедшего с последнего кадра.

Это дает масштабированное движение, не зависящее от тактовой частоты используемого вами устройства.

Узнайте больше об игровых циклах в этих прекрасных ресурсах:

Простой цикл игр для Android на Java

Игровой цикл

Игровой цикл Android

0 голосов
/ 15 июля 2011

Пользовательский интерфейс Android основан на однопоточной модели, поэтому не блокируйте пользовательский интерфейс.Ваше onTouchEvent выполняется в потоке пользовательского интерфейса ... когда вы вызываете Thread.sleep, вы заставляете свой поток пользовательского интерфейса переходить в спящий режим на этот конкретный период времени.

Надеюсь, что эта справка.Ссылка: Безболезненная резьба

...