2013-07-02 2 views
1

Я нашел тренинг для создания 2D-графической игры в Интернете и базы на том, что я написал код ниже, но когда я скомпилирую это, ничего не происходит! Он просто показывает окно, в котором ничего нет. используя drawString и drawLine, я действительно надеялся увидеть что-то, но окно пусто! в чем проблема ? - код неправильный? или я использую неправильные методы?использование буферов в java-графике

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics2D; 
import java.awt.image.BufferStrategy; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends Canvas { 
    BufferStrategy strategy; 
    boolean gameRunning = true; 

     public Game() {  
      JFrame jf = new JFrame("My Graphic thingy !"); 

     JPanel panel = (JPanel) jf.getContentPane(); 
     panel.setPreferredSize(new Dimension(800, 600)); 
     panel.setLayout(null); 

     setBounds(0, 0, 800, 600); 
     panel.add(this); 

     setIgnoreRepaint(true); 
     jf.pack(); 

     jf.setResizable(false); 
     jf.setVisible(true); 

     jf.createBufferStrategy(2); 
     strategy = jf.getBufferStrategy(); 

    } 

    public void gameLoop() { 
     long lastLoopTime = System.currentTimeMillis(); 
     while (gameRunning) { 
      lastLoopTime = System.currentTimeMillis(); 

      Graphics2D g = (Graphics2D) strategy.getDrawGraphics(); 
      g.setColor(Color.black); 
      g.fillRect(0, 0, 800, 600); 
      g.drawString("HellO", 12,12); 
      g.drawLine(10, 10, 30, 30); 
      g.dispose(); 
      strategy.show(); 
      try { 
        Thread.sleep(2000); 
      } catch (Exception e) { 
      } 
     } 
    } 
    public static void main(String[] args) { 
     Game g = new Game(); 

     g.gameLoop(); 
    } 

} 

ответ

5

Ваш текущий цикл, вероятно, перевязать Свинг E вентиляционный D ispatch T hread или EDT, эффективно замораживание приложения с этого всеми важными нитями предотвращено делать то, что он должен do - отрисовка вашего приложения и реагирование на ввод пользователя. Вам нужно учитывать потоки, убедившись, что цикл запущен в фоновом потоке.

Сказав это, я должен задать вопрос о качестве, своевременности и актуальности вашего учебника, если он рекомендует, чтобы вы кодировали компоненты AWT, такие как Canvas, и если он рекомендует использовать нулевой макет и абсолютное позиционирование компонентов (т. Е. использование setBounds(...)). Вам будет намного лучше использовать все компоненты Swing и Swing в соответствии с учебными пособиями.

Пожалуйста, обратите внимание на:


Редактировать: также,

  • Вы не должны пытаться рисовать непосредственно в JFrame, а скорее рисовать в JPanel, обычно в своем методе paintComponent(...), хотя некоторые игры выполняют разные вещи и используют активный рендеринг, а не типичный пассивный рендеринг.
  • Не используйте тот же цвет для фона, что и для текста чертежа, поскольку, если они одинаковы, вы никогда не увидите текст.

Edit 2: например,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class Game2 extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 600; 
    private static final int TIMER_DELAY = 50; 
    private static final int DELTA_WIDTH = 50; 
    private static final Color HELLO_COLOR = new Color(150, 150, 255); 
    private int delta = 0; 
    private BufferedImage img; 

    public Game2() { 
     img = createMyImage(); 
     setBackground(Color.BLACK); 
     new Timer(TIMER_DELAY, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      delta++; 
      repaint(delta - 10, delta - 10, DELTA_WIDTH + 20, DELTA_WIDTH + 20); 
     } 
     }).start(); 
    } 

    private BufferedImage createMyImage() { 
     BufferedImage myImg = new BufferedImage(DELTA_WIDTH, DELTA_WIDTH, 
      BufferedImage.TYPE_INT_ARGB); 
     Graphics g = myImg.getGraphics(); 
     g.setColor(HELLO_COLOR); 
     g.drawString("Hello", 12, 12); 
     g.setColor(Color.red); 
     g.drawLine(10, 10, 30, 30); 

     g.dispose(); 
     return myImg; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(img, delta, delta, this); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Game2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new Game2()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
Смежные вопросы