我刚刚完成了一个2D矢量/转换库,我想在一个简单的例子中使用它。我有一个有效运行的主循环和更新/渲染方法。我总是试图理解人们在使用Java2D或jPanels或jFrames时所谈论的内容,但对我来说没有任何意义。
之前我已经制作了一些2D示例,但它使用了一个带有Threaded画布的jFrame,这是我在关注youtube教程时所做的。它的问题是它基本上是一个整数数组,允许单独的像素设置,你只能使用整数作为位置,而不是我的库使用的浮点数。
所以我的问题是:我怎样才能创建一个简单的打开/关闭窗口,我可以绘制一个精灵(应该是sprite只是某种slickUtil加载的东西,或者我必须加载单个像素,因为我之前做过吗?)到,并接受笛卡尔坐标的浮点值,原点位于中心。
答案 0 :(得分:3)
从JComponent派生一个类并覆盖paintComponent方法。它传递一个Graphics对象,可以将其转换为Graphics2D对象。后者支持改变坐标系。
对于绘制精灵:在循环中加载单个像素非常慢。在Graphics2D中有一个drawImage方法,它支持blitting sprite所需的一切。
以下是在自包含示例中设置具有居中原点的Graphics2D对象的示例:
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Line2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class Draw2D extends JFrame {
public Draw2D() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout());
add(new DrawPane(), BorderLayout.CENTER);
pack();
}
public static void main(String[] args) {
Draw2D drawing = new Draw2D();
drawing.setVisible(true);
}
}
class DrawPane extends JComponent {
public DrawPane() {
setPreferredSize(new Dimension(640, 640));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// use anti-aliasing for smooth lines
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// move origin to center
g2.translate(getWidth() / 2, getHeight() / 2);
// scale as you need. Using negative y so that y points upward
// note that non-square window sizes will cause a different aspect ratio,
// you probably want to use Math.min(width, height) or something
g2.scale(getWidth() / 2, -getHeight() / 2);
// set color and thickness
g2.setColor(Color.red);
g2.setStroke(new BasicStroke(0.001f));
// draw coordinate lines
g2.draw(new Line2D.Float(-1f, 0f, 1.0f, 0f));
g2.draw(new Line2D.Float(0, -1.0f, 0.0f, 1.0f));
// draw a vector
g2.draw(new Line2D.Float(0f, 0f, 0.25f, 0.25f));
}
}