我正在尝试为目前正在编写的2D游戏引擎制作API。我在程序包外部有一个加载程序类,我想拥有一个jpanel,或者能够在程序包外部使用一个loader类并调用引擎来添加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();
    }
}


渲染类是一个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中封装的状态的详细信息...)。但是出于将Component(即JPanel)与实际执行的绘画操作(以及客户端通过Painter接口的实现提供的绘画操作)分离的基本目的,这可能是第一步。

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

10-12 04:29