我相信我遇到的问题是,除非我在gameview.drawFrame()中使用GL10 gl,否则gameThread不会起作用。我尝试过创建一个传递它的对象gl但仍然无法工作。使用game.onResume更新游戏也是错误的吗? 我在Main.class中创建了gameThread的一个实例,并将其归类为
public class GameThread extends Thread {
Object gl;
private static int MAX_FRAME_SKIPS;
private static int FRAME_PERIOD;
private OpenGLActivity game;
private MyGLRenderer gameView;
private boolean gameRunning = true;
private boolean running = false;
Handler handler = new Handler();
public GameThread( int maxFPS, int maxFrameSkips) {
game = new OpenGLActivity();
gameView = new MyGLRenderer();
MAX_FRAME_SKIPS = maxFrameSkips;
FRAME_PERIOD = 1000 / maxFPS;
gl = new Object();
}
@Override
public void run() {
long beginTime;
long timeDiff;
int sleepTime;
int framesSkipped;
beginTime = System.currentTimeMillis();
framesSkipped = 0;
this.gameRunning = this.game.isRunning();
this.game.onResume(); // Update game
this.gameView.onDrawFrame((GL10) gl); // Render the game
timeDiff = System.currentTimeMillis() - beginTime; // Calculate cycle length
sleepTime = (int) (FRAME_PERIOD - timeDiff); // Calculate time available to sleep
// Checks if got time to sleep, either sleeps thread or catches up
if (sleepTime > 0) {
if (this.gameRunning && running) {
handler.postDelayed(this, sleepTime);
}
while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
this.game.onResume(); // Update without rendering
sleepTime += FRAME_PERIOD; // Add frame period to check if in next frame
framesSkipped++;
if (this.gameRunning && running) {
this.run(); // No time to wait! RUN! CATCH UP!
}
}
}
}
public void setRunning(boolean running) {
this.running = running;
}
}
public class Main extends Activity{
GameThread gt = new GameThread(48, 100);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
}
public void PlayGame(View v) {
Intent intent = new Intent(Main.this, OpenGLActivity.class);
startActivity(intent);
gt.setRunning(true);
}
答案 0 :(得分:1)
您没有GL10
对象这一事实只是一个症状。事实上,我并不认为它曾在Android上使用过。它是javax.microedition.khronos.opengles
包的一部分,我认为它是某种标准的Java OpenGL ES接口。我不确定它是否有功能,但我当然从未见过有人使用它。
Android中通常使用的OpenGL接口位于android.opengl
包中,名为GLES10,GLES11,GLES20,GLES30,{ {3}}
在这些类上,所有方法都是静态的。所以你永远不需要一个对象实例来进行OpenGL调用。
但是,这是你的实际问题:要进行OpenGL调用,你需要创建一个OpenGL上下文,并使其成为当前的。您还需要一个渲染表面。有两个主要选项:
我建议您从Android文档中的官方教程开始。完成此操作后,上述所有内容都会变得更加清晰:GLSurfaceView。
您还应该知道OpenGL ES 1.x通常被认为是过时的。如今,ES 2.0及更高版本的使用范围更为广泛。