gamemobile_uas_1304505075_1304505089_1304505118

Upload: dewa-widja

Post on 01-Mar-2018

212 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    2/21

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    3/21

    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.

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    4/21

    Tampilan Menu

    Gambar 1.2Menu

    Tampilan menu terdapat beberapa pengaturan, diantaranya user dapat mengatur leveleasy, 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 codedari tampilan menu awal permainan.

    package bouncer.logic;

    import bouncer.database.ResultsList;

    import android.os.Bundle;

    import android.annotation.SuppressLint;

    import android.app.Activity;

    import android.content.Context;

    import android.content.Intent;

    import android.content.SharedPreferences;

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    5/21

    import android.text.Editable;

    import android.util.Log;

    import android.view.Menu;

    import android.view.View;

    import android.widget.EditText;

    import android.widget.SeekBar;

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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    6/21

    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.1Menu

    Tampilan Permainan

    (a) (b)

    Gambar 1.3a) 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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    7/21

    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 buahyang jatuh pada gambar (b). Jika biji buahjatuh

    ketanah maka akan hilang dan tidak terjadi efek apapun pada permainan. Sebaliknya jika biji

    buahjatuh 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 java.util.Date;

    import java.util.Arrays;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import java.util.Random;

    import bouncer.common.Timer;

    import bouncer.common.AudioClip;

    import bouncer.common.Tools;

    import bouncer.sprite.PlatformsDestroyAnimation;

    import android.annotation.SuppressLint;

    import android.content.Context;

    import android.content.Intent;

    import android.content.SharedPreferences;

    import android.graphics.Bitmap;

    import android.graphics.Canvas;

    import android.graphics.Color;

    import android.graphics.Paint;

    import android.graphics.Paint.Style;

    import android.util.AttributeSet;

    import android.util.Log;

    import android.view.KeyEvent;

    import android.view.MotionEvent;

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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    8/21

    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 punctation = new HashMap();

    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;

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    9/21

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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    10/21

    c.drawBitmap(bonus,bonusDrawFromPoints[0],bonusDrawFromPoints[1],

    mBitmapPaint);

    bonusDrawFromPoints[1]+=starSpeed;

    //2.with player

    if( (bonusDrawFromPoints[0] > playerX) && (bonusDrawFromPoints[0] = 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;

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    11/21

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

    nrOfHits[i/2]+=1;

    if(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){

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    12/21

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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    13/21

    //4.with left and right wall

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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    14/21

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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    15/21

    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] = width - platforms[index].getWidth())

    direction[index] = -1*direction[index];

    if(initPoint[iMul]

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    16/21

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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    17/21

    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.2Permainan

    Tampilan Permainan Berakhir

    Gambar 1.4Permainan Berakhir

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    18/21

    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 bouncer.database.DatabaseHelper;

    import bouncer.database.ResultsList;

    import android.os.Bundle;

    import android.annotation.SuppressLint;

    import android.annotation.TargetApi;

    import android.app.Activity;

    import android.content.Intent;

    import android.content.SharedPreferences;import android.view.Menu;

    import android.view.View;

    import android.widget.EditText;

    import android.widget.TextView;

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

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    19/21

    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.3Game Over

    Tampilan Saat Menekan Back Button Pada Device (Pause)

    Gambar 1.5Tampilan Pause

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    20/21

    Tampilan saat berlangsungnya permainan dan user menekan button back maka permainan

    akan terhenti (gamepause) 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 android.os.Bundle;

    import android.util.Log;

    import android.view.View;

    import android.widget.RadioButton;

    import android.annotation.SuppressLint;

    import android.annotation.TargetApi;

    import android.app.Activity;

    import android.content.Intent;

    import android.content.SharedPreferences;

    public 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:

  • 7/25/2019 GameMobile_UAS_1304505075_1304505089_1304505118

    21/21

    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.4Pause