我正在制作一个游戏,在该游戏中,需要按照一系列程序(而不是每帧连续进行)更新屏幕,并且我制作了一个较小的程序来测试Graphics2D绘图。在此程序中,我要做的就是在角落绘制一个小矩形。但是,矩形似乎没有绘制。我不确定是否误解了BufferStrategy的用法(即,有一种更好的方式可以以此方式更新游戏),但是我尝试两次调用draw方法以确保graphics2D对象存在并且不为null。 / p>
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import javax.swing.*;
public class test extends Canvas
{
private JFrame testWindow = new JFrame("Test");
public test()
{
createUI();
}
public static void main(String[] args)
{
new test();
}
public void createUI()
{
testWindow.setSize(500,500);
testWindow.setLayout(null);
testWindow.setLocationRelativeTo(null);
testWindow.setResizable(false);
testWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testWindow.add(this);
testWindow.setVisible(true);
draw();
draw();
}
public void draw()
{
BufferStrategy bs = this.getBufferStrategy();
System.out.println(bs);
//when the program runs this prints null once and then an identifier
if(bs == null)
{
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.RED);
g2.fillRect(10,10,100,100);
g2.dispose();
bs.show();
}
}
答案 0 :(得分:2)
大多数代码都非常接近您要完成的任务。只是组织有点差,您创建的类实例有点混乱。
通常,最好不要将Java Swing元素(JFrames)与AWT元素(Canvas)混合使用。而且我真的不知道您使用BufferStrategy的动机是什么。而且,处理Java Swing组件及其对paintComponent的怪异零星调用可能会给游戏开发带来痛苦。
您可能将不得不切换到Swing并使用线程,因为这将是一种更干净的解决方案。而且,如果您要制作的游戏甚至需要大量图形,那么您将希望使用OpenGL或更高版本,例如LWJGL或我最喜欢的{{3} }。
但是暂时,这是一个工作示例,例如您尝试使用LibGDX制作的示例:
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class Test {
private static JFrame testWindow;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createUI();
}
});
}
private static void createUI() {
testWindow = new JFrame("Test");
testWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testWindow.add(new MyPanel());
testWindow.pack();
testWindow.setVisible(true);
}
}
class MyPanel extends JPanel {
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
}
public Dimension getPreferredSize() {
return new Dimension(500,500);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.RED);
g2.fillRect(10,10,100,100);
g2.dispose();
}
}
如果您有任何疑问,请告诉我。
注意:类名应始终大写。