2012-05-30 4 views
0

Я работаю над этой видеоигрой с кучей монстров, которые проходят по экрану. Проблема в какой-то момент, когда монстр проходит мимо области (идет выше y-координаты) и должен пройти весь путь назад. Я получил предложение сделать эту передачу снизу вверх, задержанной случайным количеством времени (0, 1, 2 или 3 секунды). Прямо сейчас, он просто поднимается на вершину без каких-либо перерывов. Моя проблема заключается в реализации этого разрыва. Я пробовал различные методы, такие как сваливания с петлей, как показано нижеЗавершение программы без потоков

  // if(monster is below 400 on y-axis 
     if(sbgBackFootY[ i ] >= 400) { 
      // random number that determines how long it will take to go to top 
      int randCo = (int) (Math.random() * 3); 

      if(randCo == 0) { 
       //moves monster to top 
       sbgHeadX[ i ] = 200; 
       sbgHeadY[ i ] = 80; 
       sbgMouthX[ i ] = 206; 
       sbgMouthY[ i ] = 110; 
       sbgBackX[ i ] = 190; 
       sbgBackY[ i ] = 95; 
       sbgBackFootX[ i ] = 190; 
       sbgBackFootY[ i ] = 115; 
       sbgFrontFootX[ i ] = 197; 
       sbgFrontFootY[ i ] = 115; 
       sbgLeftEyeX[ i ] = 205; 
       sbgLeftEyeY[ i ] = 90; 
       sbgRightEyeX[ i ] = 215; 
       sbgRightEyeY[ i ] = 90; 
       sbgLeftEyebrowStartX[ i ] = 203; 
       sbgLeftEyebrowStartY[ i ] = 83; 
       sbgLeftEyebrowEndX[ i ] = 210; 
       sbgLeftEyebrowEndY[ i ] = 90; 
       sbgRightEyebrowStartX[ i ] = 220; 
       sbgRightEyebrowStartY[ i ] = 83; 
       sbgRightEyebrowEndX[ i ] = 215; 
       sbgRightEyebrowEndY[ i ] = 90; 

      } 

      if(randCo == 1) { 
       //loop is supposed to stall program 
       for(int w = 0; w <= 1000000000; w++){ 
        SBGco[ i ]++; 
       } 

       if(SBGco[ i ] == 1000000000) { 
        //moves monster to top 
        sbgHeadX[ i ] = 200; 
        sbgHeadY[ i ] = 80; 
        sbgMouthX[ i ] = 206; 
        sbgMouthY[ i ] = 110; 
        sbgBackX[ i ] = 190; 
        sbgBackY[ i ] = 95; 
        sbgBackFootX[ i ] = 190; 
        sbgBackFootY[ i ] = 115; 
        sbgFrontFootX[ i ] = 197; 
        sbgFrontFootY[ i ] = 115; 
        sbgLeftEyeX[ i ] = 205; 
        sbgLeftEyeY[ i ] = 90; 
        sbgRightEyeX[ i ] = 215; 
        sbgRightEyeY[ i ] = 90; 
        sbgLeftEyebrowStartX[ i ] = 203; 
        sbgLeftEyebrowStartY[ i ] = 83; 
        sbgLeftEyebrowEndX[ i ] = 210; 
        sbgLeftEyebrowEndY[ i ] = 90; 
        sbgRightEyebrowStartX[ i ] = 220; 
        sbgRightEyebrowStartY[ i ] = 83; 
        sbgRightEyebrowEndX[ i ] = 215; 
        sbgRightEyebrowEndY[ i ] = 90; 

       } 
      } 

Но компьютер вычисляет слишком быстро, так что ж переменная становится 1000000000 путь слишком быстро. Другой способ сделать это - создать потоки и запустить Thread.sleep (randCo) или что-то в этом роде, но я стараюсь не многопоточно. Есть ли другой способ, которым я могу это сделать?

ответ

1

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

1

Я думаю, что Thread.sleep (..) - ваш лучший вариант. Если у вас есть один поток, и вы его спали, это не значит, что у вас многопоточность.

+0

Не думайте, что он может нить спать. Если я понимаю его правильно, единственный поток отображает * всех * его монстров, поэтому, если вы пропустите сна, все монстры остановятся (в отличие от тех, кто перемещается по границам) – Michael

+0

@Michael. Во втором чтении вопроса, я думаю, вы Верно. Он должен пойти с решением Эндрю. – tibtof

0

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

int initTime= 0; 
int elapsedTimeOffScreen = 0 

if(sbgBackFootY[ i ] >= 400) { 
if(initTime!= 0) 
    initTime= DateTime.Now; 
elapsedTimeOfScreen = DateTime.Now - initTime; 

if(elapsedTimeOffscreen > 1000) 
{ 
    initTime = 0 
    elapsedTimeOffScreen = 0; 
//go back on screen 
} 

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

+0

Не обескураживайте, ваш тоже хорош. Я использовал ту часть, где вы предложили использовать системное время. Спасибо. – kullalok

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