Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为2d游戏引擎api从外部未知类绘制_Java_Eclipse_Swing_2d_Paint - Fatal编程技术网

Java 如何为2d游戏引擎api从外部未知类绘制

Java 如何为2d游戏引擎api从外部未知类绘制,java,eclipse,swing,2d,paint,Java,Eclipse,Swing,2d,Paint,我正在尝试为我目前正在编写的2D游戏引擎制作API。我在包外有一个加载器类,我希望有一个jpanel,或者能够使用包外的加载器类和调用引擎来添加jpanel,这样我就可以在API内的加载器类上绘制,这样人们就可以简单地编写而不需要源代码 这是我的发动机级和装载机级 import java.awt.Graphics; import javax.swing.JPanel; import com.embah.flatbox.Engine; public class loader { pr

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

这是我的发动机级和装载机级

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,在用户使用它之前我一直在使用它,我现在只是使用它进行测试,一旦我知道如何从外部位置绘制,我将删除它


感谢您的帮助

根据评论,实际目标似乎可以通过一个相对简单的模式来实现,该模式经常以各种形式用于完成此任务。希望,我没有忽略某些东西,但是如果您只想给您的库的用户执行自定义渲染的可能性,您可以考虑FLLWIN:

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

当然,这只是一个基本的草图。为了在实际的引擎中应用这样的概念,我们必须考虑更多的方面。例如:是否可以定义画家应该执行的顺序?是否应为多个层配备不同的油漆工,例如前景/背景油漆工?还应考虑封装在图形2d中的状态的详细信息。。。。但是,为了将组件(即JPanel)与客户端通过Painter接口的实现执行和提供的实际绘制操作分离开来,这可能是第一步

我不太清楚。是否允许用户将自己的组件添加到引擎中?或者你想让他自己对属于JPanel的图形对象进行绘制操作吗?最终的希望是让他们自己进行绘制操作。我现在只是把面板当作一个图形支架,我想,我不太知道如何画多个图形对象。-谢谢,汉克斯,我会处理这个问题,看看如何使它在我的项目中发挥作用
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);
        ....
    }
}