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



我正试图为我目前正在编写的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,我一直在上面绘制,直到用户在上面绘制为止,我现在只是用它来测试。一旦我找到如何从外部位置绘制,我就会删除它。

感谢您的帮助

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

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接口的实现提供的绘画操作)中,这可能是第一步。

最新更新