Draw Manager를 기술하기 위해서는 OpenGL을 모두 기술해야 한다.
OpenGL을 Surface로 사용하기 위해서는
public class 액티비티클래스 extends Activity
{
private GLSurfaceView openGLView; // OpenGL View
private OpenGL렌더러클레스 openGLRenderer; // OpenGL Rendering View
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // LCD(Backlight) ON
openGLView = new GLSurfaceView(this); // Create OpenGL View
openGLRenderer = new OpenGLRenderer(this); // Create OpenGL Renderer
openGLView.setRenderer(openGLRenderer); // Set OpenGL Renderer
setContentView(openGLView); // Set View
}
/** Called when the activity is resumed. */
@Override
protected void onResume()
{
super.onResume();
openGLView.onResume();
openGLRenderer.onResume();
}
/** Called when the activity is paused. */
@Override
protected void onPause()
{
super.onPause();
openGLView.onPause();
}
}
public class OpenGL렌더러클레스 implements Renderer
{
public OpenGL렌더러클레스()
{
}
/** Called when the Surface is first created. */
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
//TODO: Surface 생성시 <1>
//텍스쳐링을 사용할 경우 이곳에서 생성하고 설정한다.
//맞고에서는 Menu클래스와 DrawManager를 이곳에서 생성하고 메뉴관련 텍스쳐링 정보를 모두 로드라고,
//게임관련 텍스쳐링 정보는 Menu가 표시되는 동안 5개씩 나누어 onDrawFrame에서 로드한다. (런치타임 고려)
}
/** Called when the Surface is changed. */
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
//TODO: Surface 변경시 <2>
//현재의 해상도가 전달되므로 해상도 관련 연산을 이곳에서 마무리 한다.
}
/** Called when the Surface is needed to draw. */
@Override
public void onDrawFrame(GL10 gl)
{
//TODO: frame draw <3 - 반복>
//매 프래임에 화면출력되어야 할 사항을 명시한다.
//맞고에서는 게임관련 텍스쳐링 정보 로드가 완료되는 시점에 GameManager를 생성한다.
}
}
[Texture 설정]
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
mTextureID = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
InputStream is = mContext.getResources().openRawResource(R.drawable.이미지파일명);
Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(is);
} finally {
try {
is.close();
} catch(IOException e) {
// Ignore.
}
}
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
DrawManager는 ST_IMAGE class 배열에 모든 Image를 담고 있다.
ST_IMAGE class는 TextureID와 Bitmap Image 정보, 크기 등의 Texture Image 정보를 모두 담고 있다.
로드된 Texture image 정보를 사용하여 Draw요청이 있을 때 화면에 출력을 하게 된다.
[Draw]
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glLoadIdentity();
gl.glTranslatex(newPosX << 16, newPosY << 16, 0);
gl.glScalef(fScale, fScale, 0.0f);
gl.glRotatef(fRotate, 0.0f, 0.0f, 1.0f);
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexBuffer);
openGL.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
glVertexPointer: nio 버퍼에 그려질 객체의 정점을 담아 전달
glTexCoordPointer: 이미지 대비 텍스쳐 좌표를 전달
'프로그래밍 > Android' 카테고리의 다른 글
안드로이드 맞고 - GameManager (0) | 2010.12.06 |
---|---|
안드로이드 맞고 - GameMenu (0) | 2010.12.06 |
안드로이드 맞고 - SoundManager (0) | 2010.12.06 |
안드로이드 맞고 - DataManager (0) | 2010.12.06 |
안드로이드 맞고 - class (0) | 2010.12.06 |