如何创建一个可以渲染的简单窗口?

时间:2013-11-27 19:56:09

标签: java swing vector 2d transformation

我刚刚完成了一个2D矢量/转换库,我想在一个简单的例子中使用它。我有一个有效运行的主循环和更新/渲染方法。我总是试图理解人们在使用Java2D或jPanels或jFrames时所谈论的内容,但对我来说没有任何意义。

之前我已经制作了一些2D示例,但它使用了一个带有Threaded画布的jFrame,这是我在关注youtube教程时所做的。它的问题是它基本上是一个整数数组,允许单独的像素设置,你只能使用整数作为位置,而不是我的库使用的浮点数。

所以我的问题是:我怎样才能创建一个简单的打开/关闭窗口,我可以绘制一个精灵(应该是sprite只是某种slickUtil加载的东西,或者我必须加载单个像素,因为我之前做过吗?)到,并接受笛卡尔坐标的浮点值,原点位于中心。

1 个答案:

答案 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));
    }
}