|
package pe.berabue.opengl; import android.app.*; import android.os.*; import android.view.*; public class OpenGLTest extends Activity { /** Called when the activity is first created. */ public static GLGameSurfaceView mGLView; public static GLGameRenderer mGLRenderer; @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); setContentView(mGLView); } @Override public void onPause() { mGLView.mGameThread.pauseThread(); super.onPause(); } @Override public void onResume() { mGLView.mGameThread.resumeThread(); super.onResume(); } }
GLGameSurfaceView.java - 쓰레드가 있는 부분
package pe.berabue.opengl; import android.content.*; import android.opengl.*; import android.util.*; import android.view.*; public class GLGameSurfaceView extends GLSurfaceView{ public static GameThread mGameThread; public static boolean isRun; public static boolean isWait; public GLGameSurfaceView(Context context) { super(context); setRenderer(OpenGLTest.mGLRenderer); setRenderMode(RENDERMODE_WHEN_DIRTY); // 한번만 그려줌 setFocusableInTouchMode(true); mGameThread = new GameThread(context); mGameThread.start(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.v(null,"onKeyDown"); return super.onKeyDown(keyCode, event); } @Override public boolean onTouchEvent(MotionEvent event) { Log.v(null,"onTouchEvent"); return super.onTouchEvent(event); } // Thread public class GameThread extends Thread { public GameThread(Context context) { isRun = true; isWait = false; } public void run() { while(isRun) { try { OpenGLTest.mGLView.requestRender(); // onDrawFrame mGameThread.sleep(10); } catch (InterruptedException e1) { e1.printStackTrace(); } synchronized (this) { if (isWait) { try { wait(); } catch (Exception e) { // 에러 무시 } } }//syn } } /* Thread pause */ public void pauseThread() { isWait = true; synchronized (this) { this.notify(); } } /* Thread Resume */ public void resumeThread() { isWait = false; synchronized (this) { this.notify(); } } } }setRenderMode(RENDERMODE_WHEN_DIRTY);
GLGameRenderer의 그려주는 부분에서 1회만 그려준다. 파라메터를 RENDERMODE_CONTINUOUSLY로 바꿀 경우 계속 그리기.
1회만 그리는 이유는 멀티쓰레드를 사용하여 원활한 키 입력이나 터치를 받기 위해서 라는데.. 동기화는 다음에 생각하기로...
OpenGLTest.mGLView.requestRender();
requestRender();는 onDrawFrame();을 호출한다. GLGameRenderer의 onDrawFrame();호출.
GLGameRenderer.java - 실제로 그려지는 부분
package pe.berabue.opengl; import javax.microedition.khronos.egl.*; import javax.microedition.khronos.opengles.*; import android.content.*; import android.opengl.GLSurfaceView.Renderer; import android.opengl.*; public class GLGameRenderer implements Renderer { public 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) { } @Override public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { gl.glClearColor(0, 1, 0, 0.5f); // RGBA 배경화면 0-> 1 점점밝아짐 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // ?? } }
Renderer을 구현(implemets)하게되면 기본적으로 위 3개의 메서드를 추가해야 된다.
onDrawFrame(); 실제로 그려지는 부분. 이 부분을 주기적으로 호출해 그림을 그려준다.
onSurfaceChanged(); 화면이 바뀔때 실행되는 부분.(실행시, orientation이 변경될때 등)
onSurfaceCreated(); 처음 실행 후 만들어질때 실행된다. (홈키를 누르거나 전화를 받고 다시 화면이 나올때도 실행)
GLGameRenderer에 조금 더 추가하면 기본적인 틀이 완성. 오늘은 여기까지.
실행화면
|
'Android > OpenGL' 카테고리의 다른 글
[ Android OpenGL - 04 ] 기본 소스 정리 (0) | 2011.05.20 |
---|---|
[ Android OpenGL ] OpenGL 함수 설명 (0) | 2011.04.25 |
[ Android OpenGL - 03 ] 텍스쳐 입히기 (0) | 2011.04.25 |
[ Android OpenGL - 02 ] 삼각형, 사각형 그리기 (0) | 2011.04.21 |
[ Android OpenGL ] 시작하기 (0) | 2011.03.23 |