[java] Opengl을 이용한 삼각형, 사각형 만들기
필그램
·2017. 10. 7. 23:28
오픈GL을 공부하면서 'Beginning Android Games'라는 Mario Zechner공저의 책을 이용했습니다.
삼각형은 소스에서 크기를 변경했고,
사각형은 일부 함수를 바꾸었습니다.
그리고, impliment의 소스파일은 책은 소스를 이용했습니다. ( https://github.com/Apress/beg-android-games-2ed.git)
메인화면에 버튼을 만들고 도형 화면 을 링크했습니다.
삼각형
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
import korea2canada.com.test2_jiwonkim.framework.Game;
import korea2canada.com.test2_jiwonkim.framework.Screen;
import korea2canada.com.test2_jiwonkim.framework.impl.GLGame;
import korea2canada.com.test2_jiwonkim.framework.impl.GLGraphics;
public class MyTriangle2 extends GLGame {
public Screen getStartScreen() {
return new ColoredTriangleScreen(this);
}
class ColoredTriangleScreen extends Screen {
final int VERTEX_SIZE = (2 + 4) * 4;
GLGraphics glGraphics;
FloatBuffer vertices;
public ColoredTriangleScreen(Game game) {
super(game);
glGraphics = ((GLGame) game).getGLGraphics();
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * VERTEX_SIZE);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();
vertices.put( new float[] { 80.0f, 80.0f, 1, 0, 0, 1,
260.0f, 80.0f, 0, 1, 0, 1,
160f, 400.0f, 0, 0, 1, 1});
vertices.flip();
}
@Override
public void present(float deltaTime) {
GL10 gl = glGraphics.getGL();
gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
vertices.position(2);
gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
}
@Override
public void update(float deltaTime) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
}
}
사각형
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
import korea2canada.com.test2_jiwonkim.framework.Game;
import korea2canada.com.test2_jiwonkim.framework.Screen;
import korea2canada.com.test2_jiwonkim.framework.impl.GLGame;
import korea2canada.com.test2_jiwonkim.framework.impl.GLGraphics;
public class MySquare2 extends GLGame {
public Screen getStartScreen() {
return new ColoredSquareScreen(this);
}
class ColoredSquareScreen extends Screen {
final int VERTEX_SIZE = (2 + 4) * 4;
// final int VERTEX_SIZE = (2 + 4) * 4;
GLGraphics glGraphics;
FloatBuffer vertices;
public ColoredSquareScreen(Game game) {
super(game);
glGraphics = ((GLGame) game).getGLGraphics();
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * VERTEX_SIZE);
// ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * VERTEX_SIZE);
byteBuffer.order(ByteOrder.nativeOrder());
vertices = byteBuffer.asFloatBuffer();
vertices.put( new float[] { 80.0f, 120.0f, 1, 0, 0, 1,
260.0f, 120.0f, 0, 1, 0, 1,
260.0f, 300.0f, 0, 1, 0, 1,
80.0f, 300.0f, 0, 0, 1, 1});
vertices.flip();
}
@Override
public void present(float deltaTime) {
GL10 gl = glGraphics.getGL();
gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, 320, 0, 480, 1, -1);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
vertices.position(0);
gl.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
vertices.position(2);
gl.glColorPointer(4, GL10.GL_FLOAT, VERTEX_SIZE, vertices);
// gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);
}
@Override
public void update(float deltaTime) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
}
}
}
//
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);
=> 이부분을 사각형으로 바꾸면서 4로 교체하고, 꼭지점 갯수를 4개로 늘렸습니다.
아래는 디렉토리 화면입니다. 맨 위의 링크를 참조하여 framework가 있어야 합니다.
그리고 메인화면을 아래와같이 만들었습니다. 아래의 소스는 제외하였습니다.
삼각형의 화면입니다.
아래는 사각형의 화면입니다.
'프로그래밍 > 모바일: iOS, Java, Android, Swift' 카테고리의 다른 글
[Android] 라디오 버튼 선택 및 Switch조건문으로 실행법 (0) | 2017.10.21 |
---|---|
[Java] 사용자 입력 받는 방법 (0) | 2017.10.21 |
[JAVA] TreeSet, LinkedHashSet and HashSet 차이점 이해하기 (0) | 2017.09.29 |
[Java] 자료 유형별 배열 정렬 및 출력 (0) | 2017.09.21 |
스위프트(SWIFT) 정리 5 : 연산 (0) | 2017.09.18 |