2016-11-29 5 views
0

Я пытаюсь написать игру, в которой игрок является персонажем, бесконечно падающим на Землю. Тем не менее, я застрял в самом начале, программируя прокручивающийся фон. Мой текущий подход заключается в создании JFrame и добавлении к нему объекта класса, который расширяет JFrame. В этом втором классе я открываю фоновое изображение в конструкторе. Затем в первом классе я создаю новый поток для второго класса и чередую спать и перемещая y-координату фона. Вернемся ко второму классу, это движение вызывает перерисовку, и изображение рисуется дважды, один раз в y-координате и один раз на y-координате минус высота JPanel. Этот текущий код дает желаемый эффект при любом заданном кадре, но движение происходит медленно и неравномерно. Я думаю, что это имеет какое-то отношение к количеству запросов на перерисовку, но я довольно новичок в графике в java. Мой вопрос в том, может ли это быть исправлено, чтобы изображение неуклонно перемещалось по экрану, или я должен попробовать совершенно другой подход? Если мой текущий метод в корне ошибочен и не может быть исправлен, не могли бы вы спросить, как я могу создать гладкое движущееся изображение? Заранее спасибо.Написание вертикальной прокрутки в java

Это мой текущий код:

//ScrollingImage.java 
import javax.swing.JFrame; 

public class ScrollingImage { 
     public static void main(String[] args){ 
       JFrame holder = new JFrame("New Game"); 
       Background background = new Background(); 
       Thread thread = new Thread(background); 

       holder.setSize(400, 400); 
       holder.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       holder.add(background); 

       holder.setVisible(true); 

       thread.start(); 
       while (true){ 
         background.move(); 
         try { 
           thread.sleep(100); 
         } 
         catch (InterruptedException e){} 
       } 
     } 
} 

и:

//Background.java 
import javax.swing.JPanel; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import javax.imageio.ImageIO; 
import java.io.File; 

public class Background extends JPanel implements Runnable { 
     private BufferedImage image; 
     private int topEdgeY; 

     public Background(){ 
       try { 
         image = ImageIO.read(new File("background.png")); 
       } 
       catch (Exception e){} 
       topEdgeY = 0; 
     } 

     public void run(){ 
       repaint(); 
     } 

     public void paintComponent(Graphics g){ 
       super.paintComponent(g); 
       g.drawImage(image, 0, topEdgeY, getWidth(), getHeight(), this);  
       g.drawImage(image, 0, topEdgeY - getWidth(), getWidth(), getHeight(), this); 
     } 
     public void move(){ 
       topEdgeY += 5; 
       if (topEdgeY == getWidth()) 
        topEdgeY = 0; 
       repaint(); 
     } 
} 

ответ

0

Вам нужен правильный цикл игры. В настоящее время ваша игра спит по 100 мс после каждой итерации, то есть (даже если ваше обновление и рендеринг не занимает времени) 10 кадров в секунду и будут еще ниже, так как ваша игра будет выполнять больше работы.

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

Хорошая статья о петлях игры, надеюсь, это будет заставляет вас понять: http://gameprogrammingpatterns.com/game-loop.html

И очень хороший пример, написанный на Java: http://www.java-gaming.org/index.php?topic=24220.0

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