我正在尝试为目前正在编写的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/