Android游戏开发之打地鼠(二、游戏设计和主界面设计)

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

  游戏设计思路:

  主界面点击开始游戏:进入打地鼠界面游戏中有12个地洞,游戏时间为30s(可以自己设置),每0.5s会有地鼠随机出现在一个地洞中,玩家触摸屏幕,打到地鼠加10分,否则不加分。30s后游戏结束,弹出窗口显示获得分数,需要玩家输入姓名后,点击确定保存到本地数据库中。

  设计实现:每个地洞为一个ImageButton,开始设置背景为地洞图片,地鼠出现则设置为地鼠图片,给每个按钮添加点击事件,当玩家点击按钮时,如果打到地鼠,该按钮设置打中地鼠图片,否则设置没打中地鼠的图片。游戏结束开启记录窗口,记录玩家信息。

  主界面点击排行榜:如果没有记录,提示暂无排行,有记录就跳转界面,按分数从高到低显示玩家信息。

  设计实现:通过对数据库的查询操作,返回一个ArrayList,如果ArrayList长度为0,则提示“暂无排行”,否则开启一个新的Activity显示玩家信息。

  主界面点击关于:显示游戏的相关信息。

  设计实现:Activity跳转。

  主界面点击退出:游戏退出

  设计实现:调用finish()函数。

  主界面点击音乐图标:游戏打开默认播放音乐,点击图标背景音乐和音效会关闭,再次点击会播放背景音乐和音效。

  设计实现:一个ToggleButton(开关按钮)背景设置成音乐图标,点击会触发响应事件。

  按物理返回键游戏停止,在onDestroy()方法中做释放资源等操作。

  注:游戏中所写的Activity继承BaseActivity,自己实现的一个继承Activity的类。那么为什么要实现这么一个类呢?在游戏的后期添加音效时,程序进入后台,背景音乐会一直播放,因为背景音乐在所有的Activity中都会播放,所以要在每个Activity的生命周期的回调函数中对音乐操作无疑是比较麻烦的,所以继承自一个我们自己实现的BaseActivity,只需要在BaseActivity中来操作即可。

  BaseActivity的代码如下:

Java代码
  1. package cn.com.cyj.mouse.ui;    
  2.     
  3. import android.app.Activity;    
  4. import android.os.Bundle;    
  5.     
  6. /**  
  7.  *   
  8.  * @author cyj  
  9.  *   
  10.  */    
  11. public class BaseActivity extends Activity {    
  12.     // 音乐播放标记    
  13.     protected Boolean isLive = false;    
  14.     
  15.     @Override    
  16.     protected void onCreate(Bundle savedInstanceState) {    
  17.         super.onCreate(savedInstanceState);    
  18.     }    
  19.     
  20.     @Override    
  21.     protected void onResume() {    
  22.         super.onResume();    
  23.         // 如果进入后台前音乐是播放的,进入前台时继续播放    
  24.         if (isLive) {    
  25.             MouseStart.controller.continuePlay();    
  26.         }    
  27.     }    
  28.     // 进入后台时系统调用    
  29.     @Override    
  30.     protected void onUserLeaveHint() {    
  31.         super.onUserLeaveHint();    
  32.         // 如果音乐在播放就暂停    
  33.         if (MouseStart.controller.isPlay()) {    
  34.             MouseStart.controller.pauseMusic();    
  35.             isLive = true;    
  36.         } else {    
  37.             isLive = false;    
  38.         }    
  39.     }    
  40. }    

       主界面代码如下:

Java代码
  1. package cn.com.cyj.mouse.ui;    
  2.     
  3. import android.content.Intent;    
  4. import android.os.Bundle;    
  5. import android.view.MotionEvent;    
  6. import android.view.View;    
  7. import android.view.View.OnClickListener;    
  8. import android.view.View.OnTouchListener;    
  9. import android.widget.ImageButton;    
  10. import android.widget.Toast;    
  11. import android.widget.ToggleButton;    
  12. import cn.com.cyj.mouse.R;    
  13. import cn.com.cyj.mouse.controller.Controller;    
  14. import cn.com.cyj.mouse.services.GameRun;    
  15.     
  16. /**  
  17.  * 游戏主界面  
  18.  *   
  19.  * @author cyj  
  20.  *   
  21.  */    
  22. public class MouseStart extends BaseActivity {    
  23.     // 开始游戏按钮    
  24.     ImageButton start;    
  25.     // 排行榜按钮    
  26.     ImageButton rank;    
  27.     // 关于按钮    
  28.     ImageButton about;    
  29.     // 退出按钮    
  30.     ImageButton exit;    
  31.     // 音乐开关    
  32.     ToggleButton music;    
  33.     Intent intent;    
  34.     // 只有能一个controller定义成静态共别的Activity调用,之前在BaseActivity创建controller的对象每个子类都会有一个controller,出现问题    
  35.     public static Controller controller;    
  36.     
  37.     @Override    
  38.     protected void onCreate(Bundle savedInstanceState) {    
  39.         super.onCreate(savedInstanceState);    
  40.         setContentView(R.layout.activity_gamestart);    
  41.         controller = new Controller(this);    
  42.         /*  
  43.          * 初始化各个按钮  
  44.          */    
  45.         start = (ImageButton) findViewById(R.id.startgame);    
  46.         rank = (ImageButton) findViewById(R.id.rank);    
  47.         about = (ImageButton) findViewById(R.id.about);    
  48.         exit = (ImageButton) findViewById(R.id.exit);    
  49.         music = (ToggleButton) findViewById(R.id.musical);    
  50.         /*  
  51.          * 给每个按钮添加点击事件  
  52.          */    
  53.         GameStartOnClick game = new GameStartOnClick();    
  54.         start.setOnClickListener(game);    
  55.         start.setOnTouchListener(game);    
  56.         rank.setOnClickListener(game);    
  57.         rank.setOnTouchListener(game);    
  58.         about.setOnClickListener(game);    
  59.         about.setOnTouchListener(game);    
  60.         exit.setOnClickListener(game);    
  61.         exit.setOnTouchListener(game);    
  62.         music.setOnClickListener(game);    
  63.         // 游戏开启默认播放背景音乐    
  64.         controller.play();    
  65.     }    
  66.     
  67.     class GameStartOnClick implements OnClickListener, OnTouchListener {    
  68.     
  69.         @Override    
  70.         public void onClick(View v) {    
  71.             int id = v.getId();    
  72.             switch (id) {    
  73.             case R.id.startgame:    
  74.                 // 进入开始游戏Activity    
  75.                 intent = new Intent(MouseStart.this, GameRun.class);    
  76.                 intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);    
  77.                 MouseStart.this.startActivity(intent);    
  78.                 break;    
  79.             case R.id.rank:    
  80.                 // 通过控制类对象查询全部玩家信息    
  81.                 if (!controller.query()) {    
  82.                     Toast.makeText(MouseStart.this"暂无排行", Toast.LENGTH_SHORT)    
  83.                             .show();    
  84.                 }    
  85.                 break;    
  86.             case R.id.about:    
  87.                 // 打开关于Activity    
  88.                 intent = new Intent(MouseStart.this, About.class);    
  89.                 intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);    
  90.                 startActivity(intent);    
  91.                 break;    
  92.             case R.id.exit:    
  93.                 // 关闭Activity    
  94.                 finish();    
  95.                 break;    
  96.             case R.id.musical:    
  97.                 if (music.isChecked()) {    
  98.                     controller.stop();    
  99.                 } else {    
  100.                     controller.play();    
  101.                 }    
  102.                 break;    
  103.             default:    
  104.                 break;    
  105.             }    
  106.     
  107.         }    
  108.     
  109.         /**  
  110.          * 设置按钮按下和抬起的效果  
  111.          */    
  112.         @Override    
  113.         public boolean onTouch(View v, MotionEvent event) {    
  114.             int id = v.getId();    
  115.             switch (id) {    
  116.             case R.id.startgame:    
  117.                 if (event.getAction() == MotionEvent.ACTION_DOWN) {    
  118.                     start.setBackgroundResource(R.drawable.startgamean);    
  119.                 }    
  120.                 if (event.getAction() == MotionEvent.ACTION_UP) {    
  121.                     start.setBackgroundResource(R.drawable.startgame);    
  122.                 }    
  123.                 break;    
  124.             case R.id.rank:    
  125.                 if (event.getAction() == MotionEvent.ACTION_DOWN) {    
  126.     
  127.                     rank.setBackgroundResource(R.drawable.rankan);    
  128.                 }    
  129.                 if (event.getAction() == MotionEvent.ACTION_UP) {    
  130.                     rank.setBackgroundResource(R.drawable.rank);    
  131.                 }    
  132.                 break;    
  133.             case R.id.about:    
  134.                 if (event.getAction() == MotionEvent.ACTION_DOWN) {    
  135.                     about.setBackgroundResource(R.drawable.aboutan);    
  136.                 }    
  137.                 if (event.getAction() == MotionEvent.ACTION_UP) {    
  138.                     about.setBackgroundResource(R.drawable.about);    
  139.                 }    
  140.                 break;    
  141.             case R.id.exit:    
  142.                 if (event.getAction() == MotionEvent.ACTION_DOWN) {    
  143.                     exit.setBackgroundResource(R.drawable.exitan);    
  144.                 }    
  145.                 if (event.getAction() == MotionEvent.ACTION_UP) {    
  146.                     exit.setBackgroundResource(R.drawable.exit);    
  147.                 }    
  148.                 break;    
  149.     
  150.             default:    
  151.                 break;    
  152.             }    
  153.             return false;    
  154.         }    
  155.     }    
  156.     
  157.     @Override    
  158.     protected void onDestroy() {    
  159.         // TODO Auto-generated method stub    
  160.         super.onDestroy();    
  161.         controller.close();    
  162.     }    
  163. }    

       顺便贴一下About中的代码:这个类比较简单直接加载对应的xml文件就可以,一些介绍的话在xml中写。

Java代码
  1. package cn.com.cyj.mouse.ui;    
  2.     
  3. import android.os.Bundle;    
  4. import cn.com.cyj.mouse.R;    
  5. /**  
  6.  * 关于界面  
  7.  * @author cyj  
  8.  *  
  9.  */    
  10. public class About extends BaseActivity {    
  11.     @Override    
  12.     protected void onCreate(Bundle savedInstanceState) {    
  13.         super.onCreate(savedInstanceState);    
  14.         setContentView(R.layout.activity_about);    
  15.     }    
  16. }

相关教程

  • 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

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

验证码: 看不清楚?