2015-11-19 3 views
0

Итак, у меня есть несколько примеров, когда я хочу, чтобы «заморозить» состояние моей игры. Это скроллер сверху вниз, и я хочу дать игроку возможность приостановить прокрутку экрана в течение короткого времени, используя powerup (если вы упадете в нижнюю часть экрана, который вы умрете). Я также хочу приостановить игру, поскольку она начинается, и нарисуйте 3, 2, 1, идите! чтобы дать игроку время, чтобы подготовиться, потому что прямо сейчас, как только вы нажмете игру, экран начнет прокрутку.Как я могу надежно приостановить состояние игры?

Я использую таймер для выполнения этого, однако он не работает, если я хочу заморозить экран в последовательных случаях. Как если игрок использует замораживание, экран успешно замерзает, но если они быстро используют другое замораживание, это не сработает. Кажется, происходит непреднамеренное охлаждение. У меня есть аналогичная проблема для «задержки ввода», которую я объяснил ранее. По какой-то причине он работает только на первых двух уровнях. Вот как я использую таймер.

if(gameState != STATE.frozen) { 
     camera.translate(0, (float) scrollSpeed); 
     staminaBar.setPosition(staminaBar.getX(), (float) (staminaBar.getY()+scrollSpeed)); 
     staminaMeter.setPosition(staminaMeter.getX(), (float) (staminaMeter.getY()+scrollSpeed)); 
     healthBar.setPosition(healthBar.getX(), (float) (healthBar.getY()+scrollSpeed)); 
     healthMeter.setPosition(healthBar.getX(), (float) (healthMeter.getY()+scrollSpeed)); 
     boostBar.setPosition(boostBar.getX(), (float) (boostBar.getY()+scrollSpeed)); 
     boostMeter.setPosition(boostMeter.getX(), (float) (boostMeter.getY()+scrollSpeed)); 
     screenCeiling += (float) scrollSpeed; 
     screenFloor += (float) scrollSpeed; 
    } 
    else { 

     Timer.schedule(new Task() {   //freeze the screen for 5 seconds 

      @Override 
      public void run() { 

       gameState = STATE.playing; 

      } 
     }, 5); 

    } 

Из того, что я понимаю, он ждет 5 секунд, прежде чем возобновить игру до состояния «воспроизведения». Но, как я уже сказал, это работает только при активации между большими интервалами, и я не знаю, почему. Есть ли лучший способ, которым я могу это сделать?

Что касается задержки ввода, это может быть вопрос лучше заданный отдельно, но я использую тот же метод, но он не позволяет мне рисовать спрайты поверх моей таблицы, так что если кто-нибудь знает, как это сделать, в вашем ответе

ответ

0

Предполагая, что код, который вы отправили, находится в цикле рендеринга, тогда всякий раз, когда вы не находитесь в замороженном состоянии, вы создаете новую задачу таймера на каждом кадре. Поэтому, если вы замерзаете в течение 5 секунд и ваша игра работает со скоростью 60 кадров в секунду, вы создадите 300 заданий таймера, каждый из которых заставит игру вернуться к состоянию игры. Последний не будет срабатывать до 5 секунд после первого выстрела, так что будет пять секунд «кулдауна», в течение которого вы не сможете изменить состояние ни к чему, кроме playing, потому что на каждом кадре будет срабатывать другая задача таймера то время.

Вам необходимо убедиться, что вы создаете только одну задачу таймера, только когда вы впервые вводите состояние frozen.

У меня есть предложение ... вместо использования состояния, чтобы заморозить игру, используйте переменную, которая умножается на scrollSpeed. Измените эту переменную от одного до нуля, когда плеер использует powerup.Затем вы можете делать причудливые вещи, такие как быстрая интерполяция от одного до нуля, поэтому изменение скорости не так круто. И это, вероятно, упростит ваш код, поскольку в алгоритме должно быть одно меньшее состояние, которое должно выполняться по-разному.

+0

Как создать таймер 300 раз, если ему разрешено только когда игра находится в замороженном состоянии? Потому что у меня он настроен, если (не заморожен) прокрутка, иначе (новый таймер). и он становится только замороженным, если игрок берет предмет и нажимает пробел. Или вы говорите, как только он заморожен, он создает 300 таймеров, я думаю, что я получаю его, тогда – Darren

+0

'render' вызывается снова и снова. Когда вы впервые вводите 'STATE.frozen', он создаст таймер, когда он достигнет этой точки в коде. В один кадр позже вы все еще находитесь в 'STATE.frozen', когда он добирается до этой точки в коде, поэтому создается еще один таймер. Это будет продолжаться в каждом кадре, пока не погаснет первый таймер и не изменит состояние на 'play'. Теперь на каждом кадре другой таймер достигнет своего предела и загорается до тех пор, пока не будет выполнен последний из 300 таймеров. Только тогда вы сможете изменить состояние и зафиксировать его. – Tenfour04

0

Проверьте переменную gameState в способе рендеринга, и если игра идет, обновите игру, как обычно, и нарисуйте ее.

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

endTime = TimeUtils.millis()+5000; 

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

Вы должны иметь еще один логический флаг, поэтому вы устанавливаете только один раз endTime (вы не хотите каждый раз переустанавливать его в цикле рендеринга), или если «STATE» является перечислением, вариант «justPaused» для точного кадра, который вы приостанавливаете игру, установите время окончания, затем установите STATE в «notPlaying».

Вы также можете использовать это, чтобы создать альтернативный метод «обновления», в котором вы можете обновить спрайты обратного отсчета, но не обновлять саму игру. Когда игра воспроизводится, этот другой метод обновления будет пропущен.