Android学习 游戏开发之打地鼠(终)(五,排行榜和游戏音效)

来源:互联网 发布:如何查看知乎提问者 编辑:程序博客网 时间:2024/04/30 08:12

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

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

package cn.com.cyj.mouse.ui;import java.util.ArrayList;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import cn.com.cyj.mouse.R;import cn.com.cyj.mouse.enity.Gamer;/** * 显示玩家排行榜 *  * @author cyj *  */public class ShowRank extends BaseActivity {ListView lv;ArrayList<Gamer> gamerList;TextView gamerName;TextView gamerScore;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_showrank);gamerList = new ArrayList<Gamer>();Intent intent = getIntent();gamerList = (ArrayList<Gamer>) intent.getSerializableExtra("gamerlist");// 初始化listview对象lv = (ListView) findViewById(R.id.lv);// 给listview对象添加适配器lv.setAdapter(new MyAdapter());}class MyAdapter extends BaseAdapter {// 获得数据总数@Overridepublic int getCount() {return gamerList.size();}// 根据位置获得某条数据@Overridepublic Object getItem(int position) {return null;}// 根据位置获得某条数据id@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View contentView, ViewGroup parent) {View v = contentView;if (v == null) {// 通过inflate填充viewv = View.inflate(ShowRank.this, R.layout.list_item, null);gamerName = (TextView) v.findViewById(R.id.gamername);gamerScore = (TextView) v.findViewById(R.id.gamerscore);}Gamer gamer = gamerList.get(position);gamerName.setText(gamer.getName());gamerScore.setText(gamer.getScore() + "");return v;}}}
一个游戏没有音效无可厚非,但是有了音效会更有乐趣。本游戏采用了MediaPlayer+SoundPool的形式,前者播放背景音乐,后者播放游戏的打击音效,关于MediaPlayer的使用,没有什么比官方的图来的更简单粗暴了,这里不再赘述。SoundPool的使用,第一步new SoundPool();第二步load(),通常用一个HashMap存放音乐文件id和load的映射;第三步play()。代码如下:

package cn.com.cyj.mouse.services;import java.util.HashMap;import java.util.Map;import android.content.Context;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.SoundPool;import cn.com.cyj.mouse.R;/** * 处理游戏的背景音乐和音效 * @author cyj * */public class MusicService {// 用来播放背景音乐MediaPlayer player;// 用来播放音效SoundPool pool;Context context;// 存放音效Map<Integer, Integer> soundMap;public MusicService(Context context) {this.context = context;initMedia();initSound();}private void initSound() {pool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);soundMap = new HashMap<Integer, Integer>();// 加载音效文件并放入hashmap中soundMap.put(R.raw.dismistake, pool.load(context, R.raw.dismistake, 1));soundMap.put(R.raw.hathit, pool.load(context, R.raw.hathit, 1));}/** * 通过resId播放在hashmap中对应的要播放的音效 * @param resId hashMap的key */public void playSound(int resId){// 获得map的value即对应音效Integer soundId = soundMap.get(resId);if(soundId != null){pool.play(soundId, 1, 1, 1, 0, 1);}}private void initMedia(){// 第一次播放不用prepareplayer = MediaPlayer.create(context, R.raw.bg);// 循环播放player.setLooping(true);}public void play() {// 播放背景音乐player.start();}/** * 停止播放 */public void stop() {if (player.isPlaying()) {player.stop();try {player.prepare();// stop后再次start会继续播放,设置从0开始播放player.seekTo(0);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} }}/** * 暂停播放 */public void pause(){if(player.isPlaying()){player.pause();}}/** * 游戏退出释放资源 */public void close() {if(player == null)return ;if(player.isPlaying()){// 停止播放player.stop();}// 释放资源,无法使用。mediaPlayer引用还在player.release();player = null;} /** * 继续播放音乐 */public void continuePlay() {player.start();}/** * 判断背景音乐是否在播放 * @return */public Boolean isNowPlay(){if(player.isPlaying()){return true;}return false;}}
游戏中的控制类,该类处理玩家对界面的操作和游戏响应,把界面操作和游戏逻辑分开设计,降低耦合性。代码如下:

package cn.com.cyj.mouse.controller;import java.util.ArrayList;import android.content.Context;import android.content.Intent;import android.os.Bundle;import cn.com.cyj.mouse.database.GamerDatabase;import cn.com.cyj.mouse.enity.Gamer;import cn.com.cyj.mouse.services.MusicService;import cn.com.cyj.mouse.ui.ShowRank;/** * 游戏中的控制类 * @author cyj * */public class Controller {ArrayList<Gamer> gamerList;GamerDatabase gamerDatabase;Context context;MusicService musicService;public Controller(Context context) {this.context = context;gamerDatabase = new GamerDatabase(context);musicService = new MusicService(context);gamerList = new ArrayList<Gamer>();}/** * 插入数据 *  * @param gamer *            玩家对象 * @return true 插入玩家成功;false 插入玩家失败 */public Boolean insert(Gamer gamer) {if (gamerDatabase.insertGamer(gamer))return true;return false;}/** * 查询所有玩家信息 *  * @return true 有玩家信息; false 没有玩家信息 */public Boolean query() {gamerList = gamerDatabase.queryGamerAll();if (gamerList.size() == 0)return false;Intent intent = new Intent(context, ShowRank.class);Bundle bundle = new Bundle();// 装入被序列化的玩家信息列表,将数据传到新的Activitybundle.putSerializable("gamerlist", gamerList);intent.putExtras(bundle);intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);context.startActivity(intent);return true;}/** * 播放音乐 */public void play() {musicService.play();}/** * 关闭音乐 */public void stop() {musicService.stop();}/** * 暂停音乐 */public void pauseMusic() {musicService.pause();}/** * 继续播放 */public void continuePlay() {musicService.continuePlay();}/** *  游戏结束释放资源 */public void close() {musicService.close();}/** * 播放音效 * @param resId 音乐文件资源id */public void playSound(int resId) {musicService.playSound(resId);}/** * 判断音乐是否在播放 * @return true音乐正在播放,false音乐已经停止 */public Boolean isPlay(){if(musicService.isNowPlay()){return true;}return false;}}

0 0