Android游戏开发之打地鼠(五-终篇、游戏结束和数据存储)

2017/9/18 17:45:01 人评论 次浏览 分类:游戏开发

  游戏的基本功能都已经实现了,最后来说一说排行榜的显示和游戏音效的添加。

  排行榜的显示主要用的Android中一个比较重要的控件ListView。ListView的使用还是比较简单的,第一步在布局文件中建立一个ListView的节点,在代码中通过ID得到该控件。第二步给该控件设置一个适配器,适配器写一个类,该类继承BaseAdapter并实现未实现的方法,一共有4个为实现的方法,getCount()获得数据总数,getItem(int position)根据位置获得某条数据,getItemId(int position)根据位置获得某条数据id,getView(),得到相应位置的Item视图。可以通过contentView对ListView进行优化,如果contentView为空,通过inflate填充view,否则不填充,这样减少了填充次数,提高了效率。代码如下:

Java代码
  1. package cn.com.cyj.mouse.ui;    
  2.     
  3. import java.util.ArrayList;    
  4.     
  5. import android.content.Intent;    
  6. import android.os.Bundle;    
  7. import android.view.View;    
  8. import android.view.ViewGroup;    
  9. import android.widget.BaseAdapter;    
  10. import android.widget.ListView;    
  11. import android.widget.TextView;    
  12. import cn.com.cyj.mouse.R;    
  13. import cn.com.cyj.mouse.enity.Gamer;    
  14.     
  15. /**  
  16.  * 显示玩家排行榜  
  17.  *   
  18.  * @author cyj  
  19.  *   
  20.  */    
  21. public class ShowRank extends BaseActivity {    
  22.     
  23.     ListView lv;    
  24.     ArrayList<Gamer> gamerList;    
  25.     TextView gamerName;    
  26.     TextView gamerScore;    
  27.     
  28.     @Override    
  29.     protected void onCreate(Bundle savedInstanceState) {    
  30.         super.onCreate(savedInstanceState);    
  31.         setContentView(R.layout.activity_showrank);    
  32.     
  33.         gamerList = new ArrayList<Gamer>();    
  34.         Intent intent = getIntent();    
  35.         gamerList = (ArrayList<Gamer>) intent.getSerializableExtra("gamerlist");    
  36.         // 初始化listview对象    
  37.         lv = (ListView) findViewById(R.id.lv);    
  38.         // 给listview对象添加适配器    
  39.         lv.setAdapter(new MyAdapter());    
  40.     }    
  41.     
  42.     class MyAdapter extends BaseAdapter {    
  43.     
  44.         // 获得数据总数    
  45.         @Override    
  46.         public int getCount() {    
  47.             return gamerList.size();    
  48.         }    
  49.     
  50.         // 根据位置获得某条数据    
  51.         @Override    
  52.         public Object getItem(int position) {    
  53.             return null;    
  54.         }    
  55.     
  56.         // 根据位置获得某条数据id    
  57.         @Override    
  58.         public long getItemId(int position) {    
  59.             // TODO Auto-generated method stub    
  60.             return 0;    
  61.         }    
  62.     
  63.         @Override    
  64.         public View getView(int position, View contentView, ViewGroup parent) {    
  65.             View v = contentView;    
  66.             if (v == null) {    
  67.                 // 通过inflate填充view    
  68.                 v = View.inflate(ShowRank.this, R.layout.list_item, null);    
  69.                 gamerName = (TextView) v.findViewById(R.id.gamername);    
  70.                 gamerScore = (TextView) v.findViewById(R.id.gamerscore);    
  71.             }    
  72.     
  73.             Gamer gamer = gamerList.get(position);    
  74.             gamerName.setText(gamer.getName());    
  75.             gamerScore.setText(gamer.getScore() + "");    
  76.             return v;    
  77.         }    
  78.     
  79.     }    
  80. }

  一个游戏没有音效无可厚非,但是有了音效会更有乐趣。本游戏采用了MediaPlayer+SoundPool的形式,前者播放背景音乐,后者播放游戏的打击音效,关于MediaPlayer的使用,没有什么比官方的图来的更简单粗暴了,这里不再赘述。SoundPool的使用,第一步new SoundPool();第二步load(),通常用一个HashMap存放音乐文件id和load的映射;第三步play()。代码如下:

Java代码
  1. package cn.com.cyj.mouse.services;    
  2.     
  3. import java.util.HashMap;    
  4. import java.util.Map;    
  5.     
  6. import android.content.Context;    
  7. import android.media.AudioManager;    
  8. import android.media.MediaPlayer;    
  9. import android.media.SoundPool;    
  10. import cn.com.cyj.mouse.R;    
  11. /**  
  12.  * 处理游戏的背景音乐和音效  
  13.  * @author cyj  
  14.  *  
  15.  */    
  16. public class MusicService {    
  17.     
  18.     // 用来播放背景音乐    
  19.     MediaPlayer player;    
  20.     // 用来播放音效    
  21.     SoundPool pool;    
  22.     Context context;    
  23.     // 存放音效    
  24.     Map<Integer, Integer> soundMap;    
  25.     public MusicService(Context context) {    
  26.         this.context = context;    
  27.         initMedia();    
  28.         initSound();    
  29.     }    
  30.     private void initSound() {    
  31.         pool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);    
  32.         soundMap = new HashMap<Integer, Integer>();    
  33.         // 加载音效文件并放入hashmap中    
  34.         soundMap.put(R.raw.dismistake, pool.load(context, R.raw.dismistake, 1));    
  35.         soundMap.put(R.raw.hathit, pool.load(context, R.raw.hathit, 1));    
  36.     }    
  37.     /**  
  38.      * 通过resId播放在hashmap中对应的要播放的音效  
  39.      * @param resId hashMap的key  
  40.      */    
  41.     public void playSound(int resId){    
  42.         // 获得map的value即对应音效    
  43.         Integer soundId = soundMap.get(resId);    
  44.         if(soundId != null){    
  45.             pool.play(soundId, 11101);    
  46.         }    
  47.     }    
  48.     private void initMedia(){    
  49.         // 第一次播放不用prepare    
  50.         player = MediaPlayer.create(context, R.raw.bg);    
  51.         // 循环播放    
  52.         player.setLooping(true);    
  53.     }    
  54.     public void play() {    
  55.         // 播放背景音乐    
  56.         player.start();    
  57.     }    
  58.     /**  
  59.      * 停止播放  
  60.      */    
  61.     public void stop() {    
  62.         if (player.isPlaying()) {    
  63.             player.stop();    
  64.             try {    
  65.                 player.prepare();    
  66.                 // stop后再次start会继续播放,设置从0开始播放    
  67.                 player.seekTo(0);    
  68.             } catch (Exception e) {    
  69.                 // TODO Auto-generated catch block    
  70.                 e.printStackTrace();    
  71.             }     
  72.         }    
  73.     }    
  74.     /**  
  75.      * 暂停播放  
  76.      */    
  77.     public void pause(){    
  78.         if(player.isPlaying()){    
  79.             player.pause();    
  80.         }       
  81.     }    
  82.     /**  
  83.      * 游戏退出释放资源  
  84.      */    
  85.     public void close() {    
  86.         if(player == null)    
  87.             return ;    
  88.         if(player.isPlaying()){    
  89.             // 停止播放    
  90.             player.stop();    
  91.         }    
  92.         // 释放资源,无法使用。mediaPlayer引用还在    
  93.         player.release();    
  94.         player = null;    
  95.     }     
  96.     /**  
  97.      * 继续播放音乐  
  98.      */    
  99.     public void continuePlay() {    
  100.         player.start();    
  101.     }    
  102.     /**  
  103.      * 判断背景音乐是否在播放  
  104.      * @return  
  105.      */    
  106.     public Boolean isNowPlay(){    
  107.         if(player.isPlaying()){    
  108.             return true;    
  109.         }    
  110.         return false;    
  111.     }    
  112. }    

  游戏中的控制类,该类处理玩家对界面的操作和游戏响应,把界面操作和游戏逻辑分开设计,降低耦合性。代码如下:

Java代码
  1. package cn.com.cyj.mouse.controller;    
  2.     
  3. import java.util.ArrayList;    
  4.     
  5. import android.content.Context;    
  6. import android.content.Intent;    
  7. import android.os.Bundle;    
  8. import cn.com.cyj.mouse.database.GamerDatabase;    
  9. import cn.com.cyj.mouse.enity.Gamer;    
  10. import cn.com.cyj.mouse.services.MusicService;    
  11. import cn.com.cyj.mouse.ui.ShowRank;    
  12. /**  
  13.  * 游戏中的控制类  
  14.  * @author cyj  
  15.  *  
  16.  */    
  17. public class Controller {    
  18.     ArrayList<Gamer> gamerList;    
  19.     GamerDatabase gamerDatabase;    
  20.     Context context;    
  21.     MusicService musicService;    
  22.     
  23.     public Controller(Context context) {    
  24.         this.context = context;    
  25.         gamerDatabase = new GamerDatabase(context);    
  26.         musicService = new MusicService(context);    
  27.         gamerList = new ArrayList<Gamer>();    
  28.     }    
  29.     
  30.     /**  
  31.      * 插入数据  
  32.      *   
  33.      * @param gamer  
  34.      *            玩家对象  
  35.      * @return true 插入玩家成功;false 插入玩家失败  
  36.      */    
  37.     public Boolean insert(Gamer gamer) {    
  38.         if (gamerDatabase.insertGamer(gamer))    
  39.             return true;    
  40.         return false;    
  41.     }    
  42.     
  43.     /**  
  44.      * 查询所有玩家信息  
  45.      *   
  46.      * @return true 有玩家信息; false 没有玩家信息  
  47.      */    
  48.     public Boolean query() {    
  49.         gamerList = gamerDatabase.queryGamerAll();    
  50.         if (gamerList.size() == 0)    
  51.             return false;    
  52.         Intent intent = new Intent(context, ShowRank.class);    
  53.         Bundle bundle = new Bundle();    
  54.         // 装入被序列化的玩家信息列表,将数据传到新的Activity    
  55.         bundle.putSerializable("gamerlist", gamerList);    
  56.         intent.putExtras(bundle);    
  57.         intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);    
  58.         context.startActivity(intent);    
  59.         return true;    
  60.     }    
  61.     /**  
  62.      * 播放音乐  
  63.      */    
  64.     public void play() {    
  65.         musicService.play();    
  66.     }    
  67.     /**  
  68.      * 关闭音乐  
  69.      */    
  70.     public void stop() {    
  71.         musicService.stop();    
  72.     }    
  73.     /**  
  74.      * 暂停音乐  
  75.      */    
  76.     public void pauseMusic() {    
  77.         musicService.pause();    
  78.     }    
  79.     /**  
  80.      * 继续播放  
  81.      */    
  82.     public void continuePlay() {    
  83.         musicService.continuePlay();    
  84.     }    
  85.     /**  
  86.      *  游戏结束释放资源  
  87.      */    
  88.     public void close() {    
  89.         musicService.close();    
  90.     }    
  91.     /**  
  92.      * 播放音效  
  93.      * @param resId 音乐文件资源id  
  94.      */    
  95.     public void playSound(int resId) {    
  96.         musicService.playSound(resId);    
  97.     }    
  98.         
  99.     /**  
  100.      * 判断音乐是否在播放  
  101.      * @return true音乐正在播放,false音乐已经停止  
  102.      */    
  103.     public Boolean isPlay(){    
  104.         if(musicService.isNowPlay()){    
  105.             return true;    
  106.         }    
  107.         return false;    
  108.     }    

相关教程

  • android游戏引擎andengine学习系列二简单的例子

    如何高效的学习,这才是我们最值得去学习的。 首先导入架包,下载:http://download.csdn.net/detail/duancanmeng/4060082 lib文件夹中像我们写Android程序entends Activity一样,我们一开始也要extends BaseGameActivity,而且实现四个必须被重载函数:[java] view plain co…

    2016/10/9 14:05:05
  • AndEngine游戏开发系列教程

    链接地址:http://www.apkbus.com/android-130403-1-1.html一、简介AndEngine基于libGDX框架开发,使用OpenGL ES进行图形绘制,底层使用C++编写,通过JNI调用来实现,因此比较高效,功能强大。同时集成了Box2D物理引擎,因此能实现一些较为复杂的物理效果。在Rokon(另一个Android …

    2016/10/9 13:59:41
  • 移植cocos2dAndroid包框架设计

    随着android平台的推广和android手机的大量推出,有人预言android将是一个嵌入式的统一平台。果真如此吗?Apple,Microsoft, nokia不会坐视不管的,在想想unix各种混乱的版本,总让人忧心忡忡。不过有google这位大神做东,至少在短期内,android会很稳定,市场会有一席之地。目…

    2016/10/7 12:53:02

共有访客发表了评论 网友评论

验证码: 看不清楚?