|
GameMain.java
public class GameMain extends Activity { /** Called when the activity is first created. */ public static GLGameSurfaceView mGLView; public static GLGameRenderer mGLRenderer; public static GameThread mThread; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mGLRenderer = new GLGameRenderer(this); mGLView = new GLGameSurfaceView(this); mThread = new GameThread(this); setContentView(mGLView); mGLView.setVisibility(View.VISIBLE); mThread.start(); } @Override public void onPause() { mThread.pauseThread(); super.onPause(); } @Override public void onResume() { mThread.resumeThread(); super.onResume(); } }
GLGameRenderer, GLGameSurfaceView, GameThread 객체를 생성하고 Thread를 시작한다.
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
화면을 항상 켬
GLGameRenderer.java
package pe.berabue.game; import javax.microedition.khronos.egl.*; import javax.microedition.khronos.opengles.*; import android.content.*; import android.opengl.GLSurfaceView.Renderer; public class GLGameRenderer implements Renderer { public static Context context; public GLGameRenderer(Context context) { GLGameRenderer.context = context; } @Override public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { gl.glOrthof(0.0f, 800.0f, 480.0f, 0.0f, 1.0f, -1.0f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glViewport(0, 0, width, height); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { gl.glClearDepthf(1.0f); gl.glDisable(GL10.GL_DEPTH_TEST); gl.glMatrixMode(GL10.GL_PROJECTION); } }
onDrawFrame();
지속적인 호출을 통해 그림을 그리는 부분.
onSurfaceChanged();
화면이 바뀔때 호출
onSurfaceCreated();
화면이 생성될때 호출
GLGameSurfaceView.java
package pe.berabue.game; import android.content.*; import android.opengl.*; import android.view.*; public class GLGameSurfaceView extends GLSurfaceView { public GLGameSurfaceView(Context context) { super(context); setRenderer(GameMain.mGLRenderer); setRenderMode(RENDERMODE_WHEN_DIRTY); // One drawing setFocusableInTouchMode(true); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return true; } @Override public boolean onTouchEvent(MotionEvent event) { return true; } }
setRenderMode(RENDERMODE_WHEN_DIRTY);
GLGameRenderer()의 onDrawFrame()을 1회 호출.
GameThread.java
package pe.berabue.game; import android.content.*; public class GameThread extends Thread { public static boolean isRun; public static boolean isWait; public GameThread(Context context) { isRun = true; isWait = false; } public synchronized void run() { while(isRun) { try { GameMain.mGLView.requestRender(); // onDrawFrame Thread.sleep(10); } catch (InterruptedException e1) { e1.printStackTrace(); } if (isWait) { try { wait(); } catch (Exception e) { // Ignore error } } } } /* Thread pause */ public void pauseThread() { isWait = true; synchronized (this) { this.notify(); } } /* Thread Resume */ public void resumeThread() { isWait = false; synchronized (this) { this.notify(); } } }
GameMain.mGLView.requestRender();
GLGameRenderer()의 onDrawFrame() 호출
|
'Android > OpenGL' 카테고리의 다른 글
[NDK-OpenGL_02] 해상도 지정하기 (3) | 2012.02.26 |
---|---|
[NDK-OpenGL_01] 프로젝트 준비 (3) | 2012.02.26 |
[ Android OpenGL ] OpenGL 함수 설명 (0) | 2011.04.25 |
[ Android OpenGL - 03 ] 텍스쳐 입히기 (0) | 2011.04.25 |
[ Android OpenGL - 02 ] 삼각형, 사각형 그리기 (0) | 2011.04.21 |