实例介绍
【实例简介】
【实例截图】

【核心代码】
package wyf.wpf; //声明包语句
import java.util.ArrayList; //引入相关类
import android.content.res.Resources; //引入相关类
import android.graphics.Bitmap; //引入相关类
import android.graphics.BitmapFactory; //引入相关类
import android.graphics.Canvas; //引入相关类
import android.view.SurfaceHolder; //引入相关类
import android.view.SurfaceView; //引入相关类
import android.view.SurfaceHolder.Callback; //引入相关类
import static wyf.wpf.DriftBall.*; //引入相关类
/*
* 该类继承自SurfaceView,主要功能是绘制游戏屏幕,对后台的绘制或其他线程
* 进行控制。
*/
public class GameView extends SurfaceView implements Callback{
int screenWidth = 320; //屏幕宽度
int screenHeight = 480; //屏幕高度
int backY; //x坐标总是为零
int nebulaX; //星云的x坐标
int nebulaY; //星云的y坐标
int ballX; //小球的横坐标
int ballY; //小球的纵坐标
int tileSize = 20; //图元的大小
int direction = -1; //小球运动方向,上为0,顺时针依次为1~7
int velocity = 4; //小球运动速度
int eatIndex; //吃人动画帧索引
int status; //游戏状态
int trapIndex; //陷阱动画索引
boolean showMenu; //是否显示菜单
DriftBall father; //DriftBall引用
DrawThread dt; //绘制线程
GameThread gt; //后台数据的修改线程
CannonThread ct; //大炮线程
GameMenuThread gmt; //游戏菜单线程
Meteorolite [] meteoArray; //陨石数组
ArrayList<Missile> alMissile = new ArrayList<Missile>(); //存放导弹集合
ArrayList<Cannon> alCannon = new ArrayList<Cannon>(); //存放大炮集合
Bitmap bmpStar; //星空图片
Bitmap bmpNebula; //星云图片
Bitmap bmpBall; //小球图片
Bitmap bmpTile; //地图图元,即路的图片
Bitmap [] bmpMeteo; //陨石图片
Bitmap [] bmpEat; //吃人图片
Bitmap bmpHome; //家的图片
Bitmap [] bmpTrap; //陷阱图片
Bitmap bmpCannon; //大炮图片
Bitmap bmpMissile; //导弹图片
Bitmap bmpPlusLife; //加命图片
Bitmap bmpMultiply; //乘号图片,用以显示命数
Bitmap [] bmpNumber; //数字图片
Bitmap [] bmpMenuItem; //菜单项图片数组
Bitmap bmpGameWin; //游戏胜利图片
Bitmap bmpGameOver; //游戏结束图片
Bitmap bmpGamePass; //游戏通关图片
//地图,为零则空,为1则路,2为家,6是吃小球的,7是陷阱,8是大炮
byte [][] currMap;
int [][] menuCoordinate; //菜单及菜单项的位置
public GameView(DriftBall father) {
super(father);
this.father = father;
//初始化图片
initBitmap(father);
//获得SurfaceHolder
getHolder().addCallback(this);
dt = new DrawThread(getHolder(),this);
gt = new GameThread(this);
//初始化陨石数组
meteoArray = new Meteorolite[3];
for(int i=0;i<3;i ){
meteoArray[i] = new Meteorolite();
}
initGame();
}
//初始化图片资源
public void initBitmap(DriftBall father){
Resources r = father.getResources();
bmpStar = BitmapFactory.decodeResource(r, R.drawable.stars);
bmpNebula = BitmapFactory.decodeResource(r, R.drawable.nebula);
bmpBall = BitmapFactory.decodeResource(r, R.drawable.ball);
bmpTile = BitmapFactory.decodeResource(r, R.drawable.tile);
bmpMeteo = new Bitmap[8]; //陨石动画帧
bmpMeteo[0] = BitmapFactory.decodeResource(r, R.drawable.meteo1);
bmpMeteo[1] = BitmapFactory.decodeResource(r, R.drawable.meteo2);
bmpMeteo[2] = BitmapFactory.decodeResource(r, R.drawable.meteo3);
bmpMeteo[3] = BitmapFactory.decodeResource(r, R.drawable.meteo4);
bmpMeteo[4] = BitmapFactory.decodeResource(r, R.drawable.meteo5);
bmpMeteo[5] = BitmapFactory.decodeResource(r, R.drawable.meteo6);
bmpMeteo[6] = BitmapFactory.decodeResource(r, R.drawable.meteo7);
bmpMeteo[7] = BitmapFactory.decodeResource(r, R.drawable.meteo8);
bmpEat = new Bitmap[4]; //吃人动画帧
bmpEat[0] = BitmapFactory.decodeResource(r, R.drawable.eat_1);
bmpEat[1] = BitmapFactory.decodeResource(r, R.drawable.eat_2);
bmpEat[2] = BitmapFactory.decodeResource(r, R.drawable.eat_3);
bmpEat[3] = BitmapFactory.decodeResource(r, R.drawable.eat_4);
bmpHome = BitmapFactory.decodeResource(r, R.drawable.home);
bmpTrap = new Bitmap[8]; //陷阱动画帧
bmpTrap[0] = BitmapFactory.decodeResource(r, R.drawable.trap1);
bmpTrap[1] = BitmapFactory.decodeResource(r, R.drawable.trap1);
bmpTrap[2] = BitmapFactory.decodeResource(r, R.drawable.trap1);
bmpTrap[3] = BitmapFactory.decodeResource(r, R.drawable.trap1);
bmpTrap[4] = BitmapFactory.decodeResource(r, R.drawable.trap3);
bmpTrap[5] = BitmapFactory.decodeResource(r, R.drawable.trap5);
bmpTrap[6] = BitmapFactory.decodeResource(r, R.drawable.trap7);
bmpTrap[7] = BitmapFactory.decodeResource(r, R.drawable.trap9);
bmpCannon = BitmapFactory.decodeResource(r, R.drawable.cannon);
bmpMissile = BitmapFactory.decodeResource(r, R.drawable.missile);
bmpPlusLife = BitmapFactory.decodeResource(r, R.drawable.plus_life);
bmpMultiply = BitmapFactory.decodeResource(r, R.drawable.multiply);
bmpNumber = new Bitmap[10]; //初始化数字图片资源
bmpNumber[0] = BitmapFactory.decodeResource(r, R.drawable.number0);
bmpNumber[1] = BitmapFactory.decodeResource(r, R.drawable.number1);
bmpNumber[2] = BitmapFactory.decodeResource(r, R.drawable.number2);
bmpNumber[3] = BitmapFactory.decodeResource(r, R.drawable.number3);
bmpNumber[4] = BitmapFactory.decodeResource(r, R.drawable.number4);
bmpNumber[5] = BitmapFactory.decodeResource(r, R.drawable.number5);
bmpNumber[6] = BitmapFactory.decodeResource(r, R.drawable.number6);
bmpNumber[7] = BitmapFactory.decodeResource(r, R.drawable.number7);
bmpNumber[8] = BitmapFactory.decodeResource(r, R.drawable.number8);
bmpNumber[9] = BitmapFactory.decodeResource(r, R.drawable.number9);
bmpMenuItem = new Bitmap[5];
bmpMenuItem[0] = BitmapFactory.decodeResource(r, R.drawable.game_menu);
bmpMenuItem[1] = BitmapFactory.decodeResource(r, R.drawable.menu_continue_game);
bmpMenuItem[2] = BitmapFactory.decodeResource(r, R.drawable.menu_sound_off);
bmpMenuItem[3] = BitmapFactory.decodeResource(r, R.drawable.menu_help);
bmpMenuItem[4] = BitmapFactory.decodeResource(r, R.drawable.menu_back_to_main);
bmpGameWin = BitmapFactory.decodeResource(r, R.drawable.game_win);
bmpGameOver = BitmapFactory.decodeResource(r, R.drawable.game_over);
bmpGamePass = BitmapFactory.decodeResource(r, R.drawable.game_pass);
}
//初始化参数
public void initGame(){
this.ballX = 0;
this.ballY = 0;
this.backY = 0;
this.nebulaX = (int)(Math.random()*150);
this.nebulaY = -120;
this.currMap = GameMap.getMap(father.level);
//检查大炮
if(checkForCannon()){
ct = new CannonThread(this);
}
System.out.println("*****the size of alCannon:" alCannon.size() "***********");
}
//回复游戏
public void resumeGame(){
dt.isGameOn = true; //
gt.isGameOn = true;
if(ct != null){
ct.isGameOn = true;
}
status = STATUS_PLAY;
}
//屏幕绘制方法
public void doDraw(Canvas canvas){
//绘制星空背景
canvas.drawBitmap(bmpStar,0,backY,null);
if(backY <= -120){
canvas.drawBitmap(bmpStar, 0, backY 600, null);
}
//绘制星云
canvas.drawBitmap(bmpNebula, nebulaX, nebulaY, null);
//画下面的陨石
for(Meteorolite m:meteoArray){
if(!m.up){
canvas.drawBitmap(bmpMeteo[m.index], m.x,m.y,null);
}
}
//绘制地图
drawMap(canvas);
//绘制小球
if(status != STATUS_OVER && status != STATUS_PASS){
canvas.drawBitmap(bmpBall, ballX, ballY, null);
}
//画上面的陨石
for(Meteorolite m:meteoArray){
if(m.up){
canvas.drawBitmap(bmpMeteo[m.index], m.x,m.y,null);
}
}
//画还有几条命
canvas.drawBitmap(bmpBall, 240, 0, null);
canvas.drawBitmap(bmpMultiply, 265, 2, null);
drawNumber(canvas,father.life);
//画炮弹
try{
if(alMissile.size() != 0){
for(Missile m:alMissile){
canvas.drawBitmap(bmpMissile, m.x-5, m.y, null);
}
}
}
catch(Exception e){
}
//绘制其他界面
switch(status){
case STATUS_PAUSE: //游戏暂停,出菜单
if(!father.wantSound){
bmpMenuItem[2] = BitmapFactory.decodeResource(father.getResources(), R.drawable.menu_sound_on);
}
for(int i=0;i<5;i ){ //绘制菜单子项
canvas.drawBitmap(bmpMenuItem[i], menuCoordinate[i][0], menuCoordinate[i][1], null);
}
break;
case STATUS_WIN: //过了一关
canvas.drawBitmap(bmpGameWin, 70, 200, null);
break;
case STATUS_OVER: //死完命了
canvas.drawBitmap(bmpGameOver, 70, 200, null);
break;
case STATUS_PASS: //完全通关,不是一般人呀
canvas.drawBitmap(bmpGamePass, 70, 200, null);
break;
}
}
public void drawNumber(Canvas canvas,int life) {//绘制数字
String sLife = life "";
int length = sLife.length();
for(int i=0;i<length;i ){
canvas.drawBitmap(bmpNumber[sLife.charAt(i)-'0'], 280 16*i, 0, null);
}
}
//绘制地图
public void drawMap(Canvas canvas){
for(int i=0;i<currMap.length;i ){
for(int j=0;j<currMap[i].length;j ){
switch(currMap[i][j]){
case 1: //普通地图
canvas.drawBitmap(bmpTile, j*tileSize, i*tileSize, null);
break;
case 2: //家
canvas.drawBitmap(bmpHome, j*tileSize, i*tileSize, null);
break;
case 3://加命奖励
canvas.drawBitmap(bmpPlusLife, j*tileSize, i*tileSize, null);
break;
case 4: //吃人的
canvas.drawBitmap(bmpEat[eatIndex], j*tileSize, i*tileSize, null);
break;
case 5: //陷阱
canvas.drawBitmap(bmpTrap[trapIndex], j*tileSize, i*tileSize, null);
break;
case 6: //大炮
canvas.drawBitmap(bmpCannon, j*tileSize, i*tileSize, null);
break;
}
}
}
}
//检查是否有大炮
public boolean checkForCannon(){
boolean result = false;
for(int i=0;i<currMap.length;i ){ //对地图进行遍历
for(int j=0;j<currMap[i].length;j ){
if(currMap[i][j] == 8){ //如果地图图元为大炮
Cannon c = new Cannon(i,j,this); //根据其行列值创建Cannon对象
alCannon.add(c); //将Cannon对象添加到GameView的列表中
result = true; //将result赋值为true
}
}
}
return result; //返回result
}
//暂停游戏
public void pauseGame(){
dt.isGameOn = false;
gt.isGameOn = false;
gt.flag = true;
if(ct != null){
ct.isGameOn = false;
}
status = STATUS_PAUSE;
}
//关闭所有后台线程
public void shutAll(){
gt.isGameOn = false; //暂停GameThread
gt.flag = false; //停止GameThread
if(ct != null){ //如果有大炮,就停止CannonThread
ct.isGameOn = false;
ct.flag = false;
}
dt.flag = false; //停止DrawThread
dt.isGameOn = false;
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {//实现接口方法
}
@Override
public void surfaceCreated(SurfaceHolder holder) {//重写surfaceCreated方法
dt.isGameOn = true; //启动DrawThread
if(!dt.isAlive()){
dt.start();
}
gt.isGameOn = true;
if(!gt.isAlive()){ //启动GameThread
gt.start();
}
if(ct != null){ //如果有大炮,就启动CannonThread
ct.isGameOn = true;
if(!ct.isAlive()){
ct.start();
}
}
status = DriftBall.STATUS_PLAY; //设置游戏状态
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {//重写surfaceDestroyed方法
pauseGame();
}
@Override
protected void finalize() throws Throwable {
System.out.println("WWWWWWWWWWWWWWWWWWW be finallized wwwwwwwwwwwwwwwwww");
super.finalize();
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)