java - 如何从外部未知类为 2D 游戏引擎 API 进行绘制

标签 java eclipse swing 2d paint

我正在尝试为目前正在编写的 2D 游戏引擎制作 API。我在包外部有一个加载器类,我希望有一个 jpanel 或能够使用包外部的加载器类并调用引擎来添加 jpanel,这样我就可以在 API 内部的加载器类上进行绘制,这样人们就可以简单地编写而无需需要源代码。

这是我的 Engine 类和 Loader 类

import java.awt.Graphics;

import javax.swing.JPanel;

import com.embah.flatbox.Engine;

public class loader {
    private Engine engine;
    private pane pain = new pane();


    public loader(){
        engine = new Engine("Testing Grounds", 500, 350);
        engine.add(pain);
        engine.revalidate();
        engine.repaint();
    }

    public static void main(String[] args){
        new loader();
    }
}

class pane extends JPanel{


    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawString("Hello worl222d!", 60, 40);
    }
}

和我的引擎类

package com.embah.flatbox;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Engine extends JFrame{
    private Render render;

    public Engine(String title, int width, int height){
        render = new Render();
        setSize(width, height);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle(title);
        add(render);
        setVisible(true);
    }

    public void addComp(JPanel pane){
        this.add(pane);
    }

    public void repaintEngine(){
        this.repaint();
    }

    public void setTitleFrame(String title){
        setTitle(title);
    }

    public void setSizeFrame(int width, int height){
        this.setSize(width, height);
    }

    public void setVisibleFrame(boolean visible){
        setVisible(visible);
    }

    public String getTitleFrame(){
        return getTitle();
    }

    public int[] getSizes(){
        int[] size = new int[2];
        size[0] = (int) getSize().getWidth();
        size[1] = (int) getSize().getHeight();
        return size;
    }

    public boolean isVisibleFrame(){
        return isVisible();
    }
}

Render 类是一个 JPanel,我会一直在其上绘图,直到用户在它上面绘图,我现在只是使用它进行测试,一旦我找到如何从外部位置绘图,我就会将其删除。

感谢您的帮助

最佳答案

根据评论,似乎可以通过相对简单的模式来实现实际目标,该模式经常以不同的形式使用来实现此任务。希望我没有忽略某些内容,但如果您只是想让库的用户能够执行自定义渲染,您可以考虑以下内容:

class PaintPanel extends JPanel {
    private List<Painter> painters = new ArrayList<Painter>();

    void addPainter(Painter painter) {
        painters.add(painter);
    }

    void removePainter(Painter painter) {
        painters.remove(painter);
    }

    @Override
    protected void paintComponent(Graphics gr) {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D)gr;

        for (Painter painter : painters) {
            painter.paint(g, getWidth(), getHeight());
        }
    }
}


interface Painter {
    void paint(Graphics2D g, int width, int height);
}

然后就可以创建这样一个PaintPanel并将其放入您的框架中,并添加 Painter根据需要实例:

PaintPanel paintPanel = new PaintPanel();
...
paintPanel.add(new MyCustomPainter());


// Where
class MyCustomPainter implements Painter {
    @Override
    public void paint(Graphics2D g, int width, int height) {
        // Perform your painting operations here
        g.setColor(Color.RED);
        g.drawLine(0,0,width,height);
        ....
    }
}

当然,这只是一个基本的草图。为了将这样的概念应用到真正的“引擎”中,必须考虑更多方面(例如:是否可以定义 painters 的执行顺序?是否应该有不同的画家组几个层,例如前景/背景画家?还应该考虑封装在 Graphics2D 中的状态的详细信息...)。但出于将组件(即 JPanel)与执行的实际绘制操作(由客户端通过 Painter 接口(interface)的实现提供)分离的基本目的,也许这可能是第一步。

关于java - 如何从外部未知类为 2D 游戏引擎 API 进行绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21684943/

相关文章:

java - 何时使用 JFrame 或 JPanel

java - 线程限制/swingworkers

java - @Value 不注入(inject)属性,保持为空

java - Eclipse CDT 扩展以构建附加语言

android - Android下如何使用Akka项目

java - 非常奇怪的 Android 应用程序更新错误

java - 用于自定义文件浏览器的 Java 布局管理器

java - 检查枚举类型是否包含具有给定名称的常量

java - 为什么用递归停止 isRoundNumber

java - 用于动态表创建的 hibernate