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

游戏设计思路:

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

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

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

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

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

设计实现:Activity跳转。

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

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

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

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

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

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

BaseActivity的代码如下:

package cn.com.cyj.mouse.ui;

import android.app.Activity;
import android.os.Bundle;

/**
 * 
 * @author cyj
 * 
 */
public class BaseActivity extends Activity {
	// 音乐播放标记
	protected Boolean isLive = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

	@Override
	protected void onResume() {
		super.onResume();
		// 如果进入后台前音乐是播放的,进入前台时继续播放
		if (isLive) {
			MouseStart.controller.continuePlay();
		}
	}
	// 进入后台时系统调用
	@Override
	protected void onUserLeaveHint() {
		super.onUserLeaveHint();
		// 如果音乐在播放就暂停
		if (MouseStart.controller.isPlay()) {
			MouseStart.controller.pauseMusic();
			isLive = true;
		} else {
			isLive = false;
		}
	}
}
主界面代码如下:
package cn.com.cyj.mouse.ui;

import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageButton;
import android.widget.Toast;
import android.widget.ToggleButton;
import cn.com.cyj.mouse.R;
import cn.com.cyj.mouse.controller.Controller;
import cn.com.cyj.mouse.services.GameRun;

/**
 * 游戏主界面
 * 
 * @author cyj
 * 
 */
public class MouseStart extends BaseActivity {
	// 开始游戏按钮
	ImageButton start;
	// 排行榜按钮
	ImageButton rank;
	// 关于按钮
	ImageButton about;
	// 退出按钮
	ImageButton exit;
	// 音乐开关
	ToggleButton music;
	Intent intent;
	// 只有能一个controller定义成静态共别的Activity调用,之前在BaseActivity创建controller的对象每个子类都会有一个controller,出现问题
	public static Controller controller;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_gamestart);
		controller = new Controller(this);
		/*
		 * 初始化各个按钮
		 */
		start = (ImageButton) findViewById(R.id.startgame);
		rank = (ImageButton) findViewById(R.id.rank);
		about = (ImageButton) findViewById(R.id.about);
		exit = (ImageButton) findViewById(R.id.exit);
		music = (ToggleButton) findViewById(R.id.musical);
		/*
		 * 给每个按钮添加点击事件
		 */
		GameStartOnClick game = new GameStartOnClick();
		start.setOnClickListener(game);
		start.setOnTouchListener(game);
		rank.setOnClickListener(game);
		rank.setOnTouchListener(game);
		about.setOnClickListener(game);
		about.setOnTouchListener(game);
		exit.setOnClickListener(game);
		exit.setOnTouchListener(game);
		music.setOnClickListener(game);
		// 游戏开启默认播放背景音乐
		controller.play();
	}

	class GameStartOnClick implements OnClickListener, OnTouchListener {

		@Override
		public void onClick(View v) {
			int id = v.getId();
			switch (id) {
			case R.id.startgame:
				// 进入开始游戏Activity
				intent = new Intent(MouseStart.this, GameRun.class);
				intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
				MouseStart.this.startActivity(intent);
				break;
			case R.id.rank:
				// 通过控制类对象查询全部玩家信息
				if (!controller.query()) {
					Toast.makeText(MouseStart.this, "暂无排行", Toast.LENGTH_SHORT)
							.show();
				}
				break;
			case R.id.about:
				// 打开关于Activity
				intent = new Intent(MouseStart.this, About.class);
				intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION);
				startActivity(intent);
				break;
			case R.id.exit:
				// 关闭Activity
				finish();
				break;
			case R.id.musical:
				if (music.isChecked()) {
					controller.stop();
				} else {
					controller.play();
				}
				break;
			default:
				break;
			}

		}

		/**
		 * 设置按钮按下和抬起的效果
		 */
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			int id = v.getId();
			switch (id) {
			case R.id.startgame:
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					start.setBackgroundResource(R.drawable.startgamean);
				}
				if (event.getAction() == MotionEvent.ACTION_UP) {
					start.setBackgroundResource(R.drawable.startgame);
				}
				break;
			case R.id.rank:
				if (event.getAction() == MotionEvent.ACTION_DOWN) {

					rank.setBackgroundResource(R.drawable.rankan);
				}
				if (event.getAction() == MotionEvent.ACTION_UP) {
					rank.setBackgroundResource(R.drawable.rank);
				}
				break;
			case R.id.about:
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					about.setBackgroundResource(R.drawable.aboutan);
				}
				if (event.getAction() == MotionEvent.ACTION_UP) {
					about.setBackgroundResource(R.drawable.about);
				}
				break;
			case R.id.exit:
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					exit.setBackgroundResource(R.drawable.exitan);
				}
				if (event.getAction() == MotionEvent.ACTION_UP) {
					exit.setBackgroundResource(R.drawable.exit);
				}
				break;

			default:
				break;
			}
			return false;
		}
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		controller.close();
	}
}
顺便贴一下About中的代码:这个类比较简单直接加载对应的xml文件就可以,一些介绍的话在xml中写。

package cn.com.cyj.mouse.ui;

import android.os.Bundle;
import cn.com.cyj.mouse.R;
/**
 * 关于界面
 * @author cyj
 *
 */
public class About extends BaseActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_about);
	}
}



你可能感兴趣的:(Android游戏)