N3m*_*3mo 1 java graphics swing
我找到了在互联网上创建2D图形游戏的培训,并且基于我编写下面的代码,但是当我编译时,没有任何反应!它只显示一个没有任何内容的窗口.通过使用drawString和drawLine我真的希望看到一些东西,但窗口是空的!有什么问题 ?代码错了吗?或者我使用了错误的方法?
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();
}
}
Run Code Online (Sandbox Code Playgroud)
您当前的循环可能会占用Swing E vent D ispatch T hread或EDT,从而有效地冻结您的应用程序,因为所有重要的线程都无法执行必要的操作 - 呈现应用程序并响应用户输入.您需要通过确保循环在后台线程中运行来考虑线程.
话虽如此,如果建议您使用Canvas等AWT组件进行编码,并且建议您使用null布局和组件的绝对定位(即使用setBounds(...)),我必须质疑教程的质量,及时性和相关性.根据教程,使用所有Swing组件和Swing图形会好得多.
请看看:
编辑:还,
paintComponent(...)方法中绘制JPanel ,尽管某些游戏以不同的方式执行操作并使用主动渲染而不是典型的被动渲染.编辑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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)