gpt4 book ai didi

java - Graphics2D 不在 Canvas 上绘制

转载 作者:行者123 更新时间:2023-11-29 04:17:23 25 4
gpt4 key购买 nike

我正在制作一个游戏,其中屏幕需要在一组程序(不是连续每一帧)后更新,我制作了一个较小的程序来测试 Graphics2D 绘图。在这个程序中,我只想在角落里画一个小矩形。但是,矩形似乎没有绘制。我不确定我是否误解了 BufferStrategy 的使用(即有更好的方法以这种方式更新游戏),但我尝试调用 draw 方法两次以确保 graphics2D 对象存在且不为空。

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();
}
}

最佳答案

好的

你们中的大多数代码都非常接近于实现您想要完成的目标。只是组织有点不对,类实例的创建有点乱。

坏事

一般来说,最好不要混合使用 Java Swing 元素 (JFrames)带有 AWT 元素 (Canvas) .而且我真的不知道您使用 BufferStrategy 的动机是什么。此外,处理 Java Swing 组件及其对 paintComponent 的奇怪零星调用可能会给游戏开发带来痛苦。

丑陋的

您可能不得不切换到 Swing 并使用线程,因为这将是一个更干净的解决方案。如果您正在制作的游戏相对图形密集,您将需要使用 OpenGL或者更好的是,一个基于 OpenGL 的包装器库,比如 LWJGL或者我最喜欢的,LibGDX .

但目前,这里有一个工作示例,就像您尝试使用 Oracle's Custom Painting Tutorial 制作的示例一样:

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();
}
}

如果您有任何问题,请告诉我。

注意:类名应始终大写。

关于java - Graphics2D 不在 Canvas 上绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51484473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com