BAB 9 Project Pilihanimamcs.lecture.ub.ac.id/files/2012/08/Part-3-of-3-dari-Modul-Ajar... · 558...

755
558 BAB 9 Project Pilihan 9.1 Random Maze 9.1.1 Konsep Random Maze merupakan permainan yang mengedepankan strategi untuk mencari jalan keluar dengan cepat, tanpa tersesat pada jalan yang buntu. Pertama ketika aplikasi dijalankan, maka map dari daerah pencarian akan dirandom dengan ukuran tertentu. Pada kondisi awal, letak dari agen berada di posisi start, dan tujuan akhirnya adalah posisi goal. Untuk menggerakkan agen (yang berbentuk segitiga), tombol control dibagian kanan bawah dapat digunakan untuk melakukan hal tersebut. 9.1.2 Tampilan Implementasi Aplikasi ini mengimplementasikan primitive object, texture map- ping, pencahayaan dengan tampilan objek garis, segitiga, segiempat, bola, counter pantulan bola, serta dengan tombol control yang diberikan texture tertentu untuk memindahkan objek (agen) dalam mencari solusi pencarian jalan keluar. Berikut ini beberapa visualisasi dari permainan Random Maze, mulai dari adanya background (gambar, fractal), tombol control, animasi objek bergerak, efek pencahayaan, sampai pada log posisi track sentuhan tangan pada layar. Gambar 9.1 Random Maze dengan Background Hitam

Transcript of BAB 9 Project Pilihanimamcs.lecture.ub.ac.id/files/2012/08/Part-3-of-3-dari-Modul-Ajar... · 558...

558

BAB 9 Project Pilihan

9.1 Random Maze

9.1.1 Konsep

Random Maze merupakan permainan yang mengedepankan strategi untuk mencari jalan keluar dengan cepat, tanpa tersesat pada jalan yang buntu. Pertama ketika aplikasi dijalankan, maka map dari daerah pencarian akan dirandom dengan ukuran tertentu. Pada kondisi awal, letak dari agen berada di posisi start, dan tujuan akhirnya adalah posisi goal. Untuk menggerakkan agen (yang berbentuk segitiga), tombol control dibagian kanan bawah dapat digunakan untuk melakukan hal tersebut.

9.1.2 Tampilan Implementasi

Aplikasi ini mengimplementasikan primitive object, texture map-ping, pencahayaan dengan tampilan objek garis, segitiga, segiempat, bola, counter pantulan bola, serta dengan tombol control yang diberikan texture tertentu untuk memindahkan objek (agen) dalam mencari solusi pencarian jalan keluar. Berikut ini beberapa visualisasi dari permainan Random Maze, mulai dari adanya background (gambar, fractal), tombol control, animasi objek bergerak, efek pencahayaan, sampai pada log posisi track sentuhan tangan pada layar.

Gambar 9.1 Random Maze dengan Background Hitam

559

Gambar 9.2 Random Maze dengan Background Abu-Abu

Gambar 9.3 Random Maze Background Gambar

Gambar 9.4 Random Maze Background Gambar, Control Objek

560

9.1.3 Source Code

Source Code 9.1 Code Random Maze

ESRender.java

package com.fractalbackground;

import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;

import android.content.Context;

import android.opengl.GLSurfaceView.Renderer;

public class ESRender implements Renderer {

private ESText glText;

private PrimitivesObject primobbg;

private PrimitivesObject primobflappy;

private PrimitivesObject primobground;

private PrimitivesObject primob1;

private PrimitivesObject primob3;

private ObjectBall objectball2;

//private ObjectBall objectball3;

private ObjectBall objectballstick;

//private ObjectBall objectballstickdua;

private ObjectBall objectballbgstick;

private PrimitivesObject primob;

//private PrimitivesObject primob2;

private TransObject transobject;

private final MySphere mEarth,mEarth2,mEarth3;

Context context;

int Run_Mode=0;

float CurrentAngle = 0.0f; //

Angle in degrees

float CurrentAngle2 = 0.0f; //

Angle in degrees

float AnimateStep = 2.0f; //

Rotation step per update

float AnimateStep2 = 0.2f; //

Rotation step per update

float ScaleStep = 1.0f;

private float move_left_right1 =0.f;

private float move_left_right2 =0.f;

private float kecepatan_ground = 5.0f;

private int faktor_naik_turun=0;

private int flag_naik=1;

private long startTime;

private long fpsStartTime;

private long numFrames;

private float fps_temp;

561

private long fpsElapsed_temp;

private long numFrames_temp;

private boolean startTimeInit=true;

private long fpsStartTime2;

private long numFrames2;

private int numIDFrame=0;

float CurrentScale =1.0f;

float radius = 50.0f; // Ball's radius

float x = radius; // Ball's center (x,y)

float y = radius;

float speedX = 0.5f; // Ball's speed (x,y)

float speedY = 0.3f;

int xMin, xMax, yMin, yMax;

private int mywidth = 0;

private int myheight = 0;

private int jumlah_pantulan=0;

private float x_player = 0;

private float y_player = 0;

private float x_player_end = 0;

private float y_player_end = 0;

private int Navigate = 0;

private int positionRow = 0;

private int positionCol = 0;

//private int hori[][] = new

int[2*primob.numberRow*primob.numberCol][2*primob.num

berRow*primob.numberCol];

//private int verti[][] = new

int[2*primob.numberRow*primob.numberCol][2*primob.num

berRow*primob.numberCol];

private int hori[][] = new int[1000][1000];

private int verti[][] = new int[1000][1000];

private int numberCol =0;

private int numberRow =0;

private float WidthObject =0;

private float x_anim_stick = 0;

private float y_anim_stick = 0;

private float x_touch = 0;

private float y_touch = 0;

private float x_pointer = 0;

private float y_pointer = 0;

private float x_pointer_awal = 0;

private float y_pointer_awal = 0;

private float x_lebar_layar = 0;

private float y_tinggi_layar = 0;

private float sudut_pointer = 0;

562

private float jarak_center = 0;

private String arah_joystick="";

boolean get_size_screen=true;

private float x_graf = 0;

private float y_graf = 0;

int[] textures_indek = new int[1];

float black[] = new float[] { 0.0f, 0.0f, 0.0f,

1.0f };

float yellow[] = new float[] { 1.0f, 1.0f, 0.0f,

1.0f };

float cyan[] = new float[] { 0.0f, 1.0f, 1.0f,

1.0f };

float white[] = new float[] { 1.0f, 1.0f, 1.0f,

1.0f };

float diffuseMaterial[] = new float[] { 0.73f,

0.13f, 0.86f, 1.0f }; // set cahaya warna ungu

float diffuseMaterial2[] = new float[] { 0.5f,

0.5f, 0.5f, 1.0f }; // set cahaya warna ungu

float lightAmbient[] = new float[] { 0.2f, 0.3f,

0.6f, 1.0f };

float mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f

};

float light_position[] = { 0.0f, 0.0f, 1.0f, 0.0f

};

float light_position2[] = { 0.0f, 0.0f, 1.0f,

0.0f };

/** Constructor to set the handed over context */

public ESRender(Context context) {

// super();

this.context = context;

this.primobbg = new PrimitivesObject();

this.primobflappy = new

PrimitivesObject();

this.primobground = new

PrimitivesObject();

this.primob1 = new PrimitivesObject();

this.primob3 = new PrimitivesObject();

this.objectball2 = new ObjectBall();

//this.objectball3 = new ObjectBall();

this.objectballstick = new ObjectBall();

this.objectballbgstick = new

ObjectBall();

this.primob = new PrimitivesObject();

//this.primob2 = new PrimitivesObject();

this.mEarth = new MySphere(5, 3);

this.mEarth2 = new MySphere(5, 3);

this.mEarth3 = new MySphere(5, 3);

this.transobject = new TransObject();

//mengambil nilai xyx (posisi awal)

labirin player

563

this.x_player = primob.x_player;

this.y_player = primob.y_player;

this.x_player_end = primob.x_player_end;

this.y_player_end = primob.y_player_end;

this.positionRow = primob.positionRow;

this.positionCol = primob.positionCol;

this.hori = primob.hori;

this.verti = primob.verti;

this.numberCol = primob.numberCol;

this.numberRow = primob.numberRow;

this.WidthObject = primob.WidthObject;

}

@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);

// gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

gl.glEnable(GL10.GL_DEPTH_TEST);

gl.glEnable(GL10.GL_NORMALIZE);

//gl.glLoadIdentity();

//gl.glMaterialfv(GL10.GL_FRONT,

GL10.GL_AMBIENT_AND_DIFFUSE, makeFloatBuffer(cyan));

//gl.glMaterialfv(GL10.GL_FRONT,

GL10.GL_SPECULAR, white,0);

//gl.glMaterialfv(GL10.GL_FRONT,

GL10.GL_SHININESS, white,0);

//gl.glMaterialfv(GL10.GL_FRONT,

GL10.GL_DIFFUSE, white,0);

// multi light

/*float light1_ambient[] = { 0.2f, 0.2f,

0.2f, 1.0f };

float light1_diffuse[] = { 1.0f, 1.0f,

1.0f, 1.0f };

float light1_specular[] = { 1.0f, 1.0f,

1.0f, 1.0f };

float light1_position[] = { -2.0f, 2.0f,

1.0f, 1.0f };

float spot_direction[] = { -1.0f, -1.0f,

0.0f };

*/

/*gl.glLightfv(GL10.GL_LIGHT1,

564

GL10.GL_AMBIENT, light1_ambient,0);

gl.glLightfv(GL10.GL_LIGHT1,

GL10.GL_DIFFUSE, light1_diffuse,0);

gl.glLightfv(GL10.GL_LIGHT1,

GL10.GL_SPECULAR, light1_specular,0);

gl.glLightfv(GL10.GL_LIGHT1,

GL10.GL_POSITION, light1_position,0);

gl.glLightf(GL10.GL_LIGHT1,

GL10.GL_CONSTANT_ATTENUATION, 1.5f);

gl.glLightf(GL10.GL_LIGHT1,

GL10.GL_LINEAR_ATTENUATION, 0.5f);

gl.glLightf(GL10.GL_LIGHT1,

GL10.GL_QUADRATIC_ATTENUATION, 0.2f);

gl.glLightf(GL10.GL_LIGHT1,

GL10.GL_SPOT_CUTOFF, 45.0f);

gl.glLightfv(GL10.GL_LIGHT1,

GL10.GL_SPOT_DIRECTION, spot_direction,0);

gl.glLightf(GL10.GL_LIGHT1,

GL10.GL_SPOT_EXPONENT, 2.0f);

gl.glEnable(GL10.GL_LIGHT1);*/

//end multi light

//

//membuat background

gl.glPushMatrix();

gl.glDisable(GL10.GL_LIGHTING);

gl.glScalef(x_lebar_layar,

y_tinggi_layar, 1.0f);

primobbg.draw_background(gl);

gl.glEnable(GL10.GL_LIGHTING);

gl.glPopMatrix();

int x_lebar_layar_temp=(int)

(Math.ceil(x_lebar_layar/kecepatan_ground)*kecepatan_

ground);

//membuat ground 1 flappy

gl.glPushMatrix();

gl.glDisable(GL10.GL_LIGHTING);

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

gl.glTranslatef(0, -50.f,

0.f);

gl.glScalef(x_lebar_layar_temp,

1.5f*y_tinggi_layar/10, 1.0f);

primobground.draw_background(gl);

gl.glEnable(GL10.GL_LIGHTING);

gl.glPopMatrix();

move_left_right1-=kecepatan_ground;

if(-move_left_right1==x_lebar_layar_temp){

move_left_right1=x_lebar_layar_temp;

565

}

//membuat ground 2 flappy

gl.glPushMatrix();

gl.glDisable(GL10.GL_LIGHTING);

gl.glTranslatef(move_left_right2,

0.f, 0.f);

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

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

gl.glScalef(x_lebar_layar_temp,

1.5f*y_tinggi_layar/10, 1.0f);

primobground.draw_background(gl);

gl.glEnable(GL10.GL_LIGHTING);

gl.glPopMatrix();

move_left_right2-=kecepatan_ground;

if(-move_left_right2==2*x_lebar_layar_temp){

move_left_right2=0;

}

//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.glDisable(GL10.GL_LIGHTING);

gl.glBlendFunc(GL10.GL_SRC_ALPHA,

GL10.GL_ONE_MINUS_SRC_ALPHA);

gl.glEnable(GL10.GL_BLEND);

// mengatur naik turun

gl.glTranslatef(0,

faktor_naik_turun, 0.0f);

gl.glTranslatef(x_lebar_layar/2,

y_tinggi_layar/2, 0.0f);

gl.glScalef(x_lebar_layar/10, y_tinggi_layar/10,

566

1.0f);

primobflappy.loadBallTexture2(gl, context,

numIDFrame);

//gl.glColor4f(1.0f, 1.0f,

1.0f, 1.0f);

primobflappy.draw_background(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==0){

numIDFrame=0;

}

}else{

gl.glPushMatrix();

gl.glDisable(GL10.GL_LIGHTING);

gl.glBlendFunc(GL10.GL_SRC_ALPHA,

GL10.GL_ONE_MINUS_SRC_ALPHA);

gl.glEnable(GL10.GL_BLEND);

// mengatur naik turun

gl.glTranslatef(0,

faktor_naik_turun, 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);

//gl.glColor4f(1.0f, 1.0f,

1.0f, 1.0f);

primobflappy.draw_background(gl);

567

gl.glDisable(GL10.GL_BLEND);

gl.glEnable(GL10.GL_LIGHTING);

gl.glPopMatrix();

}

//fractal mandelbrot

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glTranslatef(550.0f,

200.0f, 0.0f);

//gl.glScalef(CurrentScale*5.0f,

CurrentScale*5.0f, 1.0f);

gl.glScalef(60.0f, 60.0f,

1.0f);

//gl.glRotatef(CurrentAngle2,

0, 0, 1);

//

primob2.draw_fractal_mandelbrot(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();*/

//fractal julia

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glTranslatef(550.0f,

200.0f, 0.0f);

//gl.glScalef(CurrentScale*5.0f,

CurrentScale*5.0f, 1.0f);

gl.glScalef(100.0f,

100.0f, 1.0f);

gl.glRotatef(CurrentAngle2, 0,

0, 1);

//primob2.draw_fractal_julia(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();*/

//fractal julia_m

/*gl.glPushMatrix();

gl.glDisable(GL10.GL_LIGHTING);

gl.glTranslatef(550.0f, 200.0f,

0.0f);

//gl.glScalef(CurrentScale*5.0f,

CurrentScale*5.0f, 1.0f);

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

//gl.glRotatef(CurrentAngle2, 0, 0,

1);

gl.glEnable(GL10.GL_POINT_SMOOTH);

gl.glPointSize(1);

primob2.draw_fractal_julia_m(gl);

gl.glEnable(GL10.GL_LIGHTING);

gl.glPopMatrix();

*/

568

// bola 1

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glTranslatef(400.0f,

200.0f, 0.0f);

gl.glScalef(25.0f, 25.0f,

25.0f);

gl.glRotatef(CurrentAngle, 0,

1, 0);

mEarth.draw(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();*/

// menampilkan object bola2 + lighting

/*gl.glPushMatrix ();

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

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

gl.glTranslatef (0.0f, 0.0f, -

5.0f);

gl.glPushMatrix ();

gl.glRotatef (CurrentAngle,

1.0f, 0.0f, 0.0f);

gl.glMaterialf(GL10.GL_FRONT,

GL10.GL_SHININESS, 100.0f);

gl.glLightfv(GL10.GL_LIGHT0,

GL10.GL_POSITION, light_position,0);

gl.glLightfv (GL10.GL_LIGHT0,

GL10.GL_DIFFUSE, white,0);

gl.glLightfv(GL10.GL_LIGHT0,

GL10.GL_AMBIENT, lightAmbient, 0);

gl.glLightfv(GL10.GL_LIGHT0,

GL10.GL_SPECULAR, white, 0);

gl.glTranslatef (0.0f, 0.0f,

3.5f);

gl.glDisable

(GL10.GL_LIGHTING);

gl.glScalef(0.3f,

0.3f, 0.3f);

transobject.draw_kubus(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix ();

gl.glRotatef(CurrentAngle, 0, 1, 0);

mEarth2.draw(gl);

gl.glPopMatrix ();

*/

// menampilkan object bola3 + lighting

/*gl.glPushMatrix ();

gl.glTranslatef(mywidth-2*radius,

myheight-4f*radius, 0.0f);

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

gl.glTranslatef (0.0f, 0.0f, -

569

5.0f);

gl.glPushMatrix ();

gl.glRotatef (CurrentAngle,

0.0f, 1.0f, 0.0f);

gl.glTranslatef (0.0f, 0.0f,

3.5f);

gl.glMaterialf(GL10.GL_FRONT,

GL10.GL_SHININESS, 100.0f);

gl.glLightfv (GL10.GL_LIGHT0,

GL10.GL_POSITION, light_position,0);

gl.glLightfv(GL10.GL_LIGHT0,

GL10.GL_AMBIENT, lightAmbient, 0);

gl.glLightfv(GL10.GL_LIGHT0,

GL10.GL_DIFFUSE, white, 0);

gl.glLightfv(GL10.GL_LIGHT0,

GL10.GL_SPECULAR, white, 0);

gl.glDisable

(GL10.GL_LIGHTING);

gl.glScalef(0.3f,

0.3f, 0.3f);

transobject.draw_kubus(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix ();

gl.glPushMatrix ();

gl.glRotatef (-CurrentAngle,

0.0f, 1.0f, 0.0f);

gl.glTranslatef (0.0f, 0.0f,

3.5f);

gl.glMaterialf(GL10.GL_FRONT,

GL10.GL_SHININESS, 100.0f);

gl.glLightfv (GL10.GL_LIGHT1,

GL10.GL_POSITION, light_position,0);

gl.glLightfv(GL10.GL_LIGHT1,

GL10.GL_AMBIENT, lightAmbient, 0);

gl.glLightfv(GL10.GL_LIGHT1,

GL10.GL_DIFFUSE, white, 0);

gl.glLightfv(GL10.GL_LIGHT1,

GL10.GL_SPECULAR, white, 0);

gl.glDisable

(GL10.GL_LIGHTING);

gl.glScalef(0.3f,

0.3f, 0.3f);

transobject.draw_kubus(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glEnable(GL10.GL_LIGHT0);

gl.glEnable(GL10.GL_LIGHT1);

gl.glPopMatrix ();

gl.glRotatef(CurrentAngle, 1, 0, 0);

570

mEarth3.draw(gl);

gl.glPopMatrix ();

gl.glLoadIdentity();

*/

// cahaya bola ungu

/*gl.glPushMatrix ();

gl.glTranslatef(mywidth-2*radius,

myheight-1.2f*radius, 0.0f);

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

gl.glTranslatef (0.0f, 0.0f, -

5.0f);

gl.glPushMatrix ();

gl.glRotatef

(CurrentAngle, 1.0f, 0.0f, 0.0f);

gl.glMaterialf(GL10.GL_FRONT, GL10.GL_SHININESS,

100.0f);

gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION,

light_position,0);

gl.glLightfv

(GL10.GL_LIGHT0, GL10.GL_DIFFUSE,

diffuseMaterial,0);

gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT,

lightAmbient, 0);

gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, white,

0);

gl.glTranslatef (0.0f,

0.0f, 3.5f);

gl.glDisable

(GL10.GL_LIGHTING);

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

transobject.draw_kubus(gl);

gl.glEnable

(GL10.GL_LIGHTING);

gl.glEnable(GL10.GL_LIGHT0);

gl.glDisable(GL10.GL_LIGHT1);

gl.glPopMatrix ();

mEarth2.draw(gl);

gl.glPopMatrix ();

*/

// menampilkan persegi dengan gradasi

warna

/*gl.glPushMatrix();

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

571

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

// objectarena.draw_kotak(gl);

gl.glPopMatrix();*/

// menampilkan lingkaran dengan tepian

berwarna

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

// 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.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

*/

// menampilkan bola bumi

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

//gl.glLineWidth(1.0f);

//gl.glEnable(GL10.GL_LINE_SMOOTH);

// bounds.set(x - radius,

y - radius, x + radius, y + radius);

gl.glTranslatef(-x, -y,

0.0f);

gl.glTranslatef(mywidth-

radius, myheight-radius, 0.0f);

gl.glScalef(50.0f/3.0f,50.0f/3.0f,50.0f/3.0f);

gl.glRotatef(CurrentAngle,

0, 1, 0);

mEarth.draw(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

*/

// menampilkan bola putar dengan gradasi

warna (3D)

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glLineWidth(1.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

// bounds.set(x - radius,

y - radius, x + radius, y + radius);

//gl.glTranslatef(x, y,

0.0f);

gl.glTranslatef(50.0f,

50.0f, 0.0f);

gl.glScalef(50.0f/3.0f,50.0f/3.0f,50.0f/3.0f);

572

//objectball2.draw_circle_color(gl);

gl.glRotatef(CurrentAngle,

0, 1, 0);

//mEarth3.draw(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

*/

// menampilkan bola pantul dengan gradasi

warna (3D)

gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glLineWidth(1.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

// bounds.set(x - radius, y -

radius, x + radius, y + radius);

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

gl.glTranslatef(50.0f, 50.0f,

0.0f);

gl.glScalef(50.0f/3.0f,50.0f/3.0f,50.0f/3.0f);

//objectball2.draw_circle_color(gl);

gl.glRotatef(CurrentAngle, 0, 1,

0);

mEarth3.draw(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

// segitiga merah

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

//GLU.gluLookAt(gl, 0, 0,

0.01f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

gl.glColor4f(1.0f, 0.0f,

0.0f, 0.5f);

gl.glTranslatef(50.0f,

60.0f, 0.0f);

gl.glScalef(80.0f, 80.0f,

0.0f);

gl.glRotatef(180, 1.0f,

0.0f, 0.0f);

//gl.glRotatef(mAngle,

0.0f, 1.0f, 0.0f);

gl.glTranslatef(-0.5f, -

0.5f, 0.0f);

objectball.draw_segitiga(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

*/

// segitiga hijau

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

573

//GLU.gluLookAt(gl, 0, 0,

0.01f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

gl.glColor4f(0.0f, 0.0f,

1.0f, 0.5f);

gl.glTranslatef(60.0f,

60.0f, 0.0f);

gl.glScalef(80.0f, 80.0f,

0.0f);

gl.glRotatef(180, 1.0f,

0.0f, 0.0f);

//gl.glRotatef(mAngle,

0.0f, 1.0f, 0.0f);

gl.glTranslatef(-0.5f, -

0.5f, 0.0f);

objectball.draw_segitiga(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

*/

// menampilkan lingkaran dengan warna

merah + blending

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glEnable(GL10.GL_BLEND); // Turn blending on

(NEW)

gl.glDisable(GL10.GL_DEPTH_TEST); // Turn depth

testing off (NEW)

gl.glBlendFunc(GL10.GL_SRC_ALPHA,

GL10.GL_ONE_MINUS_SRC_ALPHA);

gl.glLineWidth(1.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

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

objectball3.draw_circle_color(gl,1.0f,0.f,0.f,0.5

f);

gl.glDisable(

GL10.GL_BLEND ); // Disable Alpha

Blend

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

// menampilkan lingkaran dengan warna

hijau + blending

gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glEnable(GL10.GL_BLEND); // Turn blending on

(NEW)

574

gl.glDisable(GL10.GL_DEPTH_TEST); // Turn depth

testing off (NEW)

gl.glBlendFunc(GL10.GL_SRC_ALPHA,

GL10.GL_ONE_MINUS_SRC_ALPHA);

gl.glLineWidth(1.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

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

objectball3.draw_circle_color(gl,0.0f,1.f,0.f,0.5

f);

gl.glDisable(

GL10.GL_BLEND ); // Disable Alpha

Blend

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

// menampilkan lingkaran dengan warna

biru + blending

gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glEnable(GL10.GL_BLEND); // Turn blending on

(NEW)

gl.glDisable(GL10.GL_DEPTH_TEST); // Turn depth

testing off (NEW)

gl.glBlendFunc(GL10.GL_SRC_ALPHA,

GL10.GL_ONE_MINUS_SRC_ALPHA);

gl.glLineWidth(1.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

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

objectball3.draw_circle_color(gl,0.0f,0.f,1.f,0.5

f);

gl.glDisable(

GL10.GL_BLEND ); // Disable Alpha

Blend

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

*/

// update

moveWithCollisionDetection(this);

575

set((int)-radius, (int)-radius, mywidth,

myheight);

// Log.i("Test get width : ", "" +

mywidth);

// Log.i("Test get height : ", "" +

myheight);

// render text

gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

// gl.glScalef(10.0f,

10.0f, 10.0f);

// 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.glDisable(GL10.GL_DEPTH_TEST); // Turn depth

testing off (NEW)

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)

glText.draw("Jumlah

Pantulan : (" + jumlah_pantulan + ")", 450, 2); //

Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

576

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(1.0f, 1.0f,

1.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Posisi Bola :

(" + x + "," + y + ")", 50, 2); // Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Posisi Touch

: (" + x_touch + "," + y_touch + ")", 450, 400); //

Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

577

//

WHITE)

glText.draw("Posisi Player

: (" + ((400*x_player)+50) + "," +

((400*y_player)+50) + ")", 50, 400); // Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Ukuran Layar

: (" + x_lebar_layar + "," + y_tinggi_layar + ")",

50, 380); // Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Posisi Tujuan

Player : (" + ((400*x_player_end)+50) + "," +

((400*y_player_end)+50) + ")", 450, 380); // Draw

// Test

578

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

if(

(x_player>=(x_player_end-(WidthObject/2))) &&

(x_player=(y_player_end-(WidthObject/2))) &&

(y_player

579

}

}

//gl.glLoadIdentity();

//glText.begin(0.0f, 0.0f,

1.0f, 1.0f); // Begin Text Rendering (Set Color

// Keep track of number of

frames drawn

//numFrames++;

//long fpsElapsed =

System.currentTimeMillis() - fpsStartTime;

//float fps = (numFrames *

1000.0F) / fpsElapsed;

//if (fpsElapsed > 5 * 1000) { //

every 5 seconds

//float fps = (numFrames *

1000.0F) / fpsElapsed;

// glText.draw( "Frames per

second : "+ fps + " (" + numFrames + " frames in " +

fpsElapsed + " ms)",470, 30); // Draw Test

String

//temp nilai fps dan

fpsElapsed terakhir

// fps_temp=fps;

// numFrames_temp=numFrames;

//

fpsElapsed_temp=fpsElapsed;

// fpsStartTime =

System.currentTimeMillis();

// numFrames = 0;

// startTimeInit=false;

/*}else{

if(startTimeInit){

//glText.draw(

"Frames per second : "+ fps + " (" + numFrames + "

frames in " + fpsElapsed + " ms)",450, 30);

// Draw Test String

}else{

glText.draw(

"Frames per second : "+ fps_temp + " (" +

numFrames_temp + " frames in " + fpsElapsed_temp + "

ms)",470, 30); // Draw Test String

}

}*/

//glText.end(); // End Text

Rendering

gl.glLoadIdentity();

580

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Arah : (" +

arah_joystick + ")", 450, 460); // Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Nilai Jarak

ke Center : (" + jarak_center + ")", 450, 440); //

Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Posisi

xy_anim_stick : (" + x_anim_stick + "," +

y_anim_stick + ")", 450, 420); // Draw

581

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Sudut Pointer

: (" + sudut_pointer + ")", 50, 460); // Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Posisi

xy_pointer : (" + x_pointer + "," + y_pointer + ")",

50, 440); // Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

582

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

gl.glLoadIdentity();

glText.begin(0.0f, 1.0f,

0.0f, 1.0f); // Begin Text Rendering (Set Color

//

WHITE)

glText.draw("Posisi

xy_pointer awal : (" + x_pointer_awal + "," +

y_pointer_awal + ")", 50, 420); // Draw

// Test

// String

//

textview.setText(String.valueOf(x));

// glText.draw( "Line 1",

-2, 2 ); // Draw Test String

// glText.draw( "Line 2",

0, 0 ); // Draw Test String

glText.end(); // End Text

Rendering

/*gl.glLoadIdentity();

glText.begin( 1.0f, 1.0f,

0.0f, 1.0f ); // Begin Text Rendering

gl.glScalef(0.5f, 0.5f,

0.5f);

glText.draw( "Grafika

Komputer", 40.0f, 140); //

// Draw Test String

glText.end(); // End Text

Rendering

*/

gl.glLoadIdentity();

glText.begin( 0.0f, 0.0f,

1.0f, 0.5f ); // Begin Text Rendering

//gl.glTranslatef(x_graf, y_graf, 0.f);

//Log.v("nilai

x_graf :", ""+x_graf);

//Log.v("nilai

y_graf :", ""+y_graf);

gl.glTranslatef(345.f, 200.f, 0.f);

//gl.glRotatef(-30,

0.0f, 0.0f, 1.0f);

583

gl.glScalef(1.5f,

1.5f, 1.5f);

gl.glTranslatef(5.f, 140.f, 0.f);

gl.glRotatef(CurrentAngle, 0.1f, 1.0f, 0.2f); //

Rotate

gl.glTranslatef(-

50.f, 0.f, 0.f);

glText.draw(

"Grafika Komputer", 0.0f, 0.0f); //

// Draw Test String

glText.end(); // End Text

Rendering

gl.glEnable (GL10.GL_LIGHTING);

// disable texture + alpha

gl.glDisable(GL10.GL_BLEND); //

Disable Alpha Blend

gl.glDisable(GL10.GL_TEXTURE_2D);

// Disable Texture Mapping

gl.glPopMatrix();

// membuat background joystick dari

lingkaran dengan texture

gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glLineWidth(1.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

//gl.glTranslatef(-x, -y,

0.0f);

gl.glTranslatef(mywidth-

(2*radius)-radius, 0.0f+radius, 0.0f);

objectballbgstick.draw_circle_color(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

// membuat joystick dari lingkaran dengan

texture

gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glLineWidth(1.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

gl.glTranslatef(x_anim_stick, y_anim_stick,

0.0f);

//gl.glTranslatef(mywidth-

2*radius, 0.5f*radius, 0.0f);

//canvas.drawBitmap(_joystick.get_joystick(),

//_controls._touchingPoint.x - 26,

_controls._touchingPoint.y - 26, null);

584

gl.glTranslatef(mywidth-

(1.5f*radius)-radius, (0.5f*radius)+radius, 0.0f);

//gl.glTranslatef(mywidth-

1.5f*radius, 0.5f*radius, 0.0f);

//gl.glTranslatef(1013.0f,

500.0f, 0.0f);

gl.glScalef(0.5f, 0.5f,

1.0f);

objectballstick.draw_circle_color(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

// membuat joystick dari lingkaran dengan

texture 2

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glLineWidth(1.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

gl.glTranslatef(x_anim_stick, y_anim_stick,

0.0f);

//gl.glTranslatef(mywidth-

2*radius, 0.5f*radius, 0.0f);

gl.glTranslatef(-

5*radius,0.0f,0.0f);

//canvas.drawBitmap(_joystick.get_joystick(),

//_controls._touchingPoint.x - 26,

_controls._touchingPoint.y - 26, null);

gl.glTranslatef(mywidth-

(1.5f*radius)-radius, (0.5f*radius)+radius, 0.0f);

//gl.glTranslatef(mywidth-

1.5f*radius, 0.5f*radius, 0.0f);

//gl.glTranslatef(1013.0f,

500.0f, 0.0f);

gl.glScalef(0.5f, 0.5f,

1.0f);

objectballstickdua.draw_circle_color(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();*/

//Log.v("mywidth: ", "" + mywidth);

//Log.v("myheight: ", "" + myheight);

//Log.v("radius: ", "" + radius);

// membuat jaring-jaring labirin

gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

585

//gl.glDisable(GL10.GL_DEPTH_TEST); // Turn depth

testing off (NEW)

//gl.glTranslatef(400.0f,

400.0f, 0.0f);

gl.glTranslatef(50.0f, 50.0f,

0.0f);

//gl.glScalef(25.0f,

25.0f, 25.0f);

gl.glScalef(400.0f,

400.0f, 1.0f);

gl.glTranslatef (0.0f,

0.0f, -5.0f);

gl.glLineWidth(4.0f);

gl.glEnable(GL10.GL_LINE_SMOOTH);

primob.draw_line_maze_horiverti(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

//gl.glLoadIdentity();

// segitiga dengan texture sebagai player

labirin

/*gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

//GLU.gluLookAt(gl, 0, 0, 0.01f,

0f, 0f, 0f, 0f, 1.0f, 0.0f);

gl.glTranslatef(50.0f, 60.0f,

0.0f);

gl.glScalef(80.0f, 80.0f, 0.0f);

gl.glRotatef(180, 1.0f, 0.0f,

0.0f);

gl.glTranslatef(-0.5f, -0.5f,

0.0f);

objectball.draw_segitiga_texture(gl);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();*/

// membuat player untuk labirin

gl.glPushMatrix();

gl.glDisable (GL10.GL_LIGHTING);

gl.glTranslatef(50.0f,

50.0f, 0.0f);

gl.glScalef(400.0f,

400.0f, 1.0f);

gl.glTranslatef (0.0f,

0.0f, -5.0f);

// start me-manage

pergerakan player

if(Navigate == 1)

//Navigate right

{

586

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

gl.glRotatef(-90.0f,

0.0f, 0.0f, 1.0f);

gl.glTranslatef(-

x_player, -y_player, 0.0f);

}

else if(Navigate == 2)

//Navigate bottom

{

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

gl.glRotatef(-180.0f,

0.0f, 0.0f, 1.0f);

gl.glTranslatef(-

x_player, -y_player, 0.0f);

}

else if(Navigate == 3)

//Navigate left

{

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

gl.glRotatef(90.0f,

0.0f, 0.0f, 1.0f);

gl.glTranslatef(-

x_player, -y_player, 0.0f);

}

// end me-manage

pergerakan player

primob.draw_segitiga_labirin_player(gl,positionCo

l,positionRow);

//primob.draw_segitiga_labirin_player(gl);

//primob1.draw_segitiga_texture(gl,positionCol,po

sitionRow);

gl.glEnable (GL10.GL_LIGHTING);

gl.glPopMatrix();

// membuat player untuk labirin as bot

/*int min = 1;

int max = 3;

Random init_random = new Random();

int my_random = init_random.nextInt(max -

min + 1) + min;

Navigate=my_random;

Log.v("my_random =",""+my_random);

*/

// Update the rotational angle after each

refresh

// re-Calculate animation

parameters

CurrentAngle += AnimateStep;

if (CurrentAngle > 360.0) {

587

//CurrentAngle -=

360.0*Math.floor(CurrentAngle/360.0);

CurrentAngle=0.0f;

CurrentAngle +=

AnimateStep;

}

CurrentAngle2 += AnimateStep2;

if (CurrentAngle2 > 360.0) {

//CurrentAngle -=

360.0*Math.floor(CurrentAngle/360.0);

CurrentAngle2=0.0f;

CurrentAngle2 +=

AnimateStep2;

}

// pengkondisian penghitungan

pantulan mulai dari nol

/*if(Run_ModeScale==0){

this.CurrentScale-

=ScaleStep;

this.Run_ModeScale=1;

}*/

CurrentScale += ScaleStep;

if (CurrentScale % 10.0f==0) {

ScaleStep = -1*ScaleStep;

}

//gl.glFlush();

}

public float getX_graf() {

return x_graf;

}

public void setX_graf(float x_graf) {

this.x_graf = x_graf;

}

public float getY_graf() {

return y_graf;

}

public void setY_graf(float y_graf) {

this.y_graf = y_graf;

}

public float getX_touch() {

return x_touch;

}

588

public void setX_touch(float x_touch) {

this.x_touch = x_touch;

}

public float getY_touch() {

return y_touch;

}

public void setY_touch(float y_touch) {

this.y_touch = y_touch;

}

public String getArah_joystick() {

return arah_joystick;

}

public void setArah_joystick(String

arah_joystick) {

this.arah_joystick = arah_joystick;

}

public float getJarak_center() {

return jarak_center;

}

public void setJarak_center(float jarak_center) {

this.jarak_center = jarak_center;

}

public float getSudut_pointer() {

return sudut_pointer;

}

public void setSudut_pointer(float sudut_pointer)

{

this.sudut_pointer = sudut_pointer;

}

public float getX_lebar_layar() {

return x_lebar_layar;

}

public void setX_lebar_layar(float x_lebar_layar)

{

this.x_lebar_layar = x_lebar_layar;

}

public float getY_tinggi_layar() {

return y_tinggi_layar;

}

589

public void setY_tinggi_layar(float

y_tinggi_layar) {

this.y_tinggi_layar = y_tinggi_layar;

}

public float getX_pointer_awal() {

return x_pointer_awal;

}

public void setX_pointer_awal(float

x_pointer_awal) {

this.x_pointer_awal = x_pointer_awal;

}

public float getY_pointer_awal() {

return y_pointer_awal;

}

public void setY_pointer_awal(float

y_pointer_awal) {

this.y_pointer_awal = y_pointer_awal;

}

public float getX_pointer() {

return x_pointer;

}

public void setX_pointer(float x_pointer) {

this.x_pointer = x_pointer;

}

public float getY_pointer() {

return y_pointer;

}

public void setY_pointer(float y_pointer) {

this.y_pointer = y_pointer;

}

public float getX_anim_stick() {

return x_anim_stick;

}

public void setX_anim_stick(float x_anim_stick) {

this.x_anim_stick = x_anim_stick;

}

public float getY_anim_stick() {

return y_anim_stick;

590

}

public void setY_anim_stick(float y_anim_stick) {

this.y_anim_stick = y_anim_stick;

}

public float getRadius() {

return radius;

}

public void setRadius(float radius) {

this.radius = radius;

}

public int getMywidth() {

return mywidth;

}

public void setMywidth(int mywidth) {

this.mywidth = mywidth;

}

public int getMyheight() {

return myheight;

}

public void setMyheight(int myheight) {

this.myheight = myheight;

}

public int getNumberRow() {

return numberRow;

}

public void setNumberRow(int numberRow) {

this.numberRow = numberRow;

}

public float getWidthObject() {

return WidthObject;

}

public void setWidthObject(float widthObject) {

WidthObject = widthObject;

}

public float getX_player() {

return x_player;

}

public void setX_player(float x_player) {

this.x_player = x_player;

591

}

public float getY_player() {

return y_player;

}

public void setY_player(float y_player) {

this.y_player = y_player;

}

public int getNavigate() {

return Navigate;

}

public void setNavigate(int navigate) {

Navigate = navigate;

}

public boolean goForward()

{

if(Navigate == 0 && positionRow > 0 &&

hori[positionRow][positionCol] == 0) return true;

if(Navigate == 1 && positionCol <

(numberCol-1) && verti[positionRow][positionCol+1] ==

0) return true;

if(Navigate == 2 && positionRow <

(numberRow-1) && hori[positionRow+1][positionCol] ==

0) return true;

if(Navigate == 3 && positionCol > 0 &&

verti[positionRow][positionCol] == 0) return true;

return false;

}

public int getPositionRow() {

return positionRow;

}

public void setPositionRow(int positionRow) {

this.positionRow = positionRow;

}

public int getPositionCol() {

return positionCol;

}

public void setPositionCol(int positionCol) {

this.positionCol = positionCol;

}

@Override

public void onSurfaceCreated(GL10 gl, EGLConfig

config) {

//gl.glClearColor(0.5f, 0.5f, 0.5f,

1.0f); // Set color's clear-value to

//gl.glClearColor(1.0f, 1.0f, 1.0f,

1.0f); // Set color's clear-value to

// black

gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

592

// Set color's clear-value to

gl.glClearDepthf(1.0f); // Set depth's

clear-value to farthest

gl.glEnable(GL10.GL_DEPTH_TEST); //

Enables depth-buffer for hidden

// 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

gl.glEnable(GL10.GL_LIGHTING);

gl.glEnable(GL10.GL_LIGHT0);

//gl.glEnable(GL10.GL_LIGHT1);

// 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", 14, 2,

2); // Create Font (Height: 14

//

Pixels / X+Y Padding

// 2

Pixels)

// gl.glDisable(GL10.GL_DITHER); //

Disable dithering for better

// performance

// Setup Blending (NEW)

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

Full brightness, 50% alpha (NEW)

gl.glBlendFunc(GL10.GL_SRC_ALPHA,

GL10.GL_ONE); // Select blending function (NEW)

// Setup Texture, each time the surface

is created (NEW)

primob3.loadBallTexture(gl, context,1);

primob1.loadBallTexture(gl, context,4);

objectball2.loadBallTexture(gl, context);

objectballstick.loadBallTexture(gl,

context,2);

593

objectballbgstick.loadBallTexture(gl,

context,3);

mEarth.loadGLTexture(gl, context,2);

//mEarth2.loadGLTexture(gl, context,6);

mEarth3.loadGLTexture(gl, context,4);

primobbg.loadBallTexture(gl, context, 5);

primobflappy.loadBallTexture2(gl,

context, 0);

primobground.loadBallTexture(gl, context,

6);

gl.glEnable(GL10.GL_TEXTURE_2D); //

Enable texture (NEW)

}

@Override

public void onSurfaceChanged(GL10 gl, int width,

int height) {

mywidth = width;

myheight = height;

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

// Setup orthographic projection

gl.glMatrixMode(GL10.GL_PROJECTION); //

Activate Projection Matrix

gl.glLoadIdentity(); // Load Identity

Matrix

gl.glOrthof( // Set Ortho Projection

(Left,Right,Bottom,Top,Front,Back)

0, width, 0, height,

500.0f, -500.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

/*float[] vertices_quad = { // Vertices

for the square

-1.0f, -1.0f, 0.0f, // 0.

left-bottom

1.0f, -1.0f, 0.0f, // 1.

right-bottom

-1.0f, 1.0f, 0.0f, // 2.

left-top

1.0f, 1.0f, 0.0f // 3.

right-top

};

// set background

Bitmap bitmap =

BitmapFactory.decodeStream(context.getResources()

594

.openRawResource(R.drawable.splash));

float tex_quad[] = {

-100, -100, 0,

100, -100, 0,

-100, 100, 0,

100, 100, 0

};

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0,

makeFloatBuffer(tex_quad));

gl.glTexCoordPointer(3, GL10.GL_FLOAT, 0,

makeFloatBuffer(vertices_quad)); // 5

gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRA

Y);

//gl.glVertexPointer(2, GL_FLOAT,

sizeof(GLfloat)*4, &tex_quad[0]);

//glTexCoordPointer(2, GL_FLOAT,

sizeof(GLfloat)*4, &tex_quad[2]);

gl.glDisable(GL10.GL_DEPTH_TEST);

gl.glDepthMask(false);

gl.glEnable(GL10.GL_TEXTURE_2D);

//gl.glGenTextures(1, textures_indek, 0);

gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);

gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0,

4);

//glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

//glEnable(GL_DEPTH_TEST);

gl.glEnable(GL10.GL_DEPTH_TEST);

gl.glDepthMask(true);

gl.glDisable( GL10.GL_TEXTURE_2D );

// Disable Texture Mapping

*/

}

public float getxMax() {

return xMax;

}

public void setxMax(int xmax) {

xMax = xmax;

}

public float getxMin() {

return xMin;

}

595

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_;

}

public float getspeedY() {

return speedY;

}

public void setspeedY(float speedY_) {

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;

this.jumlah_pantulan+=1;

} else if (x - radius <

esRender.getxMin()) {

speedX = -speedX;

x = esRender.getxMin() + radius;

this.jumlah_pantulan+=1;

}

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

speedY = -speedY;

y = esRender.getyMax() - radius;

this.jumlah_pantulan+=1;

} else if (y - radius <

esRender.getyMin()) {

596

speedY = -speedY;

y = esRender.getyMin() + radius;

this.jumlah_pantulan+=1;

}

// pengkondisian penghitungan pantulan

mulai dari nol

if(Run_Mode==0){

this.jumlah_pantulan-=4;

this.Run_Mode=1;

}

}

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;

}

}

ESSurfaceView.java

package com.fractalbackground;

import android.content.Context;

//import android.graphics.PixelFormat;

import android.graphics.Point;

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 float initx_stick = 425; public float

inity_stick = 267; public

* Point _touchingPoint = new Point(425,267);

597

public Point _pointerPosition

* = new Point(220,150);

*/

public float initx_stick = 1013;

public float inity_stick = 500;

public Point _touchingPoint = new Point(1013,

500);

public Point _pointerPosition = new Point(220,

150);

private Boolean _dragging = false;

private int flag_first = 0;

private float mypointer_awal_x = 0;

private float mypointer_awal_y = 0;

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);

//set background

//glSurfaceView = ...

/*glSurfaceView.setEGLConfigChooser(8, 8,

8, 8, 16, 0);

glSurfaceView.getHolder().setFormat(PixelFormat.T

RANSLUCENT);

glSurfaceView.setBackgroundResource(R.drawable.my

_background);

glSurfaceView.setZOrderOnTop(true);

glSurfaceView.setRenderer(...);

glSurfaceView.setRenderMode(...);*/

//this.setEGLConfigChooser(8, 8, 8, 8,

16, 0);

//this.getHolder().setFormat(PixelFormat.TRANSLUC

ENT);

598

//this.setBackgroundResource(R.drawable.splash);

//this.setZOrderOnTop(true);

//glSurfaceView.setRenderer(...);

//glSurfaceView.setRenderMode(...);

}

@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.

/*

* initx_stick =

esRender.getWidthObject()-esRender.getRadius();

* inity_stick = 0.0f; _touchingPoint.x =

(int) initx_stick;

* _touchingPoint.y= (int) inity_stick;

*

* _pointerPosition.x = (int)

initx_stick; _pointerPosition.y= (int)

* inity_stick;

*/

update(v);

float currentX = v.getX();

float currentY = v.getY();

float deltaX, deltaY;

// float scalingFactor = 0.50f /

((esRender.xMax > esRender.yMax) ?

// esRender.yMax

// : esRender.xMax);

switch (v.getAction()) {

case MotionEvent.ACTION_DOWN:

//Log.v("Test Action Down",

"action down working");

// esRender.setX_anim_stick(-

esRender.getRadius());

// esRender.setY_anim_stick(0.0f);

// membuat animasi pergerakan

tombol joystick

// bound to a box disekitar

joystick

/*

* if( currentX >=

_touchingPoint.x-esRender.getRadius() && currentX

*

599

_touchingPoint.x+esRender.getRadius()){

*

* if( currentY >=

_touchingPoint.y-esRender.getRadius() && currentY

* =

_touchingPoint.x-esRender.getRadius() && currentX

* =

_touchingPoint.y-esRender.getRadius() && currentY

*

600

"action working");

// esRender.setX_anim_stick(0.0f);

// esRender.setY_anim_stick(-

esRender.getRadius());

// 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;

return true; // Event handled

// break;

}

private MotionEvent lastEvent;

public void update(MotionEvent event) {

// initx_stick = 1066.0f-

1.5f*esRender.getRadius();

// inity_stick

=0.5f*esRender.getRadius();

if (event == null && lastEvent == null) {

return;

} else if (event == null && lastEvent !=

null) {

event = lastEvent;

} else {

601

lastEvent = event;

}

// drag drop

if (event.getAction() ==

MotionEvent.ACTION_DOWN) {

_dragging = true;

flag_first = 0;

} else if (event.getAction() ==

MotionEvent.ACTION_UP) {

_dragging = false;

}

// penanda untuk menyimpan koordinat yang

pertama kali diklik

if (_dragging) {

// get the pos

_touchingPoint.x = (int)

event.getX();

_touchingPoint.y = (int)

event.getY();

esRender.setX_touch(_touchingPoint.x);

esRender.setY_touch(esRender.getMyheight() -

_touchingPoint.y);

esRender.setJarak_center((float)

((Math.pow(_touchingPoint.x

-

(esRender.getMywidth() - 2 * esRender.getRadius()),

2)) + (Math

.pow(esRender.getMyheight() - _touchingPoint.y -

2

*

esRender.getRadius(), 2))));

if(esRender.getJarak_center()=

(esRender.getMywidth() - 200)

&& _touchingPoint.y

>= (esRender.getMyheight() - 200)

&& (((Math.pow(

602

_touchingPoint.x

- (esRender.getMywidth() - 2 * esRender

.getRadius()), 2)) +

(Math.pow(

esRender.getMyheight() - _touchingPoint.y - 2

* esRender.getRadius(), 2))) > Math.pow(

0.5

* esRender.getRadius(), 2))) {

Music.playOnce(esRender.context, R.raw.fb);

// membuat penanda untuk

mendapatkan point awal touch

if (flag_first == 0) {

esRender.setX_pointer_awal(_touchingPoint.x);

mypointer_awal_x =

esRender.getX_pointer_awal();

esRender.setY_pointer_awal(_touchingPoint.y);

mypointer_awal_y =

esRender.getY_pointer_awal();

flag_first = 1;

}

// kodisi jika titik awal

sama dengan titik pointer

if ((mypointer_awal_x ==

_touchingPoint.x)

&&

(mypointer_awal_y == _touchingPoint.y)) {

mypointer_awal_x =

esRender.getMywidth() - 100;

mypointer_awal_y =

esRender.getMyheight() - 100;

}

esRender.setX_pointer(_touchingPoint.x);

esRender.setY_pointer(_touchingPoint.y);

esRender.setX_lebar_layar(esRender.getMywidth());

esRender.setY_tinggi_layar(esRender.getMyheight()

);

// get the angle

double myangle = -Math

.atan2(_touchingPoint.y - mypointer_awal_y,

603

_touchingPoint.x - mypointer_awal_x)

/ (Math.PI

/ 180);

esRender.setSudut_pointer((float) myangle);

esRender.setX_anim_stick((float) (26.0f *

Math.cos(myangle

* (Math.PI

/ 180))));

esRender.setY_anim_stick((float) (26.0f *

Math.sin(myangle

* (Math.PI

/ 180))));

// set arah joystick

if ((float) myangle >= 45

&& (float) myangle

604

+

(esRender.getWidthObject() / 2));

esRender.setY_player(((esRender.getNumberRow()

-

esRender.getPositionRow() - 1) * esRender

.getWidthObject())

+

(esRender.getWidthObject() / 2));

} else if (((float)

myangle >= 0 && (float) myangle < 45)

|| ((float)

myangle >= -44 && (float) myangle

605

*

esRender.setY_anim_stick(_touchingPoint.y);

*/

// bound to a box

if (_touchingPoint.x < 400) {

_touchingPoint.x = 400;

}

if (_touchingPoint.x > 450) {

_touchingPoint.x = 450;

}

if (_touchingPoint.y < 240) {

_touchingPoint.y = 240;

}

if (_touchingPoint.y > 290) {

_touchingPoint.y = 290;

}

// get the angle

double angle =

Math.atan2(_touchingPoint.y - inity_stick,

_touchingPoint.x -

initx_stick) / (Math.PI / 180);

// Move the beetle in proportion

to how far

// the joystick is dragged from

its center

_pointerPosition.y +=

Math.sin(angle * (Math.PI / 180))

* (_touchingPoint.x

/ 70);

_pointerPosition.x +=

Math.cos(angle * (Math.PI / 180))

* (_touchingPoint.x

/ 70);

//

esRender.setX_anim_stick(_touchingPoint.x);

//

esRender.setY_anim_stick(_touchingPoint.y);

// make the pointer go thru

if (_pointerPosition.x > 480) {

_pointerPosition.x = 0;

}

if (_pointerPosition.x < 0) {

_pointerPosition.x = 480;

}

if (_pointerPosition.y > 320) {

_pointerPosition.y = 0;

}

if (_pointerPosition.y < 0) {

_pointerPosition.y = 320;

}

} else if (!_dragging) {

606

flag_first = 0;

// Snap back to center when the

joystick is released

_touchingPoint.x = (int)

initx_stick;

_touchingPoint.y = (int)

inity_stick;

esRender.setX_anim_stick(0.0f);

esRender.setY_anim_stick(0.0f);

// shaft.alpha = 0;

}

}

// 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

>= 0)) {

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_T: // up

if (esRender.getNavigate() == 0 &&

esRender.goForward())

esRender.setPositionRow(esRender.getPositionRow()

- 1);

else if (esRender.getNavigate() ==

1 && esRender.goForward())

esRender.setPositionCol(esRender.getPositionCol()

+ 1);

else if (esRender.getNavigate() ==

2 && esRender.goForward())

607

esRender.setPositionRow(esRender.getPositionRow()

+ 1);

else if (esRender.getNavigate() ==

3 && esRender.goForward())

esRender.setPositionCol(esRender.getPositionCol()

- 1);

Log.v("Test Action KEYCODE_T",

"action working");

esRender.setX_player((esRender.getPositionCol() *

esRender

.getWidthObject())

+ (esRender.getWidthObject() / 2));

esRender.setY_player(((esRender.getNumberRow()

-

esRender.getPositionRow() - 1) * esRender

.getWidthObject()) + (esRender.getWidthObject() /

2));

break;

case KeyEvent.KEYCODE_G:

Log.v("Test Action KEYCODE_G",

"action working");

break;

case KeyEvent.KEYCODE_H: // right

esRender.setNavigate(esRender.getNavigate() + 1);

Log.v("Test Action KEYCODE_H",

"action working");

break;

case KeyEvent.KEYCODE_F: // left

esRender.setNavigate(esRender.getNavigate() - 1);

Log.v("Test Action KEYCODE_F",

"action working");

break;

}

if (esRender.getNavigate() < 0)

esRender.setNavigate(3);

esRender.setNavigate(esRender.getNavigate() % 4);

return true; // Event handled

}

}

ESText.java

608

// This is a OpenGL ES 1.0 dynamic font rendering

system. It loads actual font

// files, generates a font map (texture) from them,

and allows rendering of

// text strings.

//

// NOTE: the rendering portions of this class uses a

sprite batcher in order

// provide decent speed rendering. Also, rendering

assumes a BOTTOM-LEFT

// origin, and the (x,y) positions are relative to

that, as well as the

// bottom-left of the string to render.

package com.fractalbackground;

import javax.microedition.khronos.opengles.GL10;

import android.content.res.AssetManager;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Typeface;

import android.opengl.GLUtils;

public class ESText {

//--Constants--//

public final static int CHAR_START = 32;

// First Character (ASCII Code)

public final static int CHAR_END = 126;

// Last Character (ASCII Code)

public final static int CHAR_CNT = ( ( ( CHAR_END

- CHAR_START ) + 1 ) + 1 ); // Character Count

(Including Character to use for Unknown)

public final static int CHAR_NONE = 32;

// Character to Use for Unknown (ASCII Code)

public final static int CHAR_UNKNOWN = ( CHAR_CNT

- 1 ); // Index of the Unknown Character

public final static int FONT_SIZE_MIN = 6;

// Minumum Font Size (Pixels)

public final static int FONT_SIZE_MAX = 180;

// Maximum Font Size (Pixels)

public final static int CHAR_BATCH_SIZE = 100;

// Number of Characters to Render Per Batch

//--Members--//

GL10 gl;

// GL10 Instance

AssetManager assets;

// Asset Manager

SpriteBatch batch;

// Batch Renderer

int fontPadX, fontPadY;

609

// Font Padding (Pixels; On Each Side, ie. Doubled on

Both X+Y Axis)

float fontHeight;

// Font Height (Actual; Pixels)

float fontAscent;

// Font Ascent (Above Baseline; Pixels)

float fontDescent;

// Font Descent (Below Baseline; Pixels)

int textureId;

// Font Texture ID [NOTE: Public for Testing Purposes

Only!]

int textureSize;

// Texture Size for Font (Square) [NOTE: Public for

Testing Purposes Only!]

TextureRegion textureRgn;

// Full Texture Region

float charWidthMax;

// Character Width (Maximum; Pixels)

float charHeight;

// Character Height (Maximum; Pixels)

final float[] charWidths;

// Width of Each Character (Actual; Pixels)

TextureRegion[] charRgn;

// Region of Each Character (Texture Coordinates)

int cellWidth, cellHeight;

// Character Cell Width/Height

int rowCnt, colCnt;

// Number of Rows/Columns

float scaleX, scaleY;

// Font Scale (X,Y Axis)

float spaceX;

// Additional (X,Y Axis) Spacing (Unscaled)

//--Constructor--//

// D: save GL instance + asset manager, create

arrays, and initialize the members

// A: gl - OpenGL ES 10 Instance

public ESText(GL10 gl, AssetManager assets) {

this.gl = gl;

// Save the GL10 Instance

this.assets = assets;

// Save the Asset Manager Instance

batch = new SpriteBatch( gl, CHAR_BATCH_SIZE );

// Create Sprite Batch (with Defined Size)

charWidths = new float[CHAR_CNT];

// Create the Array of Character Widths

charRgn = new TextureRegion[CHAR_CNT];

// Create the Array of Character Regions

// initialize remaining members

fontPadX = 0;

fontPadY = 0;

610

fontHeight = 0.0f;

fontAscent = 0.0f;

fontDescent = 0.0f;

textureId = -1;

textureSize = 0;

charWidthMax = 0;

charHeight = 0;

cellWidth = 0;

cellHeight = 0;

rowCnt = 0;

colCnt = 0;

scaleX = 1.0f;

// Default Scale = 1 (Unscaled)

scaleY = 1.0f;

// Default Scale = 1 (Unscaled)

spaceX = 0.0f;

}

//--Load Font--//

// description

// this will load the specified font file,

create a texture for the defined

// character range, and setup all required

values used to render with it.

// arguments:

// file - Filename of the font (.ttf, .otf) to

use. In 'Assets' folder.

// size - Requested pixel size of font (height)

// padX, padY - Extra padding per character

(X+Y Axis); to prevent overlapping characters.

public boolean load(String file, int size, int

padX, int padY) {

// setup requested values

fontPadX = padX;

// Set Requested X Axis Padding

fontPadY = padY;

// Set Requested Y Axis Padding

// load the font and setup paint instance for

drawing

Typeface tf = Typeface.createFromAsset( assets,

file ); // Create the Typeface from Font File

Paint paint = new Paint();

// Create Android Paint Instance

paint.setAntiAlias( true );

// Enable Anti Alias

paint.setTextSize( size );

// Set Text Size

paint.setColor( 0xffffffff );

// Set ARGB (White, Opaque)

paint.setTypeface( tf );

// Set Typeface

611

// get font metrics

Paint.FontMetrics fm = paint.getFontMetrics();

// Get Font Metrics

fontHeight = (float)Math.ceil( Math.abs(

fm.bottom ) + Math.abs( fm.top ) ); // Calculate

Font Height

fontAscent = (float)Math.ceil( Math.abs(

fm.ascent ) ); // Save Font Ascent

fontDescent = (float)Math.ceil( Math.abs(

fm.descent ) ); // Save Font Descent

// determine the width of each character

(including unknown character)

// also determine the maximum character width

char[] s = new char[2];

// Create Character Array

charWidthMax = charHeight = 0;

// Reset Character Width/Height Maximums

float[] w = new float[2];

// Working Width Value

int cnt = 0;

// Array Counter

for ( char c = CHAR_START; c charWidthMax )

// IF Width Larger Than Max Width

charWidthMax = charWidths[cnt];

// Save New Max Width

cnt++;

// Advance Array Counter

}

s[0] = CHAR_NONE;

// Set Unknown Character

paint.getTextWidths( s, 0, 1, w );

// Get Character Bounds

charWidths[cnt] = w[0];

// Get Width

if ( charWidths[cnt] > charWidthMax )

// IF Width Larger Than Max Width

charWidthMax = charWidths[cnt];

// Save New Max Width

cnt++;

// Advance Array Counter

// set character height to font height

charHeight = fontHeight;

// Set Character Height

// find the maximum size, validate, and setup

cell sizes

cellWidth = (int)charWidthMax + ( 2 * fontPadX

); // Set Cell Width

cellHeight = (int)charHeight + ( 2 * fontPadY

612

); // Set Cell Height

int maxSize = cellWidth > cellHeight ?

cellWidth : cellHeight; // Save Max Size

(Width/Height)

if ( maxSize < FONT_SIZE_MIN || maxSize >

FONT_SIZE_MAX ) // IF Maximum Size Outside Valid

Bounds

return false;

// Return Error

// set texture size based on max font size

(width or height)

// NOTE: these values are fixed, based on the

defined characters. when

// changing start/end characters

(CHAR_START/CHAR_END) this will need adjustment too!

if ( maxSize

613

s[0] = c;

// Set Character to Draw

canvas.drawText( s, 0, 1, x, y, paint );

// Draw Character

x += cellWidth;

// Move to Next Character

if ( ( x + cellWidth - fontPadX ) >

textureSize ) { // IF End of Line Reached

x = fontPadX;

// Set X for New Row

y += cellHeight;

// Move Down a Row

}

}

s[0] = CHAR_NONE;

// Set Character to Use for NONE

canvas.drawText( s, 0, 1, x, y, paint );

// Draw Character

// generate a new texture

int[] textureIds = new int[1];

// Array to Get Texture Id

gl.glGenTextures( 1, textureIds, 0 );

// Generate New Texture

textureId = textureIds[0];

// Save Texture Id

// setup filters for texture

gl.glBindTexture( GL10.GL_TEXTURE_2D, textureId

); // Bind Texture

gl.glTexParameterf( GL10.GL_TEXTURE_2D,

GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST ); //

Set Minification Filter

gl.glTexParameterf( GL10.GL_TEXTURE_2D,

GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR ); // Set

Magnification Filter

gl.glTexParameterf( GL10.GL_TEXTURE_2D,

GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE ); //

Set U Wrapping

gl.glTexParameterf( GL10.GL_TEXTURE_2D,

GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE ); //

Set V Wrapping

// load the generated bitmap onto the texture

GLUtils.texImage2D( GL10.GL_TEXTURE_2D, 0,

bitmap, 0 ); // Load Bitmap to Texture

gl.glBindTexture( GL10.GL_TEXTURE_2D, 0 );

// Unbind Texture

// release the bitmap

bitmap.recycle();

// Release the Bitmap

// setup the array of character texture regions

x = 0;

// Initialize X

y = 0;

// Initialize Y

for ( int c = 0; c < CHAR_CNT; c++ ) {

614

// FOR Each Character (On Texture)

charRgn[c] = new TextureRegion( textureSize,

textureSize, x, y, cellWidth-1, cellHeight-1 ); //

Create Region for Character

x += cellWidth;

// Move to Next Char (Cell)

if ( x + cellWidth > textureSize ) {

x = 0;

// Reset X Position to Start

y += cellHeight;

// Move to Next Row (Cell)

}

}

// create full texture region

textureRgn = new TextureRegion( textureSize,

textureSize, 0, 0, textureSize, textureSize ); //

Create Full Texture Region

// return success

return true;

// Return Success

}

//--Begin/End Text Drawing--//

// D: call these methods before/after

(respectively all draw() calls using a text instance

// NOTE: color is set on a per-batch basis, and

fonts should be 8-bit alpha only!!!

// A: red, green, blue - RGB values for font

(default = 1.0)

// alpha - optional alpha value for font

(default = 1.0)

// R: [none]

public void begin() {

begin( 1.0f, 1.0f, 1.0f, 1.0f );

// Begin with White Opaque

}

public void begin(float alpha) {

begin( 1.0f, 1.0f, 1.0f, alpha );

// Begin with White (Explicit Alpha)

}

public void begin(float red, float green, float

blue, float alpha) {

gl.glColor4f( red, green, blue, alpha );

// Set Color+Alpha

gl.glBindTexture( GL10.GL_TEXTURE_2D, textureId

); // Bind the Texture

batch.beginBatch();

// Begin Batch

}

public void end() {

batch.endBatch();

// End Batch

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

// Restore Default Color/Alpha

}

//--Draw Text--//

615

// D: draw text at the specified x,y position

// A: text - the string to draw

// x, y - the x,y position to draw text at

(bottom left of text; including descent)

// R: [none]

public void draw(String text, float x, float y) {

float chrHeight = cellHeight * scaleY;

// Calculate Scaled Character Height

float chrWidth = cellWidth * scaleX;

// Calculate Scaled Character Width

int len = text.length();

// Get String Length

x += ( chrWidth / 2.0f ) - ( fontPadX * scaleX

); // Adjust Start X

y += ( chrHeight / 2.0f ) - ( fontPadY * scaleY

); // Adjust Start Y

for ( int i = 0; i < len; i++ ) {

// FOR Each Character in String

int c = (int)text.charAt( i ) - CHAR_START;

// Calculate Character Index (Offset by First Char in

Font)

if ( c < 0 || c >= CHAR_CNT )

// IF Character Not In Font

c = CHAR_UNKNOWN;

// Set to Unknown Character Index

batch.drawSprite( x, y, chrWidth, chrHeight,

charRgn[c] ); // Draw the Character

x += ( charWidths[c] + spaceX ) * scaleX;

// Advance X Position by Scaled Character Width

}

}

//--Draw Text Centered--//

// D: draw text CENTERED at the specified x,y

position

// A: text - the string to draw

// x, y - the x,y position to draw text at

(bottom left of text)

// R: the total width of the text that was drawn

public float drawC(String text, float x, float y)

{

float len = getLength( text );

// Get Text Length

draw( text, x - ( len / 2.0f ), y - (

getCharHeight() / 2.0f ) ); // Draw Text Centered

return len;

// Return Length

}

public float drawCX(String text, float x, float y)

{

float len = getLength( text );

// Get Text Length

draw( text, x - ( len / 2.0f ), y );

// Draw Text Centered (X-Axis Only)

return len;

// Return Length

}

public void drawCY(String text, float x, float y)

{

616

draw( text, x, y - ( getCharHeight() / 2.0f )

); // Draw Text Centered (Y-Axis Only)

}

//--Set Scale--//

// D: set the scaling to use for the font

// A: scale - uniform scale for both x and y axis

scaling

// sx, sy - separate x and y axis scaling

factors

// R: [none]

public void setScale(float scale) {

scaleX = scaleY = scale;

// Set Uniform Scale

}

public void setScale(float sx, float sy) {

scaleX = sx;

// Set X Scale

scaleY = sy;

// Set Y Scale

}

//--Get Scale--//

// D: get the current scaling used for the font

// A: [none]

// R: the x/y scale currently used for scale

public float getScaleX() {

return scaleX;

// Return X Scale

}

public float getScaleY() {

return scaleY;

// Return Y Scale

}

//--Set Space--//

// D: set the spacing (unscaled; ie. pixel size)

to use for the font

// A: space - space for x axis spacing

// R: [none]

public void setSpace(float space) {

spaceX = space;

// Set Space

}

//--Get Space--//

// D: get the current spacing used for the font

// A: [none]

// R: the x/y space currently used for scale

public float getSpace() {

return spaceX;

// Return X Space

}

//--Get Length of a String--//

// D: return the length of the specified string if

rendered using current settings

// A: text - the string to get length for

// R: the length of the specified string (pixels)

617

public float getLength(String text) {

float len = 0.0f;

// Working Length

int strLen = text.length();

// Get String Length (Characters)

for ( int i = 0; i < strLen; i++ ) {

// For Each Character in String (Except Last

int c = (int)text.charAt( i ) - CHAR_START;

// Calculate Character Index (Offset by First Char in

Font)

len += ( charWidths[c] * scaleX );

// Add Scaled Character Width to Total Length

}

len += ( strLen > 1 ? ( ( strLen - 1 ) * spaceX

) * scaleX : 0 ); // Add Space Length

return len;

// Return Total Length

}

//--Get Width/Height of Character--//

// D: return the scaled width/height of a

character, or max character width