java - 如何制作一个可以渲染的简单窗口?

标签 java swing vector 2d transformation

我刚刚完成了一个 2D vector/转换库,我想在一个简单的示例中使用它。我有一个有效运行的主循环和更新/渲染方法。我一直试图理解人们在使用 Java2D 或 jPanels 或 jFrames 时所谈论的内容,但这些对我来说都毫无意义。

我之前制作过一些 2D 示例,但它使用的是带有线程 Canvas 的 jFrame,这是我在遵循 YouTube 教程时制作的。它的问题是它基本上是一个整数数组,允许单独的像素设置,并且您只能使用整数作为位置,而不是像我的库使用的 float 。

所以我的问题是:我将如何制作一个简单的打开/关闭窗口,我可以绘制一个 Sprite ( Sprite 应该只是某种 slickUtil 加载的东西,还是我必须加载单个像素,因为我之前做过吗?)到,并且接受以原点为中心的笛卡尔坐标的浮点值。

最佳答案

从 JComponent 派生一个类并重写 PaintComponent 方法。它传递一个可以转换为 Graphics2D 对象的 Graphics 对象。后者支持更改坐标系。

对于绘制 Sprite :在循环中加载单个像素非常慢。 Graphics2D 中有一个drawImage 方法,它支持位图传送 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));
    }
}

关于java - 如何制作一个可以渲染的简单窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20251888/

相关文章:

java - 如何创建具有外观和感觉的 TableCellRenderer?

java - 结果集(getter/setter 类)对象在第二次执行时不删除旧值

C++ vector 或 Queue 在内存和速度方面构建大 Q

c++ - 如何绘制存储在 vector 中的 SFML 形状

java - 切换到选项卡式 Activity 中的第一个选项卡在 Android 中无法正常工作

java - 如何使用 ProGuard(或任何其他方式)隐藏库 Jar 中的公共(public)类?

java - 如何获取Ext Tree子节点的id?

java - 我无法在jsp页面中包含css文件

java - 如何从另一个组件的监听器为 JTable 设置表模型?

c++ - 仅当类型匹配时如何在 std::vector 上添加元素