游戏的基本功能都已经实现了,最后来说一说排行榜的显示和游戏音效的添加。
排行榜的显示主要用的Android中一个比较重要的控件ListView。ListView的使用还是比较简单的,第一步在布局文件中建立一个ListView的节点,在代码中通过ID得到该控件。第二步给该控件设置一个适配器,适配器写一个类,该类继承BaseAdapter并实现未实现的方法,一共有4个为实现的方法,getCount()获得数据总数,getItem(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;
- @Override
- protected 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 {
- // 获得数据总数
- @Override
- public int getCount() {
- return gamerList.size();
- }
- // 根据位置获得某条数据
- @Override
- public Object getItem(int position) {
- return null;
- }
- // 根据位置获得某条数据id
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return 0;
- }
- @Override
- public View getView(int position, View contentView, ViewGroup parent) {
- View v = contentView;
- if (v == null) {
- // 通过inflate填充view
- v = 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(){
- // 第一次播放不用prepare
- player = 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 block
- e.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();
- // 装入被序列化的玩家信息列表,将数据传到新的Activity
- bundle.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;
- }
- }
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。