为基于swing和android Java的应用程序创建便携式opengl引擎

为基于swing和android Java的应用程序创建便携式opengl引擎,java,android,opengl-es,continuous-integration,Java,Android,Opengl Es,Continuous Integration,我正在使用JOGL为桌面开发基于Java的游戏。但我正在考虑将游戏的核心部分移植到Android 目前,我在一个名为桌面游戏的项目中拥有Swing(UI)相关代码,该项目依赖于另一个名为核心游戏的项目,该项目具有基本功能,并且在大多数情况下是可移植的,无需任何更改 然而,最值得注意的是,OpenGL绘图上下文GL2在desktop和android上是不同的,即 desktop = import com.jogamp.opengl.GL2; android = import android.ope

我正在使用
JOGL
为桌面开发基于
Java
的游戏。但我正在考虑将游戏的核心部分移植到
Android

目前,我在一个名为
桌面游戏
的项目中拥有
Swing
(UI)相关代码,该项目依赖于另一个名为
核心游戏
的项目,该项目具有基本功能,并且在大多数情况下是可移植的,无需任何更改

然而,最值得注意的是,
OpenGL
绘图上下文
GL2
desktop
android
上是不同的,即

desktop = import com.jogamp.opengl.GL2;
android = import android.opengl.GLES20;
有没有什么方法可以让我继续使用相同的
核心游戏
作为新项目的依赖项,比如说
android游戏
。。哪一个有
android
特定的用户界面

或者我需要创建一个名为
android core
的完全独立的项目作为
android游戏的依赖项吗

我正在尝试为基于
CI
的建筑恢复相同的核心项目

来自
核心游戏
的代码片段,该代码不适用于
android游戏

import com.jogamp.opengl.GL2;

public abstract class Shape{

    public abstract void draw(GL2 gl2, Vec3 position, float angle);
}

您需要确保
核心游戏
在任何地方都没有对
GL2
的引用。这也可能意味着将
draw
方法移出
shape

一种可能的解决方案是创建一个
ShapeDrawer
类,该类不引用
GL2
,它在
桌面游戏中实现:

public abstract class ShapeDrawer {
    public abstract void drawRectangle(Rectangle r, Vec3 position, float angle);
    public abstract void drawCircle(Circle c, Vec3 position, float angle);
}
然后在形状类中使用它:

public abstract class Shape{
    public abstract void draw(ShapeDrawer drawer, Vec3 position, float angle);
}

public class Rectangle extends Shape {
    ... other stuff ...
    public void draw(ShapeDrawer drawer, Vec3 position, float angle) {
        drawer.drawRectangle(this, position, angle);
    }
    ... other stuff ...
}

public class Circle extends Shape {
    ... other stuff ...
    public void draw(ShapeDrawer drawer, Vec3 position, float angle) {
        drawer.drawCircle(this, position, angle);
    }
    ... other stuff ...
}
然后在
桌面游戏中
可以实现
ShapeDrawer

public class GL2ShapeDrawer extends ShapeDrawer {
    private GL2 gl;
    public GL2ShapeDrawer(GL2 gl) {
        this.gl = gl;
    }
    public void drawRectangle(Rectangle r, Vec3 position, float angle) {
        ... drawing code ...
    }
    public void drawCircle(Circle c, Vec3 position, float angle) {
        ... drawing code ...
    }
}
这样,
core game
就不会直接看到
GL2
对象。这确实意味着您需要获得
桌面游戏
才能将形状抽屉传递给
核心游戏
——例如,如果您有一个
游戏引擎
类,那么它的构造函数可能应该将
形状抽屉
作为参数。当桌面启动器创建
游戏引擎
时,它可以传递一个新的
GL2ShapeDrawer


这只是一种可能的解决办法。把它作为一个起点(如果你愿意的话),但不要把它当作福音。

把所有GL2的东西从核心游戏移到桌面游戏?想象一下,当我尝试调用
draw()时,我把
Shape
移到
desktop game
从内部
核心游戏
通过一些界面,我仍然需要传递
GL2
@bobbyme01的一个实例来重新安排事情,这样你就不用担心了。对不起,我不能说得更具体了,因为这取决于你的代码。但是,例如,如果你只有一个GL2实例,你可以在桌面游戏中通过静态字段访问它。@immibis甚至可以作为静态字段访问GL2,我需要知道它的类型,所以我需要为该类型导入一个
import
,这意味着
engine
仍将有
GL2
硬编码。@bobbyme01它将是
桌面游戏
中的某个静态字段。如果您希望避免使用静态字段,那么它将是
桌面游戏
中对象中的字段,它扩展了
核心游戏
中的类。