为基于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它将是桌面游戏
中的某个静态字段。如果您希望避免使用静态字段,那么它将是桌面游戏
中对象中的字段,它扩展了核心游戏
中的类。