Вы находитесь на странице: 1из 21

Game Mobile Project

Squirrel Breaks

OLEH
I GST BGS JB SURYA B (1304505075)
DEWA GEDE ADNYANA SUTHA WIDJA (1304505089)
MADE DWIKA JUNATA DARMA (1304505118)

FAKULTAS TEKNIK
JURUSAN TEKNOLOGI INFORMASI
UNIVERSITAS UDAYANA
2016

Latar Belakang
Tupai adalah hewan kecil yang lincah. Disamping tupai juga memiliki wajah yang lucu
belum lagi ukurannya yang mungil. Didalam sebuah game, tupai merupakan hewan yang sangat
difavoritkan karena dalam penggambaran tupai didunia digital, digambarkan sebagai tokoh yang
imut dan lincah. Dalam sebuah game, tupai memiliki makanan favorit berupa sebuah biji buah.
Tupai penggambarannya didalam sebuah game maupun film, sering sekali digambarkan sebagai
tokoh imut yang sangat mencintai buah, oleh karena itu, terbentuklah sebuah ide untuk membuat
game dengan karakter tupai dengan buah sebagai objek yang dicari, dan mencari buah tersebut
haruslah memecahkan beberapa batang pohon karena buah tersebut terdapat di dalam salah satu
batang pohon tersebut.
Game Play
Tipe permainan yang akan dibuat memiliki konsep seperti game sebelumnya yang pernah
ada, yaitu seperti game break out seperti pada gambar 1.1. Dimana dalam game ini, pemain
memiliki sebuah pijakan yang merupakan tempat tupai untuk berpijak yang nantinya tupai akan
meluncur ke atas menghancurkan batang pohon yang sudah disediakan. Tupai perlu
menabraknya berkali kali agar batang pohon hancur. Setelah hancur ada kemungkinan
didalamnya terdapat buah. Buah tersebut nantinya akan dijadikan sebuah combo panel pijakan
yang lebih lebar selama waktu yang telah ditentukan. Score untuk permainan ini terdapat pada
batang pohon yang akan ditabrak dan dihancurkan oleh tupai. Setiap batang pohon memiliki tiga
fase retakan hingga menjadi hancur.

Gambar 1.1 Game Break Out

Untuk memainkannya, pemain menjaga agar tupai tetap mendapat pijakan dengan
menggeser pijakan ke kiri dan ke kanan, jika tidak, tupai akan terjatuh dan permain berakhir.
Permainan ini memiliki tingkat kesulitan yaitu easy, normal, hard. Pembedanya berada pada
seberapa kencang tupai tersebut meluncur dan kembali.
Fitur-Fitur
Fitur-fitur dalam Game Squirrel Breaks adalah sebagai berikut:
-

Menu Utama:
Merupakan fitur yang mendeskripsikan aplikasi secara keseluruhan, berisikan fitur-fitur
dari game ini.

About:
Merupakan fitur yang menjelaskan mengenai sedikit dari game ini dan berisikan data dari
pembuat game ini.

Level:
Merupakan fitur yang berfungsi untuk menentukan tingkat kesulitan pada game. Terdapat
level mudah (easy), sedang (medium), dan susah (difficult). Level tersebut menentukan
tingkat akurasi kecepatan gerakan tupai dan batang pohon yang bergerak secara
horizontal.

Play Game:
Merupakan button yang mengarahkan user pada permainan utama sesuai level yang telah
ditentukan sebelumnya oleh user.

High Score:
Merupakan button yang menampilkan riwayat score permainan user, dan menampilkan
score tertinggi permainan yang telah terinputkan pada database game.

Exit:
Merupakan button yang digunakan untuk keluar dari aplikasi ini. Jika ditekan maka akan
muncul pilihan yes dan no, apabila memilih yes, maka akan keluar dari aplikasi
sedangkan no untuk membatalkan keluar dari aplikasi.

Tampilan Menu

Gambar 1.2 Menu

Tampilan menu terdapat beberapa pengaturan, diantaranya user dapat mengatur level
easy, medium, difficult. Perbedaan ketiga level tersebut yaitu mengacu pada kecepatan gerakan
horizontal batang pohon dan pantulan dari tupai. Setelah mengatur level, user menginput nama
(required name user) untuk digunakan pada penyimpanan nilai skor dalam database perangkat.
User dapat memulai permainan dengan menekan button start game dan akan muncul activity
untuk bermain. Button show results merupakan tombol yang menghubungkan pada tampilan nilai
skor per-user yang datanya telah tersimpan dalam database perangkat. Button exit digunakan jika
ingin keluar dari aplikasi. Berikut merupakan source code dari tampilan menu awal permainan.
package bouncer.logic;
import
import
import
import
import
import
import

bouncer.database.ResultsList;
android.os.Bundle;
android.annotation.SuppressLint;
android.app.Activity;
android.content.Context;
android.content.Intent;
android.content.SharedPreferences;

import
import
import
import
import
import
import

android.text.Editable;
android.util.Log;
android.view.Menu;
android.view.View;
android.widget.EditText;
android.widget.SeekBar;
android.widget.Toast;

public class TitleScreen extends Activity {


private static String PREFS_NAME="bouncer_game";
private static String SPEED_NAME="speedBall";
private static String TAG=TitleScreen.class.getCanonicalName();
private static String USER_NAME="userName";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title_screen);
setTypedNameEditText();}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_title_screen, menu);
return true;}
public void
setTypedNameEditText(){
String playerName=LoadPreferences(USER_NAME);
if( !(playerName.contains("empty")) ){
EditText et = (EditText)findViewById(R.id.typedName);
et.setText(playerName);}}
public void startGame(View view){
EditText et = (EditText)findViewById(R.id.typedName);
String nameS=et.getText().toString();
Context context = getApplicationContext();
int duration = Toast.LENGTH_LONG;
String text = "you must type your name";
Toast toast = Toast.makeText(context, text, duration);
if(nameS.isEmpty())
toast.show();
else{
SavePreferences(USER_NAME, nameS);
SeekBar sb1=(SeekBar) findViewById(R.id.setBallSpeed);
int value = sb1.getProgress();
SavePreferences(SPEED_NAME, value+"");
Intent intent = new Intent(this,Bouncer.class);
startActivity(intent);}}
private void SavePreferences(String key, String value){
// String defaultString = "empty";
//String loc ="";
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME,
MODE_WORLD_READABLE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key , value);
Log.d(TAG,"saved " + value);
editor.commit();}
public void exit(View view){
Intent intent = new Intent(this,TitleScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent);
backgroundApp();}
public void backgroundApp(){
this.moveTaskToBack(true);}
public void goToResultsList(View view){
Intent intent = new Intent(this,ResultsList.class);
startActivity(intent);}
@SuppressLint("WorldReadableFiles")
private String LoadPreferences(String key){
String defaultString = "empty";
String location ="";
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME,
MODE_WORLD_READABLE);
location = sharedPreferences.getString( key, defaultString );
System.out.println("loadRestore key = " + location);
return location;}}

Kode Program 1.1 Menu

Tampilan Permainan

(a)

(b)

Gambar 1.3 a) Awal permainan, b) Bonus Biji Buah

Tampilan

permainan

merupakan

activity

utama

aplikasi

ini.

Pemain

menggerakkan papan pijakan bawah saat tupai hendak akan menyentuh tanah. Jika tupai

mengenai papan pijakan maka tupai akan memantul keatas dan dapat mengenai batang pohon
yang bergerak horizontal. Sebaliknya jika tupai sampai menyentuh tanah maka permainan akan
berakhir dengan skor terakhir yang diperoleh pada satu permainan. Batang pohon yang terkena
pantulan tupai akan retak dan pecah (hilang) dalam 5 kali hantaman tupai. Batang pohon pertama
yang berhasil dipecahkan akan muncul biji buah yang jatuh pada gambar (b). Jika biji buah jatuh
ketanah maka akan hilang dan tidak terjadi efek apapun pada permainan. Sebaliknya jika biji
buah jatuh mengenai papan pijakan maka papan pijakan akan bertambah panjang, hal ini sebagai
bonus bagi pemain dan tentu lebih memudahkan pemain dalam mennggeser papan pijakan
sehingga tepat mengenai tupai yang memantul.
package bouncer.logic;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

java.util.Date;
java.util.Arrays;
java.util.HashMap;
java.util.List;
java.util.Map;
java.util.Random;
bouncer.common.Timer;
bouncer.common.AudioClip;
bouncer.common.Tools;
bouncer.sprite.PlatformsDestroyAnimation;
android.annotation.SuppressLint;
android.content.Context;
android.content.Intent;
android.content.SharedPreferences;
android.graphics.Bitmap;
android.graphics.Canvas;
android.graphics.Color;
android.graphics.Paint;
android.graphics.Paint.Style;
android.util.AttributeSet;
android.util.Log;
android.view.KeyEvent;
android.view.MotionEvent;
android.content.SharedPreferences;

public class BouncerGame extends ArcadeGame {


//audio clips
AudioClip platformHitSound, playerHitSound;
Random randomGenerator = new Random();
Random randomGenerator2 = new Random();
public static String TAG = BouncerGame.class.getCanonicalName();
private Context mContext;
private boolean platformHit=false;
private int indexPlatformHit[];
Date base;

boolean drawBonus = false;


int[] bonusDrawFromPoints;
private static int MODE_WORLD_READABLE=1;
private static String PREFS_NAME="bouncer_game";
private static String ON_OFF_KEY="on_off";
private static String SPEED_NAME="speedBall";
private String playSound="on";
boolean large=true;
Timer timer;
// For text
private Paint mTextPaint = new Paint();
// For Bitmaps
private Paint mBitmapPaint = new Paint();
//for result text
private Paint resultPaint = new Paint();
// Game name
public static final String NAME = "SpaceBlaster";
// Refresh rate (ms)
private static final long UPDATE_DELAY = 20;
Bitmap[] destroyPlatfromImages;
int playerX;
int playerY;
int ballX;
int ballY;
Date timeHit;
private int result;
private Map<Integer,Integer> punctation = new HashMap<Integer, Integer>();
private int points;
/**
* Constructor
*
* @param context
*/
public BouncerGame(Context context) {
super(context);
mContext = context;
super.setUpdatePeriod(UPDATE_DELAY);}
public BouncerGame(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
super.setUpdatePeriod(UPDATE_DELAY);}
private int playerSpeed = 17;
@Override
public boolean onTouchEvent(MotionEvent event) {
int tx = (int)event.getX();
int ty = (int)event.getY();
//
System.out.println("tx=" + tx
//
+ " ty=" + ty + " ship x=" + x + " y=" + y
//
+ " ship wh=" + ship.getWidth() + " " + ship.getHeight()
//
+ " edt=" + event.getDownTime() + " ep=" +
event.getPressure());
// Has the ship been touched. if so move it
// else start game if not already started
if ( tx > playerX + player.getWidth())
playerX+=playerSpeed;

else if( tx < playerX)


playerX-=playerSpeed;
return true;}
/**
* Main Draw Sub
*/
@Override
protected void onDraw(Canvas canvas)
{super.dispatchDraw(canvas);
paint(canvas);}
boolean ingame = true;
public void paint(Canvas g) {
if (ingame)
playGame(g);
//
else
//
showIntroScreen(g);}
Bitmap[] platforms;
int[] nrOfHits;
//x,y,direction
int[] initPoint;
int[] direction;
public void playGame(Canvas c) {
drawPlayerPlatform(c);
c.drawBitmap(platforms[0], initPoint[0], initPoint[1], mBitmapPaint);
drawPlatforms(c);
movePlatforms();
drawBall(c);
moveBall();
if(platformHit){
drawPlatformDestroy(c);}
// List<int[]> toStr = Arrays.asList(nrOfHits);
// System.out.println(nrOfHits[0] +" " + nrOfHits[1] );
if(timer.getValue()>=60){
player = getImage(R.drawable.player_platform);
large=false;}
if(timer.getValue()>4)
getScore();
drawResult(c);
int timeOfActiveBonus=15000;//in millis
if(drawBonus)
drawBonus(c);
if(bonusCollected){
Date timeNow=new Date();
double fTimeNow =timeNow.getTime();
double fTimeOfCollectedBonus=timeOfCollectedBonus.getTime();
if(fTimeNow-fTimeOfCollectedBonus>timeOfActiveBonus)
bonusCollected=false;}}
int starSpeed=3;
Bitmap bonus;
boolean bonusCollected = false;
public void drawBonus(Canvas c){
int height = getHeight();
System.out.println("draw bonus at : " + bonusDrawFromPoints[0] + " " +
bonusDrawFromPoints[1] );
bonus=getImage(R.drawable.star);

c.drawBitmap(bonus,bonusDrawFromPoints[0],bonusDrawFromPoints[1],
mBitmapPaint);
bonusDrawFromPoints[1]+=starSpeed;
//2.with player
if( (bonusDrawFromPoints[0] > playerX) && (bonusDrawFromPoints[0] <
playerX + player.getWidth())
&& (bonusDrawFromPoints[1] >= playerY player.getHeight())){
bonusCollisionWithPlayer();}
//4.with down-wall
else if(bonusDrawFromPoints[1] > height){
destroyBonus();
drawBonus=false;
firstBonusEnter=true;
System.out.println("star collide with end wall");}}
/**
* it should destory bonus, now i move it outside
*/
public void destroyBonus(){
bonusDrawFromPoints[0]=100000;
bonusDrawFromPoints[1]=100000;}
Date timeOfCollectedBonus;
public void bonusCollisionWithPlayer(){
destroyBonus();
timeOfCollectedBonus=new Date();
bonusCollected=true;
drawBonus=false;
player=getImage(R.drawable.bonus_platform_green);
System.out.println("star collide with player");
firstBonusEnter=true;}
public static int nrOfPlatforms = 8;
public void initPlatforms(){
int width = getWidth();
platforms=new Bitmap[nrOfPlatforms];
initPoint=new int[nrOfPlatforms*2];
direction=new int[nrOfPlatforms];
nrOfHits=new int[nrOfPlatforms];
//5 platforms
for(int i = 0; i < nrOfPlatforms ; i++){
platforms[i] = getImage(R.drawable.platformbluelarger);}
for(int i = 0; i < nrOfPlatforms ; i++){
nrOfHits[i]=0;}
for(int i = 0; i < nrOfPlatforms*2 ; i+=2){
//initPoint[i]=0;
initPoint[i] = width/2 + i*platforms[0].getWidth()/4;
//initPoint[i+1]=0;
initPoint[i+1] = 10 + i * platforms[0].getHeight();}
for(int i = 0; i < nrOfPlatforms ; i++){
direction[i]=i+randomGenerator.nextInt(7)+1;}}
public void drawBall(Canvas c){
c.drawBitmap(ball, ballX, ballY, mBitmapPaint);}
int ballSpeed = 7;
int ballDirection = -1;
int ballSpeedX = 5;
int ballDirectionX = 0;

boolean first = true;


boolean second = false;
public void moveBall(){
Date afterHit=new Date();
long fAfterHit=afterHit.getTime();
long fTimeHit=timeHit.getTime();
long timeSinceHit=fAfterHit-fTimeHit;
//System.out.println("time since " + timeSinceHit);
//how long show brighter platform
if(timeSinceHit>=500){
if(!bonusCollected){
if(large)
player=getImage(R.drawable.player_larger);
else
player=getImage(R.drawable.player_platform);}}
//collision detection
int width = getWidth();
//1.with platforms
for(int i = 0; i < nrOfPlatforms*2; i+=2)
if( (ballX > initPoint[i]) && (ballX < initPoint[i] +
platforms[0].getWidth())
&& (ballY <= initPoint[i+1] + platforms[0].getHeight() ?
initPoint[i+1] + platforms[0].getHeight() - ballY <
platforms[0].getHeight() : false)){
if(ballDirection==-1){
platformHit=true;
indexPlatformHit[i/2]=i;
//
System.out.println("i/2 = " + i/2 + " nrOfHits = " +
nrOfHits[i/2] + " index = " + indexPlatformHit[i/2]);
//
float timeSince = 0;
//
if(first){
//
base=new Date();
//
first=false;
//
second=true;
//
}else if(second){
//
float before = base.getTime();
//
Date afterBase=new Date();
//
float after = afterBase.getTime();
//
timeSince = after - before;
//
System.out.println(" ->> " + timeSince);
//
first=true;
//
second=false;
//
}
//
if(timeSince > 0.1)
nrOfHits[i/2]+=1;
if(nrOfHits[i/2]<6 && nrOfHits[i/2]>0){
points+=punctation.get(nrOfHits[i/2]);
//
System.out.println("points incremented to : "
+ points);}
if(playSound.contains("on"))
platformHitSound.play();}
//platformDestroy(i);
ballDirection=1; }}
for(int i = 0; i < nrOfPlatforms*2; i+=2){

//if( (ballX > initPoint[i]) && (ballX < initPoint[i] +


platforms[0].getWidth())
//
&& (ballY < initPoint[i+1] )){
if( (ballX > initPoint[i]) && (ballX < initPoint[i] +
platforms[0].getWidth())
&& ( initPoint[i+1] >= ballY ? initPoint[i+1] ballY <= platforms[0].getHeight() : false )){
Log.d(TAG, ballY + " <= " + initPoint[i+1]);
//if(initPoint[i]-ballY == 1){
// Log.d(TAG, "in == 1");
if(ballDirection==1){
platformHit=true;
indexPlatformHit[i/2]=i;
//
float timeSince = 0;
//
if(first){
//
base=new Date();
//
first=false;
//
second=true;
//
}else if(second){
//
float before = base.getTime();
//
Date afterBase=new Date();
//
float after = afterBase.getTime();
//
timeSince = after - before;
//
System.out.println(" ->> " + timeSince);
//
first=true;
//
second=false;
//
}
//
if(timeSince > 0.1)
//
System.out.println("i/2 = " + i/2 + " nrOfHits = " +
nrOfHits[i/2] + " index = " + indexPlatformHit[i/2]);
nrOfHits[i/2]+=1;
if(nrOfHits[i/2]<6 && nrOfHits[i/2]>0){
points+=punctation.get(nrOfHits[i/2]);
Log.d("punkt",""+punctation.get(nrOfHits[i/2]));
//
System.out.println("points incremented to : "
+ points);}
if(playSound.contains("on"))
platformHitSound.play();}
ballDirection=-1;
ballCollisionWithSpecyficPlatform();}}}
//2.with player
if( (ballX > playerX) && (ballX < playerX + player.getWidth())
&& (ballY >= playerY - player.getHeight())){
ballCollisionWithPlayer();
timeHit=new Date();
if(!bonusCollected){
if(large)
player=getImage(R.drawable.player_large_hit);
else
player=getImage(R.drawable.player_small_hit);}
ballDirection=-1;}
//3.with up-wall
if(ballY <= 0 + ball.getHeight())
ballDirection=1;

//4.with left and right wall


if(ballX <= 0)
ballDirectionX=1;
if(ballX >= width-ball.getWidth() )
ballDirectionX=-1;
int height=getHeight();
//4.with down-wall
if(ballY > height)
gameOver();
ballY+=ballSpeed*ballDirection;
ballX+=ballSpeedX*ballDirectionX;}
boolean firstBonusEnter=true;
Bitmap platformsSprite;
private void drawPlatformDestroy( Canvas c) {
//perform some animation
//
PlatformsDestroyAnimation pda = new
PlatformsDestroyAnimation(platformsSprite,
//
initPoint[indexPlatformHit], initPoint[indexPlatformHit+1],
platforms[0].getWidth(), platforms[0].getHeight()
//
, 4, 5);
//
pda.draw(c);
//pda.update(20);
for(int j = 0; j < nrOfPlatforms; j++){
for(int i = 0; i < nrOfPlatforms; i++){
if(nrOfHits[i]==1)
c.drawBitmap(destroyPlatfromImages[0],
initPoint[indexPlatformHit[i]],initPoint[indexPlatformHit[i]+1],null);
else if(nrOfHits[i]==2)
c.drawBitmap(destroyPlatfromImages[1],
initPoint[indexPlatformHit[i]],initPoint[indexPlatformHit[i]+1],null);
else if(nrOfHits[i]==3)
c.drawBitmap(destroyPlatfromImages[2],
initPoint[indexPlatformHit[i]],initPoint[indexPlatformHit[i]+1],null);
else if(nrOfHits[i]==4)
c.drawBitmap(destroyPlatfromImages[3],
initPoint[indexPlatformHit[i]],initPoint[indexPlatformHit[i]+1],null);
else if(nrOfHits[i]==5)
c.drawBitmap(destroyPlatfromImages[4],
initPoint[indexPlatformHit[i]],initPoint[indexPlatformHit[i]+1],null);
else if(nrOfHits[i]>=6){
if(nrOfHits[i]==6){
if(drawBonus==false && firstBonusEnter){
Log.d("drawBonus","weszlem do ifa y = " + (initPoint[i]+1)+"hits=
"+nrOfHits[i]);
//if(bonusDrawFromPoints[0]==100000 || bonusDrawFromPoints[0]==0){
//if(initPoint[i]>0 && initPoint[i+1]>0){
//Log.d("drawBonus","inside ");
if(!(initPoint[i]==-100 || initPoint[i]+1==-100)){
Log.d("drawBonus","inside ");
drawBonus=true;
bonusDrawFromPoints[0]=initPoint[indexPlatformHit[i]];
bonusDrawFromPoints[1]=initPoint[indexPlatformHit[i]+1];}}}
firstBonusEnter=false;}}
initPoint[indexPlatformHit[i]] = -100;
initPoint[indexPlatformHit[i]+1] = -100;}}}

//put it outside window


//initPoint[indexPlatformHit] = -100;
//initPoint[indexPlatformHit+1] = -100;
//platformHit=false}
/*
private void update(){
PlatformsDestroyAnimation pda = new
PlatformsDestroyAnimation(platformsSprite,
initPoint[indexPlatformHit], initPoint[indexPlatformHit+1],
platforms[0].getWidth(), platforms[0].getHeight()
, 4, 5);
pda.update(UPDATE_DELAY);}
*/
int divideFragments = 5;
int[] xydivFr;
public void ballCollisionWithPlayer(){
if(playSound.contains("on"))
playerHitSound.play();
//int platformWidth = playerX + player.getWidth();
int interval = player.getWidth()/divideFragments;
int tempPlayerX=playerX;
for(int i = 0; i < divideFragments*2; i+=2){
xydivFr[i] = tempPlayerX;
xydivFr[i+1] = tempPlayerX+interval;
tempPlayerX = tempPlayerX+interval;}
Log.d(TAG,""+ xydivFr);
//conditions depends on where ball touch player platform
if( (ballX > xydivFr[0]) && (ballX < xydivFr[1]) )
ballDirectionX=-2;
else if( (ballX > xydivFr[2]) && (ballX < xydivFr[3]) )
ballDirectionX=-1;
else if( (ballX > xydivFr[4]) && (ballX < xydivFr[5]) )
ballDirectionX=0;
else if( (ballX > xydivFr[6]) && (ballX < xydivFr[7]) )
ballDirectionX=1;
else if( (ballX > xydivFr[8]) && (ballX < xydivFr[9]) )
ballDirectionX=2;}
int divideFragmentsS = 3;
int[] xydivFrS;
public void ballCollisionWithSpecyficPlatform()
//int platformWidth = playerX + player.getWidth();
int interval = player.getWidth()/divideFragments;
int tempPlayerX=playerX;
for(int i = 0; i < divideFragments*2; i+=2){
xydivFr[i] = tempPlayerX;
xydivFr[i+1] = tempPlayerX+interval;
tempPlayerX = tempPlayerX+interval;}
Log.d(TAG,""+ xydivFr);
//conditions depends on where ball touch player platform
if( (ballX > xydivFr[0]) && (ballX < xydivFr[1]) )
ballDirectionX=-1;
else if( (ballX > xydivFr[2]) && (ballX < xydivFr[3]) )
ballDirectionX=0;
else if( (ballX > xydivFr[4]) && (ballX < xydivFr[5]) )
ballDirectionX=1;}
public void drawPlatforms(Canvas c){

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


int index=i*2;
c.drawBitmap(platforms[i], initPoint[index], initPoint[index+1],
mBitmapPaint);}}
//int direction = 1;
public void movePlatforms(){
int width = getWidth();
/*int i = initPoint[0];
initPoint[0] = i + direction[0];
if(initPoint[0] >= width - platforms[0].getWidth())
direction[0] = -1;
if(initPoint[0] <= 0)
direction[0] = 1;*/
for(int index = 0; index < nrOfPlatforms ; index++){
int iMul= index * 2;
int i = initPoint[iMul];
initPoint[iMul] = i + direction[index];
if(initPoint[iMul] >= width - platforms[index].getWidth())
direction[index] = -1*direction[index];
if(initPoint[iMul] <= 0)
direction[index] = 1*-(direction[index]);}}
@Override
protected void updatePhysics() {
// TODO Auto-generated method stub}
Bitmap player;
Bitmap ball;
boolean firstTime=true;
@Override
protected void initialize() {
if(firstTime){
if(timer!=null)
timer.interrupt();
Log.d(TAG,"initalize");
int n;
result=0;
points=0;
// Screen size
int width = getWidth();
int height = getHeight();
initPlatforms();
mTextPaint.setARGB(255, 255, 255, 255);
player = getImage(R.drawable.player_larger);
playerX = width/2;
playerY = height - player.getHeight();
ball = getImage(R.drawable.ball);
ballX = playerX + player.getWidth()/2;
ballY = playerY - ball.getHeight();
xydivFr=new int[divideFragments*2];
//platformsSprite=getImage(R.drawable.sprite_platforms);
destroyPlatfromImages=new Bitmap[5];
destroyPlatfromImages[0]=getImage(R.drawable.platform_01);
destroyPlatfromImages[1]=getImage(R.drawable.platform_02);
destroyPlatfromImages[2]=getImage(R.drawable.platform_03);
destroyPlatfromImages[3]=getImage(R.drawable.platform_04);
destroyPlatfromImages[4]=getImage(R.drawable.platform_05);

indexPlatformHit=new int[nrOfPlatforms];
//load autio clips
checkPlaySound();
try {
platformHitSound = getAudioClip(R.raw.sb_collisn);
playerHitSound = getAudioClip(R.raw.click_collision);
} catch (Exception e) {
Tools.MessageBox(mContext, "Audio Error: " + e.toString());
// TODO fix problem with loading audiClip
playSound="off";}
int base = 10;
int step = 10;
for(Integer i = 0; i < divideFragments; i++) {
punctation.put(i+1,base+step*i );}
Log.d("punkt",punctation.toString());
//System.out.println(punctation.toString());
points=0;
result=0;
timer = new Timer();
timer.start();
timeHit = new Date();
large=true;
//result paint
resultPaint = new Paint();
resultPaint.setColor(Color.BLACK);
resultPaint.setStyle(Style.FILL);
resultPaint.setTextSize(50);
String ballS=LoadPreferences(SPEED_NAME);
ballSpeed=Integer.parseInt(ballS);
if(ballSpeed==0)
ballSpeed=1;
bonusDrawFromPoints=new int[2];
firstTime=false;}}
private void checkPlaySound(){
String playSoundTemp=LoadPreferences(ON_OFF_KEY);
if(playSoundTemp.contains("on") || playSoundTemp.contains("empty"))
playSound="on";
else
playSound="off";}
public void drawPlayerPlatform(Canvas c){
//
int height = getHeight();
c.drawBitmap(player, playerX, playerY, mBitmapPaint );}
//public void checkResult(){
//
result=points/(timer.getValue()/2);
//
System.out.println(points + " / " + timer.getValue());
//
System.out.println(result);}
@Override
protected boolean gameOver() {
//here should be something logic, now just restart
ballDirection=-1;
//checkResult();
getScore();
Intent intent = new Intent(this.getContex(), GameOver.class);
intent.putExtra("result", result+"");
//System.out.println(timer.getValue());

this.getContex().startActivity(intent);
return false;}
//returns long because super method, but return result is never used
@Override
protected long getScore() {
result=points;///(timer.getValue());
//System.out.println(points + " / " + timer.getValue());
//System.out.println(result);
return result;
//return 0;}
private void drawResult(Canvas c){
int width = getWidth();
int height = getHeight();
c.drawText(""+result, width/14, height,resultPaint );}
/**
* load shared preferences
*/
@SuppressLint("WorldReadableFiles")
private String LoadPreferences(String key){
String defaultString = "empty";
String location ="";
SharedPreferences sharedPreferences =
this.getContex().getSharedPreferences(PREFS_NAME, MODE_WORLD_READABLE);
location = sharedPreferences.getString( key, defaultString );
System.out.println("loadRestore key = " + location);
return location;}}

Kode Program 1.2 Permainan

Tampilan Permainan Berakhir

Gambar 1.4 Permainan Berakhir

Tampilan berakhir merupakan halaman yang menampilkan skor akhir dari satu
permainan yang telah dimainkan. Nilai skor tersebut akan tersimpan dalam database perangkat
sesuai dengan inputan nama user pada halaman menu. Pemain dapat mengulang permainan dan
memulai permainan baru dengan menekan button retry yang mengarahkan ke halaman menu
untuk pengaturan level. Jika pemain tidak ingin mengulang permianan maka dapat menekan
button exit untuk ke halaman menu utama.
package bouncer.logic;
import
import
import
import
import
import
import
import
import
import
import
import
public

bouncer.database.DatabaseHelper;
bouncer.database.ResultsList;
android.os.Bundle;
android.annotation.SuppressLint;
android.annotation.TargetApi;
android.app.Activity;
android.content.Intent;
android.content.SharedPreferences;
android.view.Menu;
android.view.View;
android.widget.EditText;
android.widget.TextView;
class GameOver extends Activity {
String result;
DatabaseHelper databaseHelper;
private static String USER_NAME="userName";
private static String PREFS_NAME="bouncer_game";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_over);
Intent intent = getIntent();
result=intent.getStringExtra("result");
TextView et = (TextView) findViewById(R.id.points);
et.setText(result);
// System.out.println("res " + result);
databaseHelper = new DatabaseHelper(this);}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_game_over, menu);
return true;}
public void goToTitleScreen(View view){
saveResult();
databaseHelper.close();
Intent intent = new Intent(this,TitleScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);}
@TargetApi(9)
@SuppressLint("NewApi")
public void saveResult(){
String name=LoadPreferences(USER_NAME);

if(!(name.isEmpty() || result.isEmpty() || name.equals("empty") ||


result.equals("empty") ))
if(Integer.parseInt(result)>0)
databaseHelper.saveRecord(result, name)}
public void exit(View view){
saveResult();
databaseHelper.close();
Intent intent = new Intent(this,TitleScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
backgroundApp();}
public void backgroundApp(){
this.moveTaskToBack(true);}
@SuppressLint("WorldReadableFiles")
private String LoadPreferences(String key){
String defaultString = "empty";
String location ="";
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME,
MODE_WORLD_READABLE);
location = sharedPreferences.getString( key, defaultString );
System.out.println("loadRestore key = " + location);
return location;}}

Kode Program 1.3 Game Over

Tampilan Saat Menekan Back Button Pada Device (Pause)

Gambar 1.5 Tampilan Pause

Tampilan saat berlangsungnya permainan dan user menekan button back maka permainan
akan terhenti (game pause) dan muncul sound settings untuk suara permainan hidup atau mati.
Terdapat button retry untuk kembali ke menu awal untuk mengulang permainan. Terdapat button
exit untuk keluar langsung dari aplikasi. Untuk kembali ke kondisi terakhir permainan (game
resume), pengguna dapat menekan kembali button back device.
package bouncer.logic;
import
import
import
import
import
import
import
import
import
public

android.os.Bundle;
android.util.Log;
android.view.View;
android.widget.RadioButton;
android.annotation.SuppressLint;
android.annotation.TargetApi;
android.app.Activity;
android.content.Intent;
android.content.SharedPreferences;
class Menu extends Activity {
private static String PREFS_NAME="bouncer_game";
private static String ON_OFF_KEY="on_off";
private static String TAG;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
TAG=Menu.class.getCanonicalName();
checkDefaultRadioButton();}
@SuppressLint("NewApi")
@TargetApi(9)
public void checkDefaultRadioButton(){
String onOff = LoadPreferences(ON_OFF_KEY);
if(onOff.contains("on") || onOff.isEmpty() || onOff.contains("empty")){
RadioButton on=(RadioButton) findViewById(R.id.on);
on.setChecked(true);
RadioButton off=(RadioButton) findViewById(R.id.off);
off.setChecked(false);
}else if(onOff.contains("off")){
RadioButton on=(RadioButton) findViewById(R.id.on);
on.setChecked(false);
RadioButton off=(RadioButton) findViewById(R.id.off);
off.setChecked(true);}}
/* @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_menu, menu);
return true;
}*/
public void turnSoundOffOn(View view){
// Is the button now checked?
boolean checked = ((RadioButton) view).isChecked();
// Check which radio button was clicked
switch(view.getId()) {
case R.id.on:

if (checked){
SavePreferences(ON_OFF_KEY,"on");
break;
case R.id.off:
if (checked)
SavePreferences(ON_OFF_KEY,"off");
break;}}
public void backToGame(View view){
Intent intent = new Intent(this, Bouncer.class);
startActivity(intent);}
@SuppressLint("WorldReadableFiles")
private String LoadPreferences(String key){
String defaultString = "empty";
String location ="";
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME,
MODE_WORLD_READABLE);
location = sharedPreferences.getString( key, defaultString );
System.out.println("loadRestore key = " + location);
return location;}
private void SavePreferences(String key, String value){
// String defaultString = "empty";
//String loc ="";
SharedPreferences sharedPreferences = getSharedPreferences(PREFS_NAME,
MODE_WORLD_READABLE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key , value);
Log.d(TAG,"saved " + value);
editor.commit();}
public void goToTitleScreen(View view){
Intent intent = new Intent(this,TitleScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);}
public void exit(View view){
Intent intent = new Intent(this,TitleScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
backgroundApp();}
public void backgroundApp(){
this.moveTaskToBack(true);}}

Kode Program 1.4 Pause

Вам также может понравиться