2013-10-15 2 views
0

Я пытаюсь заставить игру изменить волну кротов каждые 0,8 секунды. (Моя игра просто «кроты, для занятий)Slick2D рендеринг каждый 0,8

Мой код для изменения волны:.

double TIME = 0.8; 

if (Next) { //If 0.8 seconds is up 
     if (Over == false) { //make sure the game hasn't ended 
      start = (int) (cTime/1000); //cTime is the milisecond since game started 
      String wave = MolesWaves.RandomWave(); //getting the new wave data 
      initWave(wave); 
      Next = false; //disallow the game from changing wave 
     } 
    } 
    else { 
     if (((cTime/1000) - start) >= TIME) { //changing speed 
      System.out.println("Test: " + ((cTime/1000)-start)); 
      Next = true; //allow game to change waves 
     } 
    } 

Из System.out.println("Test: " + ((cTime/1000)-start));, это то, что я получаю от выходного журнала

Test: 0.802 
Test: 0.817 
Test: 0.833 
Test: 0.852 
Test: 0.867 
Test: 0.883 
Test: 0.9 
Test: 0.917 
Test: 0.933 
Test: 0.95 
Test: 0.967 
Test: 0.983 
Test: 1.0 
.

Проблема состоит в том, что волны изменяются 13 раз в секунду, они прекращают переключение, когда они достигают каждую секунду, а затем снова запускают ее.
Если значение TIME равно 1, ev все в порядке. Волны меняются каждые 1 секунда.
Я использую 0,8, поскольку я пытаюсь реализовать выбор сложности (легкий, средний, жесткий ...) Чем сложнее, тем быстрее изменяется волна.

Является ли код выше виновником моей проблемы? Если это так, пожалуйста, решите это для меня.

ответ

1

Мы не видим тип start, но я предполагаю, что это double. Если да преступник эта линия:

start = (int) (cTime/1000); //cTime is the milisecond since game started 

Представьте cTime 900 и последняя волна началась во время 0 (поэтому новая волна должна начинать). Затем, когда начнется эта новая волна, вы установите start = (int)(900/1000); Это усекающее целочисленное деление, поэтому новое значение start равно 0. Но это то же самое, что и старое значение - так как ничего не изменилось, новая волна начнется снова сразу же в следующий раз, когда будет проверено время.

Вместо того чтобы делать целочисленное деление, преобразование целое CTIME в double и выполнять деление и сравнение с плавающей точкой:

start = ((double) cTime)/1000.0; 
// ... 
if ((((double)cTime/1000.0) - start) >= TIME) { //changing speed 

Новое значение start в приведенном выше сценарии должны затем быть 0.9, и новый раунд должен быть продлен на 0,8 секунды.

+0

Спасибо за объяснение! – junyi00

Смежные вопросы