Smart Flappy

9.2 Smart Flappy

9.2.1 Konsep

Smart Flappy merupakan aplikasi berbasis mobile yang di de- sain dengan library OpenGL. Aplikasi ini dimainkan dengan cara melakukan swipe pada layar untuk menggerakkan object (pemain) yang harus melewati blok berisi jawaban yang sesuai dengan pertan- yaan yang tampil. Apabila pemain melewati jawaban yang benar, maka score akan bertambah. Apabila melewati jawaban yang salah, maka score akan berkurang. Apabila pemain melewati blok pengha- lang maka pemain akan mati (game over).

Pemain (object) Smart Flapy berupa objek (gambar) yang ber- gerak naik dan turun dengan skala tertentu, dan harus melewati jawa- ban yang benar sesuai pertanyaan yang muncul. Hal tersebut yang melatarbelakangi pemberian nama “Smart Flappy”.

9.2.2 Tampilan Implementasi

OpenGL dalam pembuatan aplikasi berbasis mobile ini dapat digunakan untuk mengimplementasikan texture mapping dengan tampilan gambar objek yang berupa burung, serta dengan mudah memindahkanobjek burung tersebut dari jawaban satu ke jawaban yang lain dengan men swap objek ke atas dan kebawah untuk men- jawab pertanyaan Quiz dan memudahkan dalam pemberian dan menampilkan score.

Gambar 9.9 Tampilan Awal Untuk Memulai Game

Gambar 9.10 Tampilan Menu Utama

Gambar 9.11 Tampilan Soal Pada Aplikasi

Gambar 9.12 Tampilan skor saat game selsai dan jawaban salah

Gambar 9.13 Tampilan skor akhir saat game belum selesai karena

objek burung menabrak tiang

Gambar 9.14 Tampilan skor saat game selsai dan jawaban benar

semua

9.2.3 Source Code

Source Code 9.2 Code Smart Flappy

ESRender

package com.SmartFlappy;

import java.util.Formatter;

import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10;

import com.texture_mapping.R;

import android.R.integer; import android.app.Activity; import android.content.Context; import android.R.integer; import android.app.Activity; import android.content.Context;

public class ESRender implements Renderer {

private ESText glText; private TextView textview; private ObjectArena objectarena;

// the primitive object to be drawn private ObjectBall objectball; private ObjectBall objectball_hole; private ObjectBall objectball1; private ObjectBall objectball2; private ObjectBall background; private PrimitivesObject primobflappy; private ObjectBall flappy; private ObjectBall background_layar; private ObjectBall rintangan; private ObjectBall background_pertanyaan;

Context context;

private int RunMode=1; private float mAngle = 0.0f;

// Angle in degrees private float AnimateStep = 2.0f; // Rotation step per update

private long startTime; private long fpsStartTime; private long numFrames;

float radius = 50.0f; // Ball's radius float x = radius; // Ball's center (x,y) float y = radius; float speedX = 5f; // Ball's speed (x,y) float speedY = 3f;

int xMin, xMax, yMin, yMax; int blockState=0;

private int mywidth=0; private int myheight=0;

private float state=0; String status="";

int stateX, stateY;

boolean up = true, down=true;

private lukisan lukisan; private pintu pintu; private float backMove=0.0f; private lukisan lukisan; private pintu pintu; private float backMove=0.0f;

int score = 0;

private long numFrames2; private long fpsStartTime2;

private int numIDFrame=0; private float move_left_right1 =0.f; private float move_left_right2 =0.f; private float background_jalan = 0.f; private float background_jalan2 = 0.f; private float objek_jalan1 = 0.f; private float objek_jalan2 = 0.f; private float objek_jalan3 = 0.f; private float objek_jalan4 = 0.f; private float objek_jalan5 = 0.f; private float objek_jalan6 = 0.f; private float objek_jalan7 = 0.f; private float objek_jalan8 = 0.f; private float objek_jalan9 = 0.f; private float objek_jalan10 = 0.f;

private float kecepatan_ground = 5.0f; private float kecepatan_objek_jalan1 = 3.0f; private int faktor_naik_turun=0; private int flag_naik=1;

private float x_lebar_layar = 0; private float y_tinggi_layar = 0;

private float posisi_flappy_x = 0; private float posisi_flappy_y = 0; private float posisi_rintangan_x1 = 0; private float posisi_rintangan_x2 = 0; private float posisi_rintangan_x3 = 0; private float posisi_rintangan_x4 = 0; private float posisi_rintangan_x5 = 0; private float posisi_rintangan_x6 = 0; private float posisi_rintangan_x7 = 0; private float posisi_rintangan_x8 = 0; private float posisi_rintangan_x9 = 0; private float posisi_rintangan_x10 = 0;

private float posisi_rintangan_y = 0; int rotate=0;

private boolean isDown = false; boolean get_size_screen=true; boolean nabrak = false; boolean win = false; boolean complete = true; int timeOut = 0;

/** Constructor to set the handed over context */ public ESRender(Context context) { //super(); this.context = context; this.objectarena = new ObjectArena(); /** Constructor to set the handed over context */ public ESRender(Context context) { //super(); this.context = context; this.objectarena = new ObjectArena();

this.primobflappy = new PrimitivesObject();

this.flappy = new ObjectBall(); this.background_layar = new ObjectBall(); //this.latar = new ObjectBall(); this.rintangan = new ObjectBall(); this.background_pertanyaan = new

ObjectBall();

//Music.play(context, R.raw.angry_bird); Music.stop(context); Music.play(context, R.raw.sfx_wing);

@Override public void onDrawFrame(GL10 gl) {

// menangkap ukuran layar if(get_size_screen){ this.x_lebar_layar = mywidth; this.y_tinggi_layar = myheight; get_size_screen=false; } // Draw background color gl.glClear(GL10.GL_COLOR_BUFFER_BIT |

GL10.GL_DEPTH_BUFFER_BIT);

// Draw background color gl.glEnable(GL10.GL_DEPTH_TEST); gl.glEnable(GL10.GL_NORMALIZE);

// Load Identity Matrix int x_lebar_layar_temp=(int) ((Math.ceil(x_lebar_layar/kecepatan_ground)*kecepatan _ground)-10.0f);

int lebar_layar_temp=(int) ((Math.ceil(x_lebar_layar/kecepatan_objek_jalan1)*kec epatan_objek_jalan1)-10.0f);

float tinggi_layar_tmp = y_tinggi_layar/3;

//membuat background layar 1 gl.glPushMatrix();

gl.glTranslatef(background_jalan, 0.f, 0.f); gl.glTranslatef(0, -50.f, 0.f); gl.glTranslatef(background_jalan, 0.f, 0.f); gl.glTranslatef(0, -50.f, 0.f);

gl.glScalef(x_lebar_layar, y_tinggi_layar, 0.0f);

gl.glScalef(x_lebar_layar_temp, 1.5f*y_tinggi_layar/10, 1.0f);

background_layar.draw_background(gl);

//background_layar.draw_kotak(gl);

gl.glEnable(GL10.GL_LIGHTING); gl.glPopMatrix();

background_jalan-=kecepatan_ground;

if(- background_jalan==x_lebar_layar_temp){

background_jalan=x_lebar_layar_temp;

//membuat background layar 2 gl.glPushMatrix(); //gl.glDisable(GL10.GL_LIGHTING);

gl.glTranslatef(background_jalan2, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar_temp, 0.f, 0.f);

//gl.glTranslatef(background_jalan2, 0.f, 0.f); gl.glTranslatef(0, -50.f, 0.f);

gl.glScalef(1.0f, 1.5f, 0.0f); //

gl.glTranslatef(0, -5.5f, 0.f); gl.glScalef(x_lebar_layar, y_tinggi_layar, 0.0f);

// gl.glScalef(x_lebar_layar_temp, 1.5f*y_tinggi_layar/10, 1.0f);

background_layar.draw_background(gl);

//background_layar.draw_kotak(gl); // gl.glEnable(GL10.GL_LIGHTING); gl.glPopMatrix(); background_jalan2-=kecepatan_ground;

// if(- background_jalan2==2*x_lebar_layar_temp){ // if(- background_jalan2==2*x_lebar_layar_temp){

// menampilkan Background pertanyaan gl.glPushMatrix();

//bounds.set(x - radius, y - radius, x + radius, y + radius); gl.glTranslatef(0.0f, 0.0f, 0.0f); //gl.glTranslatef(0.0f, state, 0.0f); //

gl.glScalef(0.5f,0.5f,0.5f); // gl.glScalef(1.0f,1.0f,1.0f);

gl.glScalef(x_lebar_layar,y_tinggi_layar/12, 0.0f); //gl.glTranslatef(0.0f, 0.0f, -5.0f);

1.0f

// background_pertanyaan.draw_kotak(gl);

background_pertanyaan.draw_background(gl);

gl.glPopMatrix(); if(!nabrak){

//membuat RINTANGAN/TEMBOK 1

gl.glPushMatrix(); // gl.glDisable(GL10.GL_LIGHTING);

gl.glTranslatef(objek_jalan1, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*2, y_tinggi_layar/2, 0.f); //

gl.glTranslatef(x_lebar_layar, y_tinggi_layar/2, 0.f); //

gl.glTranslatef(x_lebar_layar, tinggi_layar_tmp, 0.f);

gl.glTranslatef(125, -130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

//gl.glScalef(x_lebar_layar_temp, 1.5f*y_tinggi_layar/10, 1.0f);

rintangan.draw_background(gl);

//kotak.draw_kotak(gl); // //kotak.draw_kotak(gl); //

//membuat RINTANGAN/TEMBOK 2 gl.glPushMatrix();

gl.glTranslatef(objek_jalan3, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*4, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, - 130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

rintangan.draw_background(gl); gl.glPopMatrix();

//membuat RINTANGAN/TEMBOK 3 gl.glPushMatrix();

gl.glTranslatef(objek_jalan3, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*6, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, - 130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

rintangan.draw_background(gl); gl.glPopMatrix();

//membuat RINTANGAN/TEMBOK 4 gl.glPushMatrix();

gl.glTranslatef(objek_jalan4, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*8, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, - 130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

rintangan.draw_background(gl); gl.glPopMatrix();

//membuat RINTANGAN/TEMBOK 5 gl.glPushMatrix();

gl.glTranslatef(objek_jalan5, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*10, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, -

130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

rintangan.draw_background(gl); gl.glPopMatrix();

//membuat RINTANGAN/TEMBOK 6 gl.glPushMatrix();

gl.glTranslatef(objek_jalan6, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*12, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, - 130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

rintangan.draw_background(gl); gl.glPopMatrix();

//membuat RINTANGAN/TEMBOK 7 gl.glPushMatrix();

gl.glTranslatef(objek_jalan7, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*14, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, - 130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

rintangan.draw_background(gl); gl.glPopMatrix();

//membuat RINTANGAN/TEMBOK 8 gl.glPushMatrix();

gl.glTranslatef(objek_jalan8, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*16, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, - 130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

rintangan.draw_background(gl); gl.glPopMatrix();

//membuat RINTANGAN/TEMBOK 9 gl.glPushMatrix(); //membuat RINTANGAN/TEMBOK 9 gl.glPushMatrix();

gl.glTranslatef(x_lebar_layar*18, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, - 130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f);

rintangan.draw_background(gl); gl.glPopMatrix();

//membuat RINTANGAN/TEMBOK 10 gl.glPushMatrix();

gl.glTranslatef(objek_jalan10, 0.f, 0.f);

gl.glTranslatef(x_lebar_layar*20, y_tinggi_layar/2, 0.f); gl.glTranslatef(125, - 130.0f, 0.f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/2, 1.0f); //

flappy.loadBallTexture3(gl, context, numIDFrame); // flappy.draw_circle_color(gl);

rintangan.draw_background(gl); gl.glPopMatrix();

//render text gl.glPushMatrix();

// enable texture + alpha blending // NOTE: this is required for text rendering! we could incorporate it into // the GLText class, but then it would be called multiple times (which impacts performance).

gl.glEnable( GL10.GL_TEXTURE_2D ); // Enable Texture Mapping

gl.glEnable( GL10.GL_BLEND ); // Enable Alpha Blend gl.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); // Set Alpha Blend Function

//Log.d(TAG, "Frames per second: " + fps + " (" + numFrames // + " frames in " + fpsElapsed + " ms)");

glText.begin(0.0f, 0.0f, 0.0f, 1.0f); // Begin Text Rendering (Set Color WHITE) //

glText.draw( "Posisi Bola : ("+ x + ","+y+")",(mywidth/2)-150, 10); // Draw Test String

// Keep track of number of frames drawn numFrames++; long fpsElapsed =

System.currentTimeMillis() - fpsStartTime; //if (fpsElapsed > 1 * 1000) { // every 5 seconds float fps = (numFrames * 1000.0F) / fpsElapsed; //

glText.draw( "Frames per second : "+ fps + " (" + numFrames + " frames in " + fpsElapsed + " ms)",150, 30); // Draw Test String

fpsStartTime = System.currentTimeMillis(); numFrames = 0;

// float stt = state+(myheight/2)+17; //

float oj1 = objek_jalan1+(mywidth*3); //

glText.draw("State : OJ3 : "+oj1+" ...True :"+state, 10, 450);

glText.draw("Score : "+score , mywidth/2, myheight-50); //

glText.draw("status "+status , mywidth/2, myheight-90); //

glText.draw("Score "+objek_jalan1 + (mywidth*2) , mywidth/2, myheight- 120);

// glText.draw("Height : "+myheight+" Width : "+mywidth + " fRAME " + numIDFrame, 10, myheight-50 );

float tmp = state;

// if(tmp>90){ //

blockState =1; //

}else if (tmp>=30 && tmp<90) { //

blockState =2; //

}else if (tmp>=-30 && tmp<30) {

// blockState =3; //

}else if (tmp>=-90 && tmp<-30) { //

blockState =4; //

}else if (tmp<-90) { //

blockState =5; //

if(tmp>72){ blockState = 1; }else if (tmp>=-240

&& tmp<72) { blockState =2; }else if (tmp<-240) { blockState =3; }

if (blockState==1 || blockState==3){ win = true; }else{ win = false;

// glText.draw("Block State : "+blockState, 10, myheight-70);

// glText.draw("Nabrak : "+nabrak, 10, myheight-130); //

glText.draw("Posisi flappy X : "+posisi_flappy_x, 10, myheight-160); //

glText.draw("Posisi rintangan X : "+posisi_rintangan_x1, 10, myheight- 190); //

glText.draw("Anda menang == " + win , 10, myheight-210);

// glText.begin(1.0f, 1.0f, 1.0f, 1.0f); //

glText.end();

// SOAL

// glText.begin(0.0f,0.0f,0.0f,1.0f); // SET TEXT WARNA HITAM

glText.draw("<1> Berapakah hasil dari 50 X 1 ??? " , x_lebar_layar + objek_jalan1, 0); glText.draw("<2> Berapakah hasil dari 4 : 4 ??? " , x_lebar_layar*3 + objek_jalan2, 0);

glText.draw("<3> Berapakah hasil glText.draw("<3> Berapakah hasil

glText.draw("<4> Berapakah hasil dari 4 - 4 ??? " , x_lebar_layar*7 + objek_jalan4, 0);

glText.draw("<5> Berapakah hasil dari 5 X 0 ??? " , x_lebar_layar*9 + objek_jalan5, 0);

glText.draw("<6> Berapakah hasil dari 50 X 4 : 5 ??? " , x_lebar_layar*11 + objek_jalan6, 0);

glText.draw("<7> Berapakah hasil dari 50 : 4 X 2 ??? " , x_lebar_layar*13 + objek_jalan7, 0);

glText.draw("<8> Berapakah hasil dari 5 X 4 + 4 ??? " , x_lebar_layar*15 + objek_jalan8, 0);

glText.draw("<9> 6 detik sama dengan berapa jam ??? " , x_lebar_layar*17 + objek_jalan9, 0);

glText.draw("<10> 3 + sin 30 + (cos 60)^2 ??? " , x_lebar_layar*19 + objek_jalan10, 0);

glText.end();// End Text Rendering

// disable texture + alpha gl.glDisable( GL10.GL_BLEND );

// Disable Alpha Blend gl.glDisable( GL10.GL_TEXTURE_2D ); // Disable Texture Mapping

gl.glPopMatrix();

gl.glPushMatrix(); // render text

gl.glEnable( GL10.GL_TEXTURE_2D ); // Enable Texture Mapping gl.glEnable( GL10.GL_BLEND ); // Enable Alpha Blend gl.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); // Set Alpha Blend Function

// disable texture + alpha

// JAWABAN SOAL

glText.begin(0.0f,0.0f,0.0f,1.0f); // SET TEXT WARNA HITAM

//glText.load( "comic.ttf", 24, 2, 2 ); //jawaban 1 glText.draw("50 " ,

x_lebar_layar*2 + objek_jalan1 + 165.0f, y_tinggi_layar - 50.0f); x_lebar_layar*2 + objek_jalan1 + 165.0f, y_tinggi_layar - 50.0f);

//jawaban 2 glText.draw("4 " ,

x_lebar_layar*4 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("1 " , x_lebar_layar*4 + objek_jalan2 + 165.0f, 0 + 70.0f);

//jawaban 3 glText.draw("14 " , x_lebar_layar*6 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("51 " , x_lebar_layar*6 + objek_jalan2 + 165.0f, 0 + 70.0f);

//jawaban 4 glText.draw("0 " , x_lebar_layar*8 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("1 " , x_lebar_layar*8 + objek_jalan2 + 165.0f, 0 + 70.0f);

//jawaban 5 glText.draw("4 " , x_lebar_layar*10 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("0 " , x_lebar_layar*10 + objek_jalan2 + 165.0f, 0 + 70.0f);

//jawaban 6 glText.draw("34 " , x_lebar_layar*12 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("40 " , x_lebar_layar*12 + objek_jalan2 + 165.0f, 0 + 70.0f);

//jawaban 7 glText.draw("49 " , x_lebar_layar*14 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("25 " , x_lebar_layar*14 + objek_jalan2 + 165.0f, 0 + 70.0f);

//jawaban 8 glText.draw("14 " , x_lebar_layar*16 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("24 " , x_lebar_layar*16 + objek_jalan2 + 165.0f, 0 + 70.0f);

//jawaban 9 glText.draw("1/1000 " , x_lebar_layar*18 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("1/3600 " , x_lebar_layar*18 + objek_jalan2 + 165.0f, 0 + 70.0f);

//jawaban 10 glText.draw("3.25 " , x_lebar_layar*20 + objek_jalan2 + 165.0f, y_tinggi_layar - 50.0f);

glText.draw("3.75 " , x_lebar_layar*20 + objek_jalan2 + 165.0f, 0 + 70.0f);

glText.end();// End Text Rendering

gl.glDisable( GL10.GL_BLEND ); // Disable Alpha Blend gl.glDisable( GL10.GL_TEXTURE_2D ); // Disable Texture Mapping gl.glPopMatrix();

}else{ Music.stop(context); //

Music.playOnce(context, R.raw.sfx_die); //

gl.glPushMatrix();

// gl.glTranslatef(0.0f, 0.0f, 0.0f); //

gl.glScalef(x_lebar_layar,y_tinggi_layar/12, 0.0f); //

gl.glColor4f(0f, 0f, 0f, 0.75f); //

background_pertanyaan.draw_kotak(gl); //

gl.glPopMatrix(); } objek_jalan1-=kecepatan_ground; objek_jalan2-=kecepatan_ground; objek_jalan3-=kecepatan_ground; objek_jalan4-=kecepatan_ground; objek_jalan5-=kecepatan_ground; objek_jalan6-=kecepatan_ground; objek_jalan7-=kecepatan_ground; objek_jalan8-=kecepatan_ground; objek_jalan9-=kecepatan_ground; objek_jalan10-=kecepatan_ground;

// //membuat RINTANGAN/TEMBOK

gl.glPushMatrix(); // gl.glTranslatef(objek_jalan10, 0.f, 0.f); // gl.glTranslatef(x_lebar_layar*2, y_tinggi_layar/2, 0.f); ////

gl.glTranslatef(0, -130.0f, 0.f);

// gl.glScalef(1.0f, 1.0f, 1.0f); //

flappy.loadBallTexture3(gl, context, numIDFrame); // flappy.draw_circle_color(gl); // //rintangan.draw_background(gl); //

gl.glPopMatrix(); //

objek_jalan10- =kecepatan_ground; //

// // membuat object berjalan 2 //

gl.glPushMatrix(); //// gl.glDisable(GL10.GL_LIGHTING); // gl.glTranslatef(objek_jalan1, 0.f, 0.f); // gl.glTranslatef(x_lebar_layar, tinggi_layar_tmp+tinggi_layar_tmp, 0.f); // //

//gl.glTranslatef(0, -50.f, 0.f); // gl.glScalef(x_lebar_layar/10, y_tinggi_layar/10, 1.0f); //

//gl.glScalef(x_lebar_layar_temp, 1.5f*y_tinggi_layar/10, 1.0f); //

rintangan.draw_background(gl); //// gl.glEnable(GL10.GL_LIGHTING); //

gl.glPopMatrix(); // // //

objek_jalan1-=kecepatan_ground; ////

posisi_rintangan_x1 = - objek_jalan1; // // //

if(-

objek_jalan1==x_lebar_layar_temp){ //

objek_jalan1=x_lebar_layar_temp; //

//nabrak = true; //

//}else{

// //nabrak =false; //

posisi_rintangan_x1 = -objek_jalan1; posisi_rintangan_x2 = -objek_jalan2;

// background gl.glPushMatrix();

//GLU.gluLookAt(gl, 0, 0, 0.01f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

gl.glTranslatef(300.0f, myheight/2, 0.0f); //

gl.glRotatef(mAngle, 0.0f, 1.0f, 0.0f); gl.glScalef(190.0f, 190.0f, 0.0f);

// gl.glRotatef(180, 1.0f, 0.0f, 0.0f); //

gl.glRotatef(0.0f, 0.0f, 1.0f, 0.0f); gl.glTranslatef(0.0f, 0.0f, 0.0f);

background.draw_persegi(gl);

gl.glPopMatrix();

// menampilkan persegi dengan gradasi warna gl.glPushMatrix();

gl.glTranslatef(0.0f, 1.0f, 0.0f); gl.glTranslatef(0.0f, 0.0f, -

5.0f); //

objectarena.draw_kotak(gl);

gl.glPopMatrix();

// menampilkan lingkaran only line gl.glPushMatrix();

//gl.glScalef(150.0f, 150.0f, 150.0f); //gl.glTranslatef(150.0f, 150.0f, -5.0f); gl.glLineWidth(1.0f); gl.glEnable(GL10.GL_LINE_SMOOTH);

// objectball.draw_circle(gl); gl.glPopMatrix();

// menampilkan lingkaran only line with texture gl.glPushMatrix(); //gl.glScalef(150.0f, 150.0f, 150.0f); gl.glTranslatef(0.0f, 100.0f, 0.0f); gl.glLineWidth(1.0f); gl.glEnable(GL10.GL_LINE_SMOOTH);

// objectball_hole.draw_circle_hole(gl);

gl.glPopMatrix();

// menampilkan lingkaran dengan gradasi warna gl.glPushMatrix();

gl.glLineWidth(1.0f); gl.glLineWidth(1.0f);

radius, x + radius, y + radius); gl.glTranslatef(x, y, 0.0f); //

gl.glScalef(0.5f,0.5f,0.5f); gl.glScalef(1.0f,1.0f,1.0f); //gl.glTranslatef(0.0f, 0.0f, -

5.0f); 1.0f

// flappy.loadBallTexture3(gl, context, numIDFrame); //gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); //

primobflappy.draw_background(gl); //

flappy.draw_circle_color(gl);

// objectball2.draw_circle_color(gl); //

ball.draw(gl);

// objectball1.draw_segitiga(gl);

gl.glPopMatrix();

// //membuat flappy bird //

// Keep track of number of frames drawn

// numFrames2++; //

long fpsElapsed2 = System.currentTimeMillis() - fpsStartTime2; //

if (fpsElapsed2 > 0.09 * 1000) { // every

5 seconds //

float fps2 = (numFrames2 * 1000.0F) / fpsElapsed2; //

//glText.draw( "Frames per second : "+ fps + " (" + numFrames + " frames in " + fpsElapsed + " ms)",150, 30); // Draw Test String //

fpsStartTime2 =

System.currentTimeMillis(); //

numFrames2 = 0;

gl.glPushMatrix(); // //gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); //

//gl.glEnable(GL10.GL_BLEND); // //gl.glDisable(GL10.GL_LIGHTING); //

// mengatur naik turun //

gl.glTranslatef(0, faktor_naik_turun, 0.0f); ////

gl.glTranslatef(0, 50.0f, 0.0f); // gl.glTranslatef(0, 50.0f, 0.0f); //

gl.glTranslatef((- state+100.0f), (y_tinggi_layar/2)-100.0f, 0.0f); //

//gl.glTranslatef(x_lebar_layar/2, y_tinggi_layar/2, 0.0f); // ////

gl.glTranslatef(x_lebar_layar, -state, 0.0f);

// //gl.glScalef(x_lebar_layar/10, y_tinggi_layar/10, 1.0f); //

//primobflappy.loadBallTexture2(gl, context, numIDFrame); //

flappy.loadBallTexture2(gl, context, numIDFrame); //

//gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // //primobflappy.draw_background(gl); //// flappy.draw_background_cucok(gl); // //

flappy.draw_circle_color(gl); // //gl.glDisable(GL10.GL_BLEND); // //gl.glEnable(GL10.GL_LIGHTING); //

gl.glPopMatrix(); // //

numIDFrame++; // //

if(flag_naik==1){ // faktor_naik_turun+=2; //

}else if(flag_naik==-1){ //

faktor_naik_turun- =2; //

if(faktor_naik_turun%20==0){ //

flag_naik*=-1; //

if(numIDFrame==8){ //

if(flag_naik==1){ ////

faktor_naik_turun- =5; ////

//// if (getFlappy()==false){ //// faktor_naik_turun+=20; //// if (getFlappy()==false){ //// faktor_naik_turun+=20;

//gl.glEnable(GL10.GL_BLEND); // //gl.glDisable(GL10.GL_LIGHTING); // //

// mengatur naik turun //

gl.glTranslatef(0, faktor_naik_turun, 0.0f); ////

gl.glTranslatef(0, 10.0f, 0.0f); //

gl.glTranslatef(x_lebar_layar/2, y_tinggi_layar/2, 0.0f); ////

gl.glTranslatef((- state+100.0f), (y_tinggi_layar/2)-100.0f, 0.0f); //

//gl.glTranslatef(x_lebar_layar/2, y_tinggi_layar/2, 0.0f); //

//gl.glScalef(x_lebar_layar/10, y_tinggi_layar/10, 1.0f); //

//primobflappy.loadBallTexture2(gl, context, numIDFrame); //

flappy.loadBallTexture2(gl, context, numIDFrame); // //gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); //// primobflappy.draw_background(gl); // flappy.draw_circle_color(gl); //// flappy.draw_background_cucok(gl); // //

//gl.glDisable(GL10.GL_BLEND); // //gl.glEnable(GL10.GL_LIGHTING); //

gl.glPopMatrix(); //

// menampilkan OBJECT flappy event gl.glPushMatrix();

gl.glLineWidth(1.0f); gl.glLineWidth(1.0f);

gl.glScalef(0.5f,0.5f,0.5f);

gl.glScalef(1.0f,1.0f,1.0f);

//gl.glTranslatef(0.0f, 0.0f, -5.0f);

1.0f

flappy.loadBallTexture2(gl, context, numIDFrame); //gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); //

primobflappy.draw_background(gl);

flappy.draw_circle_color(gl); if(nabrak){ //Membuat Kotak Transparan (GAME OVER) gl.glPushMatrix();

gl.glTranslatef(0.0f, 0.0f, 0.0f);

gl.glScalef(x_lebar_layar,y_tinggi_layar, 0.0f);

background_pertanyaan.draw_kotak(gl); gl.glPopMatrix();

gl.glPushMatrix(); gl.glEnable(

GL10.GL_TEXTURE_2D ); // Enable Texture Mapping

gl.glEnable( GL10.GL_BLEND ); // Enable Alpha Blend gl.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); // Set Alpha Blend Function

glText.begin(1.0f, 1.0f, 1.0f, 1.0f); // Begin Text Rendering (Set Color WHITE)

if(complete == true){ glText.draw("YOU WIN" , mywidth/2-80.0f , myheight/2); }else{ glText.draw("GAME OVER", mywidth/2-80.0f, myheight/2); if(complete == true){ glText.draw("YOU WIN" , mywidth/2-80.0f , myheight/2); }else{ glText.draw("GAME OVER", mywidth/2-80.0f, myheight/2);

glText.draw("Time Out : " + (500-timeOut), mywidth/2-80.0f, myheight/2 -20); //

glText.draw("status "+status , mywidth/2 , myheight/2 - 50.0f); glText.end(); // disable texture + alpha gl.glDisable( GL10.GL_BLEND ); // Disable Alpha Blend gl.glDisable( GL10.GL_TEXTURE_2D ); // Disable Texture Mapping

gl.glPopMatrix(); timeOut++;

if(timeOut>500){

new SplashActivity(); }

if(nabrak){ state-=5; rotate = -90;

}else{

if((objek_jalan1+(mywidth*2) < 20) && objek_jalan1+(mywidth*2)>0){ if(blockState==1){ status = "Jawaban benar, poin tambah"; score++; //play(); //onResume();

Music.playOnce(context, R.raw.sfx_point);

}else if(blockState==2){ status = "Permainan Berakhir"; //

kecepatan_ground=0; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit);

}else{

status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan2+(mywidth*4) < 20) && objek_jalan2+(mywidth*4)>0){ if(blockState==1){ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point);

}else if(blockState==2){ status = "Permainan Berakhir"; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban benar, poin tambah"; score++;

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan3+(mywidth*6) < 20) && objek_jalan3+(mywidth*6)>0){ if(blockState==1){ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point); }else if(blockState==2){ status = "Permainan Berakhir"; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban benar, poin tambah"; score++;

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan4+(mywidth*8) < 20) && objek_jalan4+(mywidth*8)>0){ if((objek_jalan4+(mywidth*8) < 20) && objek_jalan4+(mywidth*8)>0){

Music.playOnce(context, R.raw.sfx_point); }else if(blockState==2){ status = "Permainan Berakhir"; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan5+(mywidth*10) <

20) && objek_jalan5+(mywidth*10)>0){ if(blockState==1){ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point); }else if(blockState==2){ status = "Permainan Berakhir"; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban benar, poin tambah"; score++;

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan6+(mywidth*12) <

20) && objek_jalan6+(mywidth*12)>0){ if(blockState==1){ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point); }else if(blockState==2){ status = "Permainan

Berakhir"; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban benar, poin tambah"; score++;

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan7+(mywidth*14) <

20) && objek_jalan7+(mywidth*14)>0){ if(blockState==1){ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point); }else if(blockState==2){ status = "Permainan Berakhir"; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban benar, poin tambah"; score++;

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan8+(mywidth*16) <

20) && objek_jalan8+(mywidth*16)>0){ if(blockState==1){ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point);

}else if(blockState==2){ status = "Permainan Berakhir"; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban benar, poin tambah"; Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban benar, poin tambah";

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan9+(mywidth*18) <

20) && objek_jalan9+(mywidth*18)>0){ if(blockState==1){ status = "Jawaban benar, poin tambah"; score++;

Music.playOnce(context, R.raw.sfx_point); }else if(blockState==2){ status = "Permainan Berakhir"; nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point);

if((objek_jalan10+(mywidth*20) <

20) && objek_jalan10+(mywidth*20)>0){ if(blockState==1){ status = "Jawaban salah, poin berkurang"; score--; complete = false;

Music.playOnce(context, R.raw.sfx_point); }else if(blockState==2){ nabrak=true; complete = false;

Music.playOnce(context, R.raw.sfx_hit); }else{ status = "Jawaban benar, poin tambah"; score++;

Music.playOnce(context, R.raw.sfx_point);

if(objek_jalan10+(mywidth*21) < mywidth/1.5){ status = "Permainan Berakhir"; if(objek_jalan10+(mywidth*21) < mywidth/1.5){ status = "Permainan Berakhir";

numIDFrame++;

if(flag_naik==1){ faktor_naik_turun+=1; }else if(flag_naik==-1){ faktor_naik_turun-=1; }

if(faktor_naik_turun%20==0){ flag_naik*=-1; }

if(numIDFrame==8){ numIDFrame=0;

} posisi_flappy_x = x_lebar_layar/2;

// update moveWithCollisionDetection(this); set((int)-radius, (int)-radius, mywidth,

myheight);

// Update the rotational angle after each refresh if (RunMode==1) { // re-Calculate animation parameters mAngle += AnimateStep; if (mAngle > 360.0) {

//CurrentAngle -= 360.0*Math.floor(CurrentAngle/360.0); mAngle=0.0f; mAngle += AnimateStep;

if (state>152.0){ up = false; }else { up = true; }

if(state<-273.0){ down=false; }else { down=true; } backMove+=0.5; //gl.glEnable(GL10.GL_LIGHTING); gl.glDisable(GL10.GL_DEPTH_TEST); if(state<-273.0){ down=false; }else { down=true; } backMove+=0.5; //gl.glEnable(GL10.GL_LIGHTING); gl.glDisable(GL10.GL_DEPTH_TEST);

@Override public void onSurfaceCreated(GL10 gl, EGLConfig

config) { //gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); // Set color's clear-value to black

gl.glClearDepthf(1.0f); // Set depth's clear- value to farthest gl.glEnable(GL10.GL_DEPTH_TEST); // Enables depth-buffer for hidden gl.glDisable(GL10.GL_TEXTURE_2D); // surface removal gl.glDepthFunc(GL10.GL_LEQUAL); // The

type of depth testing to do

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); // nice

// perspective

// view gl.glShadeModel(GL10.GL_SMOOTH); //

Enable smooth shading of color gl.glDisable(GL10.GL_DITHER); // Disable dithering for better // performance

// Create the GLText glText = new ESText( gl, context.getAssets() );

// Load the font from file (set size + padding), creates the texture // NOTE: after a successful call to this the font is ready for rendering! glText.load( "Roboto-Regular.ttf", 24, 2, 2 ); // Create Font (Height: 14 Pixels / X+Y Padding 2 Pixels)

//gl.glDisable(GL10.GL_DITHER); // Disable dithering for better // performance

// Setup Texture, each time the surface is created (NEW)

objectball_hole.loadBallTexture(gl, context,0); objectball1.loadBallTexture(gl, context,1);

objectball2.loadBallTexture(gl, context,0); //

lukisan.loadTexture(gl, context); lukisan.loadTheTexture(gl, context, 5); pintu.loadTexture(gl, context);

// background.loadBallTexture(gl, context, 1);

ball.loadGLTexture(gl, context, 2);

//primobflappy.loadBallTexture2(gl, context, 0);

// flappy.loadBallTexture2(gl, context, 0);

background_layar.loadBallTexture(gl, context, 17);

// latar.loadBallTexture(gl, context, 0); rintangan.loadBallTexture(gl, context, 19); background_pertanyaan.loadBallTexture(gl,

context, 20);

gl.glEnable(GL10.GL_TEXTURE_2D); // Enable texture (NEW)

@Override public void onSurfaceChanged(GL10 gl, int width,

int height) { mywidth=width; myheight=height;

/* if (height == 0)

height = 1; // To prevent divide by zero float aspect = (float) width / height;

mywidth=width; myheight=height;

// Set the viewport (display area) to cover the entire window gl.glViewport(0, 0, width, height);

// Setup perspective projection, with aspect ratio matches viewport gl.glMatrixMode(GL10.GL_PROJECTION); // Select projection matrix gl.glLoadIdentity(); // Reset projection matrix

/*gl.glOrthof( // Set Ortho Projection (Left,Right,Bottom,Top,Front,Back)

-4, -4 + 9 - 1 ,

9, 9 + 5 - 1, 5.0f, -5.0f );*/

gl.glViewport( 0, 0, width, height );

// Setup orthographic projection // Setup orthographic projection

0, width,

0, height, 1.0f, -10.0f );

// Save width and height //this.width = width;

// Save Current Width //this.height = height; // Save Current Height

gl.glMatrixMode(GL10.GL_MODELVIEW); // Select model-view matrix

gl.glLoadIdentity(); // Reset

public float getxMax() { return xMax; } public void setxMax(int xmax) {

xMax = xmax; }

public float getxMin() { return xMin; } public void setxMin(int xmin) {

xMin = xmin; }

public float getyMax() { return yMax; }

public void setyMax(int ymax) { yMax = ymax; }

public float getyMin() { return yMin; } public void setyMin(int ymin) {

yMin = ymin; }

public float getspeedX() { return speedX; } public void setspeedX(float speedX_) {

speedX = speedX_; } speedX = speedX_; }

speedY = speedY_; }

public void moveWithCollisionDetection(ESRender esRender) { // Get new (x,y) position x += speedX; y += speedY; // Detect collision and react if (x + radius > esRender.getxMax()) {

speedX = -speedX; x = esRender.getxMax() - radius;

} else if (x - radius < esRender.getxMin())

{ speedX = -speedX; x = esRender.getxMin() + radius;

} if (y + radius > esRender.getyMax()) {

speedY = -speedY; y = esRender.getyMax() - radius;

} else if (y - radius < esRender.getyMin()) { speedY = -speedY; y = esRender.getyMin() + radius;

public void set(int x, int y, int width, int height) { xMin = x; //xMax = x + width - 1; xMax = x + width; yMin = y; //yMax = y + height - 1; yMax = y + height;

public void setState(float state) { this.state = state; }

public float getState() { return state; }

public void setUp(boolean up) { this.up = up; }

public boolean getUp() { return up; public boolean getUp() { return up;

public boolean getDown() { return down;

public boolean getFlappy(){ return isDown; }

public boolean setDown(){ return isDown =true; }

public boolean setJump(){

return isDown = false;

ESSurfacesView

package com.SmartFlappy;

import com.texture_mapping.R;

import android.content.Context; import android.opengl.GLSurfaceView; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent;

/** * A view container where OpenGL ES graphics can be drawn on screen.

* This view can also be used to capture touch events, such as a user * interacting with drawn objects. */

public class ESSurfaceView extends GLSurfaceView {

private final ESRender esRender; private float previousX; private float previousY;

public ESSurfaceView(Context context) {

super(context);

// Set the Renderer for drawing on the GLSurfaceView esRender = new ESRender(context); setRenderer(esRender);

// To enable keypad this.setFocusable(true); this.requestFocus();

// To enable touch mode this.setFocusableInTouchMode(true);

// Render the view only when there is a change in the drawing data // merender hanya ketika ada perubahan/ event

//setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); }

//private final float TOUCH_SCALE_FACTOR = getWidth() / getHeight(); private float mPreviousX; private float mPreviousY; private final float TOUCH_SCALE_FACTOR = 1f;

@Override public boolean onTouchEvent(MotionEvent v) {

// MotionEvent reports input details from the touch screen // and other input controls. In this case, we are only

// interested in events where the touch position changed.

float currentX = v.getX(); float currentY = v.getY();

float deltaX, deltaY;

float x = v.getX(); float y = v.getY();

//float scalingFactor = 0.50f /

((esRender.xMax > esRender.yMax) ? esRender.yMax //: esRender.xMax);

switch (v.getAction()) { case MotionEvent.ACTION_MOVE:

float dx = x - mPreviousX; float dy = y - mPreviousY;

// reverse direction of rotation above the mid-line if (y > getHeight() / 2) { dx = dx * -1 ; }

// reverse direction of rotation to left of the mid-line if (x < getWidth() / 2) { dy = dy * -1 ;

} float move = (dx + dy) *

TOUCH_SCALE_FACTOR;

if(esRender.getUp() && move>0){ esRender.setState(esRender.getState() + move); requestRender();

if(esRender.getDown() && move<0){ esRender.setState(esRender.getState() + move); requestRender();

// case MotionEvent.ACTION_DOWN: //

Log.v("Test Action Down", "action down working"); //

//break; // requestRender(); //case MotionEvent.ACTION_POINTER_UP: //Log.v("Test Action ACTION_POINTER_UP", "action working"); //requestRender(); //case MotionEvent.ACTION_MOVE: //Log.v("Test Action ACTION_POINTER_DOWN", "action working"); //requestRender(); //case MotionEvent.ACTION_UP: //Log.v("Test Action Up", "action up working"); //requestRender();

// case MotionEvent.ACTION_MOVE: //

// Modify rotational angles according to movement //

deltaX = currentX - previousX; //

deltaY = currentY - previousY; // //

//esRender.setspeedX(esRender.getspeedX()+ (deltaX/getWidth())); //

//esRender.setspeedY(esRender.getspeedY()+ (deltaY/getHeight())); // //

esRender.setspeedX(esRender.getspeedX()+ deltaX/100); //

esRender.setspeedY(esRender.getspeedY()+ deltaY/100); // //

requestRender();

// Save current x, y previousX = currentX; previousY = currentY; mPreviousX = x;

mPreviousY = y; return true; // Event handled //break; }

// Key-up event handler @Override public boolean onKeyUp(int keyCode, KeyEvent

event) { switch (keyCode) { case KeyEvent.KEYCODE_A: // mengurangi

kecepatan object if((esRender.getspeedX()- 0.05f >0) ){

esRender.setspeedX(esRender.getspeedX()- 0.05f);

} if((esRender.getspeedX()- 0.05f

<0) ){ esRender.setspeedX(0.0f);

} if((esRender.getspeedY()- 0.05f

esRender.setspeedY(esRender.getspeedY()- 0.05f);

} if((esRender.getspeedY()- 0.05f

<0) ){ esRender.setspeedY(0.0f);

} Log.v("Test Action KEYCODE_A",

"action working");

break; case KeyEvent.KEYCODE_Z:

Log.v("Test Action KEYCODE_Z", "action working");

break;

} return true; // Event handled

MainActivity MainActivity

import com.texture_mapping.R;

import android.opengl.GLSurfaceView; import android.os.Bundle; import android.app.Activity; import android.content.pm.ActivityInfo; import android.view.Menu; import android.view.Window; import android.view.WindowManager; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.view.Menu; import android.widget.Toast;

public class MainActivity extends Activity {

/** The OpenGL view */ private GLSurfaceView glSurfaceView;

@Override protected void onCreate(Bundle

savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main);

// requesting to turn the title OFF

requestWindowFeature(Window.FEATURE_NO_TITLE); // making it full screen

getWindow().setFlags(WindowManager.LayoutParams.F LAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

// Initiate the Open GL view and // create an instance with this activity glSurfaceView = new ESSurfaceView(this);

// set our renderer to be the main renderer with // the current activity context //glSurfaceView.setRenderer(new ESRender()); setContentView(glSurfaceView);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATI ON_REVERSE_LANDSCAPE);

boolean doubleBackToExitPressedOnce = false;

@Override public void onBackPressed() { if (doubleBackToExitPressedOnce) {

super.onBackPressed(); return;

} this.doubleBackToExitPressedOnce = true; Toast.makeText(this, "Klik BACK dua kali

untuk exit", Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() {

@Override public void run() {

doubleBackToExitPressedOnce=false;

} }, 2000); } /** * Remember to resume the glSurface */

@Override protected void onResume() {

super.onResume(); glSurfaceView.onResume();

/** * Also pause the glSurface */

@Override protected void onPause() {

super.onPause(); glSurfaceView.onPause();

@Override public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }