Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android游戲 >> Android游戲開發 >> Android游戲開發之打地鼠(三、打地鼠設計實現)

Android游戲開發之打地鼠(三、打地鼠設計實現)

編輯:Android游戲開發

  上篇文章中對開始打地鼠游戲的思路做了簡單的介紹,現在來具體的說一說開始打地鼠游戲的實現,先說說布局,用LinearLayout或TableLyout都可以。上面一行是4個TextView下面的地洞是ImageButton。游戲中打中或沒打中地鼠都更新會對應按鈕背景圖。打中地鼠的效果圖(圖1)和沒打中的效果圖(圖2)。

Android游戲開發之打地鼠(三、打地鼠設計實現)  Android游戲開發之打地鼠(三、打地鼠設計實現)

  游戲中需要開啟一個線程來控制游戲時間,更新顯示剩余時間時,游戲0.5s更新一次,游戲時間為30s,因此更新次數是游戲時間的二倍。當游戲時間為0s時游戲停止關閉游戲界面並開啟記錄玩家信息的窗口。該線程同時產生一個隨機數(1-12)來指定地鼠出現位置,由於子線程不能更新UI,需要通過handler發送消息來更新UI。更新界面時將每一個按鈕背景都有重置為地洞,再更新地鼠出現位置的圖片,這樣會清除由於點擊出現的錘子和上一次地鼠出現位置設置的圖片。當用戶點擊屏幕是,如果打中地鼠,效果如圖1,沒打中效果如圖2,並且如果開啟了音效,會播放不同的打擊聲音。最後在游戲界面不可見是關閉線程。

  代碼如下:

Java代碼
  1. package cn.com.cyj.mouse.services;    
  2.     
  3. import java.util.HashMap;    
  4. import java.util.Random;    
  5.     
  6. import android.content.Intent;    
  7. import android.os.Bundle;    
  8. import android.os.Handler;    
  9. import android.view.View;    
  10. import android.view.View.OnClickListener;    
  11. import android.widget.Button;    
  12. import android.widget.ImageButton;    
  13. import android.widget.TextView;    
  14. import cn.com.cyj.mouse.R;    
  15. import cn.com.cyj.mouse.ui.BaseActivity;    
  16. import cn.com.cyj.mouse.ui.MouseStart;    
  17.     
  18. /**  
  19.  * 游戲開始的界面:游戲中有12個ImageButton,每個ImageButton背景設置成地鼠洞,游戲中開啟一個線程控制游戲時間  
  20.  *   
  21.  * @author cyj  
  22.  *   
  23.  */    
  24. public class GameRun extends BaseActivity {    
  25.     /**  
  26.      * 線程睡眠時間  
  27.      */    
  28.     public static final int THREAD_SLEEP_TIME = 500;    
  29.     /**  
  30.      * 游戲時間  
  31.      */    
  32.     public static final int TIME = 30;    
  33.     private ImageButton one;    
  34.     private ImageButton two;    
  35.     private ImageButton three;    
  36.     private ImageButton four;    
  37.     private ImageButton five;    
  38.     private ImageButton six;    
  39.     private ImageButton seven;    
  40.     private ImageButton eight;    
  41.     private ImageButton nine;    
  42.     private ImageButton ten;    
  43.     private ImageButton eleven;    
  44.     private ImageButton twleve;    
  45.     // 顯示時間    
  46.     private TextView showTime;    
  47.     // 顯示分數    
  48.     private TextView score;    
  49.     MyClick click;    
  50.         
  51.     private Random random;    
  52.     // 游戲當前時間    
  53.     private int time;    
  54.     // 游戲總時間    
  55.     private int totalTime;    
  56.     // 老鼠下一次出現位置    
  57.     private int next;    
  58.     // 游戲當前分數    
  59.     private int nowScore;    
  60.     // 游戲線程    
  61.     private Thread t;    
  62.     // 存放按鈕和next的映射    
  63.     HashMap<ImageButton, Integer> battle;    
  64.     HashMap<Integer, ImageButton> nextMap;    
  65.     public Handler handler = new Handler() {    
  66.         public void handleMessage(android.os.Message msg) {    
  67.             changeUI();    
  68.         };    
  69.     };    
  70.     
  71.     @Override    
  72.     protected void onCreate(Bundle savedInstanceState) {    
  73.         super.onCreate(savedInstanceState);    
  74.         setContentView(R.layout.activity_gamerun);    
  75.     
  76.         battle = new HashMap<ImageButton, Integer>();    
  77.         nextMap = new HashMap<Integer, ImageButton>();    
  78.         initImageButton();    
  79.         initOnClick();    
  80.         initbattleMap();    
  81.         initNextMap();    
  82.         next = -1;    
  83.         random = new Random();    
  84.         totalTime = TIME;    
  85.         time = 0;    
  86.         nowScore = 0;    
  87.         showTime.setText(TIME + "");    
  88.     }    
  89.     
  90.     @Override    
  91.     protected void onResume() {    
  92.         super.onResume();    
  93.         if(t == null){    
  94.             // 控制游戲時間    
  95.             t = new Thread(new Runnable() {    
  96.                 @Override    
  97.                 public void run() {    
  98.                     try {    
  99.                         while (totalTime != 0) {    
  100.                             Thread.sleep(THREAD_SLEEP_TIME);    
  101.                             next = random.nextInt(12) + 1;    
  102.                             time++;    
  103.                             handler.sendEmptyMessage(1);    
  104.                         }    
  105.         
  106.                     } catch (Exception e) {    
  107.                         e.printStackTrace();    
  108.                     }    
  109.                     if (totalTime == 0) {    
  110.                         Intent intent = new Intent(GameRun.this, GameOver.class);    
  111.                         // 該參數跳轉頁面不會觸發onUserLeaveHint()方法    
  112.                         intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);    
  113.                         intent.putExtra("score", "" + nowScore);    
  114.                         GameRun.this.startActivity(intent);    
  115.                         finish();    
  116.                     }    
  117.                 }    
  118.             });    
  119.         }    
  120.         t.start();    
  121.     }    
  122.     
  123.     // 初始化按鈕    
  124.     private void initImageButton() {    
  125.         one = (ImageButton) findViewById(R.id.first);    
  126.         two = (ImageButton) findViewById(R.id.second);    
  127.         three = (ImageButton) findViewById(R.id.three);    
  128.         four = (ImageButton) findViewById(R.id.four);    
  129.         five = (ImageButton) findViewById(R.id.five);    
  130.         six = (ImageButton) findViewById(R.id.six);    
  131.         seven = (ImageButton) findViewById(R.id.seven);    
  132.         eight = (ImageButton) findViewById(R.id.eight);    
  133.         nine = (ImageButton) findViewById(R.id.nine);    
  134.         ten = (ImageButton) findViewById(R.id.ten);    
  135.         eleven = (ImageButton) findViewById(R.id.eleven);    
  136.         twleve = (ImageButton) findViewById(R.id.twelve);    
  137.         showTime = (TextView) findViewById(R.id.showtime);    
  138.         score = (TextView) findViewById(R.id.score);    
  139.     }    
  140.     
  141.     // 給按鈕添加點擊事件    
  142.     private void initOnClick() {    
  143.         click = new MyClick();    
  144.         one.setOnClickListener(click);    
  145.         two.setOnClickListener(click);    
  146.         three.setOnClickListener(click);    
  147.         four.setOnClickListener(click);    
  148.         five.setOnClickListener(click);    
  149.         six.setOnClickListener(click);    
  150.         seven.setOnClickListener(click);    
  151.         eight.setOnClickListener(click);    
  152.         nine.setOnClickListener(click);    
  153.         ten.setOnClickListener(click);    
  154.         eleven.setOnClickListener(click);    
  155.         twleve.setOnClickListener(click);    
  156.     }    
  157.     
  158.     // 按鈕id和next映射關系    
  159.     private void initbattleMap() {    
  160.         battle.put(one, 1);    
  161.         battle.put(two, 2);    
  162.         battle.put(three, 3);    
  163.         battle.put(four, 4);    
  164.         battle.put(five, 5);    
  165.         battle.put(six, 6);    
  166.         battle.put(seven, 7);    
  167.         battle.put(eight, 8);    
  168.         battle.put(nine, 9);    
  169.         battle.put(ten, 10);    
  170.         battle.put(eleven, 11);    
  171.         battle.put(twleve, 12);    
  172.     }    
  173.     
  174.     // next和按鈕id的映射關系    
  175.     private void initNextMap() {    
  176.         nextMap.put(1, one);    
  177.         nextMap.put(2, two);    
  178.         nextMap.put(3, three);    
  179.         nextMap.put(4, four);    
  180.         nextMap.put(5, five);    
  181.         nextMap.put(6, six);    
  182.         nextMap.put(7, seven);    
  183.         nextMap.put(8, eight);    
  184.         nextMap.put(9, nine);    
  185.         nextMap.put(10, ten);    
  186.         nextMap.put(11, eleven);    
  187.         nextMap.put(12, twleve);    
  188.     }    
  189.     
  190.     /**  
  191.      * 更新小老鼠出現位置和顯示游戲剩余時間  
  192.      */    
  193.     private void changeUI() {    
  194.         // 更新顯示剩余時間,游戲0.5s更新一次,因此更新次數是游戲時間的二倍    
  195.         if (time % 2 == 0) {    
  196.             showTime.setText(--totalTime + "");    
  197.         }    
  198.         if (next == -1)    
  199.             return;    
  200.         // 每次出地鼠時將按鈕背景初始化    
  201.         reImageButton();    
  202.         // 獲得next對應的按鈕    
  203.         ImageButton bt = nextMap.get(next);    
  204.         // 給按鈕設置地鼠圖片    
  205.         bt.setBackgroundResource(R.drawable.end);    
  206.     }    
  207.     
  208.     // 按鈕背景初始化    
  209.     private void reImageButton() {    
  210.         one.setBackgroundResource(R.drawable.start);    
  211.         two.setBackgroundResource(R.drawable.start);    
  212.         three.setBackgroundResource(R.drawable.start);    
  213.         four.setBackgroundResource(R.drawable.start);    
  214.         five.setBackgroundResource(R.drawable.start);    
  215.         six.setBackgroundResource(R.drawable.start);    
  216.         seven.setBackgroundResource(R.drawable.start);    
  217.         eight.setBackgroundResource(R.drawable.start);    
  218.         nine.setBackgroundResource(R.drawable.start);    
  219.         ten.setBackgroundResource(R.drawable.start);    
  220.         eleven.setBackgroundResource(R.drawable.start);    
  221.         twleve.setBackgroundResource(R.drawable.start);    
  222.     }    
  223.     
  224.     /**  
  225.      * 點擊事件,判斷是否打中  
  226.      *   
  227.      * @author cyj  
  228.      *   
  229.      */    
  230.     class MyClick implements OnClickListener {    
  231.     
  232.         @Override    
  233.         public void onClick(View v) {    
  234.             // 是否的分的標記    
  235.             Boolean isScore = false;    
  236.             // 獲取點擊按鈕對應next    
  237.             int battleId = battle.get(v);    
  238.             // 如果點擊按鈕為next得分    
  239.             if (battleId == next) {    
  240.                 // 得分為true    
  241.                 isScore = true;    
  242.             }    
  243.             if (isScore) {    
  244.                 // 設置打中的圖片    
  245.                 v.setBackgroundResource(R.drawable.zhong);    
  246.                 if (MouseStart.controller.isPlay()) {    
  247.                     // 打中的音效    
  248.                     MouseStart.controller.playSound(R.raw.hathit);    
  249.                 }    
  250.                 // 加分    
  251.                 score.setText((nowScore += 10) + "");    
  252.             } else {    
  253.                 // 設置沒打中的圖片    
  254.                 v.setBackgroundResource(R.drawable.meizhong);    
  255.                 if (MouseStart.controller.isPlay()) {    
  256.                     // 沒打中的音效    
  257.                     MouseStart.controller.playSound(R.raw.dismistake);    
  258.                 }    
  259.     
  260.             }    
  261.         }    
  262.     }    
  263.     @Override    
  264.     protected void onStop() {    
  265.         // 停止線程    
  266.         super.onStop();    
  267.         if (t != null) {    
  268.             t.interrupt();    
  269.             t = null;    
  270.         }    
  271.     }    
  272. }    

  小技巧:在本游戲中免不了各種判斷:在產生地鼠位置時,要通過隨機數來確定按鈕位置,例如:如果隨機數是1,則在第一個按鈕設置地鼠圖片,需要多次判斷,應該是出現隨機數1那麼直接在第一個按鈕設置;玩家點擊按鈕時,需要判斷點擊的是那個按鈕並判斷是否是有地鼠的按鈕,再設置相應的圖片。那麼應該怎麼辦呢?

  答案是用HashMap來代替switch,在HashMap來映射隨機數和按鈕,更新地鼠位置時直接用隨機數來獲得按鈕設置圖片。用另一個HashMap中映射按鈕和對應的隨機數,這樣在點擊按鈕時直接獲取映射的數,該數和現在地鼠位置的隨機數比較即可判斷是否打中地鼠;這樣就完美解決了。

    No
  1. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved