Академический Документы
Профессиональный Документы
Культура Документы
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.
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
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;
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;}}
Tampilan Permainan
(a)
(b)
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;
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;
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;}}
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);
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);}}