2015-12-25 2 views
-5

У меня проблема с моей java-игрой. Я новичок, но я должен написать это как школьный проект.
Игра называется «Торт на день рождения» на торте есть 7 свечей, и случайным образом один из них показывает, что можно сказать 30 секунд, и в течение этого времени вам нужно щелкнуть по нему, чтобы получить точку, если вы не нажмете на нее во время на этот раз следующая свеча покажет. Игра заканчивается, когда появляется 10 свечей.
Я сделал для цикла, и я попытался заставить его работать для sooo long, что я умираю от разочарования
my for loop работает, но он настолько быстр, что я использую Thread.sleep (1000), я попробовал множество решений выглядит нормально. НО, когда я начинаю свою игру, ничего не происходит, и через несколько секунд все 7 свечей показывают и быстро исчезают. Я думаю, что я делаю что-то неправильно, но я понятия не имею, что.JAVA GAME loop?

if(Dane.start){ 

     int liczbaLosowa = 0; 

     for(int i=0; i<10 ;i++){ 
      liczbaLosowa = (int)(Math.random()*7); 

      this.wspX= wspX_p[liczbaLosowa]; 
      this.wspY= wspY_p[liczbaLosowa]; 
      g2d.drawImage(plomienImg, wspX, wspY,null); 
      Toolkit.getDefaultToolkit().sync(); 
      try { 
       Thread.sleep(1000);  
      } catch (Exception ex) { } 
      //repaint(); 
     } 
     Dane.start=false; 

     } 
+0

Это качели? Является ли это вызвано потоком событий Swing? Код выглядит так: 1) иметь потенциометр, чтобы весь ваш графический интерфейс спать, и 2) бросать NullPointerExceptions из-за неправильного использования объекта Graphics. Если Swing, есть способы исправить это, включая использование таймера Swing, используя объект Graphics внутри метода paintComponent JPanel или, еще лучше, заменяя ImageIcons JLabel. Пожалуйста, дайте нам больше информации и помогите нам лучше понять вашу проблему и код. –

+0

да, это на Swing, эта петля внутри JPanel paintComponent, я загружаю изображения с помощью BufferedImage – Miszel

+0

В Google так много всего от игрового цикла от простых до сложных. – Steven

ответ

5

этот цикл находится внутри JPanel paintComponent ...

Никогда,
Никогда,

НИКОГДА НЕ

вызов Thread.sleep(...) внутри paintComponentкогда-либо. Пожалуйста, поймите, что этот метод в значительной степени определяет воспринимаемую отзывчивость вашей программы и все, что замедляет ее или замораживает, она сильно замедлит и заморозит ваш графический интерфейс. На самом деле вы никогда не должны вызывать Thread.sleep внутри кода большинства программ Swing (все, что работает в потоке событий Swing), но это в paintComponent является еще более сильным грехом. Решение состоит в том, чтобы использовать Swing Timer и поместить код, который вы хотите вызывать многократно через регулярные промежутки времени в действии обработчика ActionListener Timer. В рамках этого метода измените значение, удерживаемое полями в вашем классе, например wspX и wspY, вызовите repaint(), а затем используйте эти поля внутри paintComponent, чтобы определить, что будет раскрашиваться там.

+0

спасибо, что я использовал Swing Timer, и он работает :) теперь я могу сосредоточиться на mouseEvent – Miszel

+1

Ever, ever, EVER! +1 – MadProgrammer

0

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

Я рекомендую выполнять выполняемые функции и помещать вашу петлю в ваш метод запуска.

public void run(){ 

    init(); //initialisation of images, sound..etc. will be executed once only 

    int fps = 60 //number of update per second. 
    double tickPerSecond = 1000000000/fps; 
    double delta = 0; 
    long now; 
    long lastTime = System.nanoTime(); 

    while(running){ 

     now = System.nanoTime(); 
     delta += (now - lastTime)/tickPerSecond; 
     lastTime = now; 

     if(delta >= 1){ 

      tick(); 
      render(); 
      delta--; 
     } 
    } 
} 

private void init(){ 

    //initialisation image, sound, loading world, generate maps....etc 
} 

private void tick(){ 

    //tick player, world, entities..etc 
} 

private void render(){ 

    //render graphics. 
} 

также не забудьте создать способ начала и остановки потока. вы можете изменить fps на какой номер вы хотите, не нужно идти выше 60.