[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier]

Android水果机游戏实例解析

近段时间在手游方面的学习主要集中在Cocos2d-x上。有引擎的确是好哇!不用再像过去费劲的使用Android上底效的SurfaceView或者用OpenGLES一点一点去建立底层框架。今天以我在此前学Android时自已所策划编写的一个小工程来记念一下,告别那段时光。

这个游戏名叫“水果机”,80后不少同好都在街厅中玩过吧。还是喜欢下注“苹果”。在移植到Android上后,我增加了一些内容并提供了双人对战以丰富它的玩法。下面我来介绍一下:

玩家运行程序后。首先是主界面:

为了吸引人气,用了一张美眉(网上找的图自已PS的),宅男福利,我运行调试时也总要多看两眼。QQ群已经不在了。不必再加入。

主界面上有菜单四项:

“开始游戏”:点击后进入游戏。一会儿讲。

“游戏设置”:点击后进入设置界面。这里可以选择单人还是双人玩,在单人玩法中是否弹出打气球的随机奖励以及音效和音乐的设置。“打气球”是我在此基础上的一种创新吧,就是单人玩时每次轮盘经过最下面中间位置时会随机飞出来一些气球,可以选择相应水果位置飞出一些飞镖来击中它爆出彩蛋奖励!


“游戏帮助”:点击后进入帮助界面。



“退出游戏”:点击后关闭程序退出。

咱们直接选“开始游戏”,即进入游戏界面:

单人玩法:



这是一个单人游戏的游戏界面,最上方是筹码显示,初时都是10个。中间是轮盘,下方是下注区。现在玩家可以下注了,在下方水果下注区域(黄或绿区)中触屏,可以在相应水果档里下想要的注数。点击中间的手形按钮可以开始转动轮盘。

在轮盘每次经过最下方中间位置,会飞出一个气球,玩家可以点击下注区的水果以控制轮盘的相应水果位置向中间射出飞镖,击中有随机奖励:


双人对战玩法:



这是一个双人对战的游戏界面,最上方是两个人的筹码,初时都是10个。中间是轮盘,下方是下注区。现在1号玩家可以下注了,在下方水果下注区域(黄或绿区)中触屏,可以在相应水果档里下想要的注数。点击中间的手形按钮可以让二号玩家开始下注,都下完注后点击中间的手会开始转动轮盘。

中奖后会有提示继续。


好的,游戏介绍完了,咱们现在来学习一下如何进行开发:

工程共有11个源文件组成:



介绍一下:

WinnerActivity.java:主程序框架。

WinnerRecord.java:筹码计数器。

Apple.java:主游戏逻辑框架

AppThread.java:多线程更新逻辑。

AppleView.java:游戏视图。

DrawThread.java:多线程更新

FeiBiao.java:飞镖类

FeiBiaoThread.java:多线程更新飞镖逻辑。

QiQiu.java:气球类

QiQiuThread.java:多线程更新气球逻辑。

Tile.java:轮盘的格子类。

咱们就按这个清单来讲解代码:

一.WinnerActivity.java:主程序框架。

package win.gam;import win.gam.AppleView;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.view.WindowManager;public class WinnerActivity extends Activity {    /** Called when the activity is first created. */AppleView appleview;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //setContentView(R.layout.main);        requestWindowFeature(Window.FEATURE_NO_TITLE);//设置不显示标题        getWindow().setFlags(//设置为全屏模式        WindowManager.LayoutParams.FLAG_FULLSCREEN,         WindowManager.LayoutParams.FLAG_FULLSCREEN);        appleview = new AppleView(this);//创建BallView对象        setContentView(appleview);//将屏幕设置为BallView对象    }  }

二.WinnerRecord.java:筹码计数器。

package win.gam;import android.graphics.Color;public class WinnerRecord {intm_WinnerID;//IDintm_IconSize;//我的金币数量intm_AppleRecord[];//对应的水果下注数量intm_Color;//色彩//构造函数publicWinnerRecord(int vWinnerID){m_WinnerID = vWinnerID ;switch(m_WinnerID){case 0:m_Color = Color.YELLOW ;break;case 1:m_Color = Color.GREEN;break;case 2:m_Color = Color.BLUE;break;case 3:m_Color = Color.WHITE;break;}m_AppleRecord = new int[8];for(int i = 0 ; i < 8 ; i++){m_AppleRecord[i] = 0;}m_IconSize = 0;}//取得色彩publicintGetColor(){return m_Color;}//设置金币数量publicvoidSetIconSize(int vIconSize){m_IconSize = vIconSize;}//取得金币数量publicintGetIconSize(){returnm_IconSize;}//增加金币数量publicvoidAddIcon(int vAddIconSize){m_IconSize += vAddIconSize;}//减少金币数量publicvoidDecIcon(){if(m_IconSize>0){m_IconSize--;}}//清空金币publicvoidCleanIcon(){m_IconSize = 0;}//设置对应的水果的数量publicvoidSetRecord(int vAppleIndex,int vRecord){m_AppleRecord[vAppleIndex] = vRecord;}publicintGetRecord(int vAppleIndex){return m_AppleRecord[vAppleIndex];}//增加对应的水果的数量publicvoidAddRecord(int vAppleIndex){if(m_IconSize > 0){m_AppleRecord[vAppleIndex]++;m_IconSize--;}}//清空对应的水果数量publicvoidCleanRecord(int vAppleIndex ){if(vAppleIndex >= 0){m_AppleRecord[vAppleIndex] = 0;}else{for(int i = 0 ; i < 8 ; i++){m_AppleRecord[i] = 0;}}}}

三.Apple.java:主游戏逻辑框架

package win.gam;import java.util.ArrayList;import java.util.HashMap;import java.util.Random;import win.gam.WinnerActivity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Typeface;import android.media.AudioManager;import android.media.MediaPlayer;import android.media.SoundPool;import android.os.Handler;import android.os.Message;public class Apple {private static final Bitmap Bitmap = null;finalintINITSTATE= 0;//初始状态finalintSETTINGSTATE= 1;//游戏设置finalintHELPSTATE= 2;//游戏帮助finalintGAMESTATE= 3;//游戏中finalintGAMEEXIT= 4;//游戏退出Bitmapm_WelcomeUI= null;//欢迎界面Bitmapm_BitMapArray[] = null;//位置finalintm_AppleBitMapSize = 17;//数量intm_GameState= INITSTATE;//初始状态floatm_HelpTextMinTop = 70;//帮助状态时的最小文字位置floatm_HelpTextTop = m_HelpTextMinTop;//帮助状态时的文字Y位置intm_Winsize[];//大WinnerActivity  winnerActivity;//视窗TileappleTileArray[];//水果格子floatm_ScreenWidth;//屏幕宽度floatm_ScreenHeight;//屏幕高度int m_TileCows = 8; //列数int m_TileRows  = 7;//行数,不算头尾intm_TileW = 30;//格子宽int m_TileH = 30;//格子高intm_Left=  0;//左上角Xintm_Top=  30;//左上角Yintm_TileCount = 0;//格子总数intm_AppleImageArray[];//水果图ID数组WinnerRecordm_WinnerRecord[];//玩家Paint m_WinnerPaint[];//创建画笔对象intm_WinnerSize    = 1;//玩家数量finalintm_MaxWinnerSize = 2;//最大玩家数量intm_CurrWinnerID  = 0;//当前玩家IDintm_InitIconSize  = 10;//初始金币数量intm_ShowIconHeight= 60;//显示玩家下注的高度intm_ShowIconTop= 0;//显示玩家下注时的位置intm_ShowStartBtnX = 0;//显示GO按钮的位置Xintm_ShowStartBtnY = 0;//显示GO按钮的位置Ydoublem_GameExitTime  = 0;//获取当前时间,单位为纳秒double  m_currenttime = 0;//记录当前时间doublem_starttime = 0;//开始的时间doublem_TimeLength = 0;//间隔时间intm_currentpathid = 0;  //路径IDdoublem_Timer= 1000;//每隔多久前进一次doublem_DecTimer= 10;//加速度doublem_MinTimer= 20;//最小时间间隔booleanm_bStartRun= false;//开始运动Matrixm_BackGroundMatrix  = new Matrix();Matrixm_CenterMatrix  = new Matrix();floatm_ScaleW= 1.0f;floatm_ScaleH= 1.0f;intm_HandIndex_apple= -1;//手的显示索引_对应水果intm_HandIndex_winner  = -1;//手的显示索引_对应玩家AppleThreadm_appleThread  = null;//水果线程MediaPlayer m_BackMusic;//背景音乐SoundPool m_SoundPool;//音效控制器HashMap<Integer,Integer>m_SoundPoolMap;//音效容器booleanm_SoundOpen= true;//音效开关booleanm_MusicOpen= true;//声音天并booleanm_QiQiuOpen= true;//是否弹出气球intm_RunNum= 0;//运行次数publicQiQium_QiQiu= null;//气球QiQiuThreadm_QiQiuThread= null;//气球线程publicbooleanm_QiQiuIsLive= false;//气球是否可用publicArrayList<FeiBiao> m_FeiBiaoArray = new ArrayList<FeiBiao>();//飞镖对象数组FeiBiaoThreadm_FeiBiaoThread= null;//飞镖线程intm_ShowBaoWu= -1;//宝物intm_WinnerAppleID= -1;//胜利者booleanm_ShowWinner= true;//显示胜利者Randomrandom  = new Random();//随机数intm_WinAllApple= 0;//0没意义,1所有水果都中奖,2中奖水果X2倍finalintm_WinAllAppleID= 777;//都中奖Paint m_UITitle= new Paint();//创建UI的标题画笔对象intm_UITitleHeight= 0;//创建UI时的标题字体大小Paint m_UIText= new Paint();//创建UI的文字画笔对象tintm_UITextHeight = 0;//创建UI的文字画笔字体大小//Paintm_UIText2= new Paint();//用来更新多线程的消息Handler myHandler = new Handler(){        public void handleMessage(Message msg)         {        if(msg.what == 1)        {//收到放气球的消息        PutOutQiQiu();        }         if(msg.what == 2)        {//返回主界面        m_GameState= INITSTATE ;        }         }}; //构造函数Apple(WinnerActivity Activity,int vScreenWidth,int vScreenHeight){winnerActivity = Activity;m_ScreenWidth  = vScreenWidth;//屏幕宽度m_ScreenHeight = vScreenHeight;//屏幕高度m_ScaleW= m_ScreenWidth/240.0f ;m_ScaleH= m_ScreenHeight/400.0f ;m_TileW = (int) (m_ScaleW * 30);//格子宽m_TileH = (int) (m_ScaleH * 32);//格子高m_Left=  (int) (0 * m_ScaleW);//左上角Xm_Top=  (int) (30* m_ScaleH);//左上角Ym_HelpTextMinTop = 70* m_ScaleH;//帮助状态时的最小文字位置m_HelpTextTop = m_HelpTextMinTop;//帮助状态时的文字Y位置InitApple(m_InitIconSize);}//初始化public void  InitApple(int vIconSize){      m_BackMusic = MediaPlayer.create(winnerActivity, R.raw.back);//背景音乐//m_IconSound = MediaPlayer.create(winnerActivity, R.raw.icon);//放金币的音乐m_SoundPool = new SoundPool(4,AudioManager.STREAM_MUSIC,100);m_SoundPoolMap = new HashMap<Integer,Integer>();m_SoundPoolMap.put(1, m_SoundPool.load(winnerActivity, R.raw.icon,1));//加金币m_SoundPoolMap.put(2, m_SoundPool.load(winnerActivity, R.raw.path,1));  //路径m_SoundPoolMap.put(3, m_SoundPool.load(winnerActivity, R.raw.fly,1));   //飞镖 m_SoundPoolMap.put(4, m_SoundPool.load(winnerActivity, R.raw.bomb,1));  //打破气球m_SoundOpen = true;m_MusicOpen = true;m_QiQiuOpen = true;//开始播放背景音乐if(true == m_MusicOpen){m_BackMusic.start();}//玩家管理器m_WinnerRecord = new WinnerRecord[m_MaxWinnerSize];m_WinnerPaint  = new Paint[m_MaxWinnerSize];for(int i = 0 ; i < m_MaxWinnerSize ; i++){//玩家m_WinnerRecord[i] = new WinnerRecord(i);m_WinnerRecord[i].SetIconSize(vIconSize);//字体m_WinnerPaint[i] = new Paint();String familyName_Player = "宋体";Typeface font_Player = Typeface.create(familyName_Player, Typeface.BOLD);m_WinnerPaint[i].setTypeface(font_Player);m_WinnerPaint[i].setColor(m_WinnerRecord[i].GetColor());//为画笔设置颜色m_WinnerPaint[i].setTextSize(16* m_ScaleH);//为画笔设置字体大小m_WinnerPaint[i].setAntiAlias(true);//设置抗锯齿 }m_WelcomeUI   = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.ui);//欢迎界面int tBitMapSize = 50;m_BitMapArray = new Bitmap[tBitMapSize];m_BitMapArray[0] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a1);//苹果0m_BitMapArray[1] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a2);//桔子1m_BitMapArray[2] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a3);//橄榄2m_BitMapArray[3] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a4);//铃铛3m_BitMapArray[4] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a5);//西瓜4m_BitMapArray[5] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a6);//双星5m_BitMapArray[6] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a7);//双7 6m_BitMapArray[7] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a8);//黑板 7m_BitMapArray[8] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.b1);//苹果 8m_BitMapArray[9] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.b2);//桔子 9m_BitMapArray[10] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.b3);//橄榄 10m_BitMapArray[11] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.b4);//铃铛 11m_BitMapArray[12] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.b5);//西瓜 12m_BitMapArray[13] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.b6);//双星 13m_BitMapArray[14] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.b7);//双7 14m_BitMapArray[15] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.b8);//黑板  15m_BitMapArray[16] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.a0);//招财进宝 16m_BitMapArray[17] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.gp);//绿点 17m_BitMapArray[18] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.rp);//红点 18m_BitMapArray[19] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.c1);//苹果 19m_BitMapArray[20] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.c2);//桔子 20m_BitMapArray[21] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.c3);//橄榄 21m_BitMapArray[22] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.c4);//铃铛22m_BitMapArray[23] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.c5);//西瓜 23m_BitMapArray[24] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.c6);//双星 24m_BitMapArray[25] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.c7);//双7 25m_BitMapArray[26] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.c8);//黑板26//手的类型m_BitMapArray[27] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.hand1);//黄手m_BitMapArray[28] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.hand2);//绿手m_BitMapArray[29] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.hand3);//蓝手m_BitMapArray[30] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.hand4);//白手//背景图m_BitMapArray[31] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.background1);//背景//GO按钮m_BitMapArray[32] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.go);//开始//金币m_BitMapArray[33] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.icon);//金币//气球m_BitMapArray[34] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.qq1);//气球1m_BitMapArray[35] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.qq2);//气球2m_BitMapArray[36] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.qq3);//气球3m_BitMapArray[37] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.qq4);//气球4m_BitMapArray[38] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.qq5);//气球5m_BitMapArray[39] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.qq6);//气球6//箭头m_BitMapArray[40] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.jt1);//箭头1右m_BitMapArray[41] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.jt1_2);//箭头1左m_BitMapArray[42] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.jt2);//箭头2右m_BitMapArray[43] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.jt2_2);//箭头2左//开始按钮m_BitMapArray[44] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.start);//开始按钮//设置按钮m_BitMapArray[45] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.setting);//设置按钮//帮助按钮m_BitMapArray[46] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.help);//帮助按钮//退出按钮m_BitMapArray[47] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.exit);//退出按钮//菜单按钮m_BitMapArray[48] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.menu);//菜单按钮//中奖钱袋m_BitMapArray[49] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.money);//中奖钱袋//胜数m_Winsize = new int[m_AppleBitMapSize];m_Winsize[0] = 5;m_Winsize[1] = 10;m_Winsize[2] = 15;m_Winsize[3] = 20;m_Winsize[4] = 20;m_Winsize[5] = 30;m_Winsize[6] = 40;m_Winsize[7] = 100;m_Winsize[8] = 2;m_Winsize[9] = 2;m_Winsize[10] = 2;m_Winsize[11] = 2;m_Winsize[12] = 2;m_Winsize[13] = 2;m_Winsize[14] = 2;m_Winsize[15] = 50;m_Winsize[16] = 0;m_bStartRun     = false;//设置缩放m_BackGroundMatrix.reset();floatbW1 = m_WelcomeUI.getWidth() ;floatbH1 = m_WelcomeUI.getHeight() ;floatbW2 = m_ScreenWidth ;floatbH2 = m_ScreenHeight;floattScaleW = bW2/bW1;floattScaleH = bH2/bH1;m_BackGroundMatrix.postScale(tScaleW, tScaleH);String familyName = "宋体";Typeface font = Typeface.create(familyName, Typeface.BOLD);m_UITitle.setTypeface(font);m_UITitle.setColor(Color.BLACK);//为画笔设置颜色m_UITitleHeight = (int) (20 * m_ScaleH);m_UITitle.setTextSize(m_UITitleHeight);//为画笔设置字体大小m_UITitle.setAntiAlias(true);//设置抗锯齿 String familyName2 = "宋体";Typeface font2 = Typeface.create(familyName2, Typeface.BOLD);m_UIText.setTypeface(font2);m_UIText.setColor(Color.BLACK);//为画笔设置颜色m_UITextHeight = (int) (16 * m_ScaleH);m_UIText.setTextSize(m_UITextHeight);//为画笔设置字体大小m_UIText.setAntiAlias(true);//设置抗锯齿 //创建一个气球m_QiQiu = new QiQiu();//创建气球线程m_QiQiuThread = new QiQiuThread(this);//创建飞标线程m_FeiBiaoThread = new FeiBiaoThread(this);//创建线程m_appleThread = new AppleThread(this);//启动线程StartThread();}//初始化游戏界面public void  InitGameUI(){if( 1 == m_WinnerSize ){m_ShowIconHeight = (int) (60 * m_ScaleH) ;}else{m_ShowIconHeight = (int) (80 * m_ScaleH) ;}m_ShowIconTop = (int) (m_ScreenHeight - m_ShowIconHeight);//显示玩家下注的位置高度m_CurrWinnerID = 0;m_InitIconSize = 10;//初始时10个金币m_RunNum = 0;m_CenterMatrix.reset();float bW1 = m_BitMapArray[31].getWidth() ;float bH1 = m_BitMapArray[31].getHeight() ;float bW2 = m_ScreenWidth ;float bH2 = m_ScreenHeight - m_ShowIconHeight;float tScaleW = bW2/bW1;float tScaleH = bH2/bH1;m_CenterMatrix.postScale(tScaleW, tScaleH);//计算格子行数与列数m_TileCows = (int) (m_ScreenWidth / m_TileW);m_TileRows = (int) ((m_ScreenHeight - m_Top - m_ShowIconHeight) / m_TileH - 2); //上下两行的要去掉//格子数量m_TileCount = m_TileCows * 2 + m_TileRows * 2;m_AppleImageArray = new int[m_TileCount];//先随机生成格子盘面for(int i = 0 ; i < m_TileCount ; i++){m_AppleImageArray[i] = random.nextInt(m_AppleBitMapSize);//起始位置if(m_AppleImageArray[i] == 7 || m_AppleImageArray[i] == 15){m_AppleImageArray[i] = 0;continue;}else if(m_AppleImageArray[i] == 6||m_AppleImageArray[i] == 14){m_AppleImageArray[i] = 0;continue;}else if(m_AppleImageArray[i] == 5||m_AppleImageArray[i] == 13){m_AppleImageArray[i] = 0;continue;}else if(m_AppleImageArray[i] == 4||m_AppleImageArray[i] == 12){m_AppleImageArray[i] = 0;continue;}}//两边中央必须是招财进宝inttTheTileIndex = m_TileCows + m_TileRows / 2;m_AppleImageArray[tTheTileIndex] = 16 ;tTheTileIndex = 2 * (m_TileCows + m_TileRows) - m_TileRows / 2;m_AppleImageArray[tTheTileIndex] = 16 ;//上边中央必须是大小黑板tTheTileIndex =  m_TileCows / 2;m_AppleImageArray[tTheTileIndex-1] = 15 ;m_AppleImageArray[tTheTileIndex] = 7 ;//下边中央必须是大小七tTheTileIndex =  2 * m_TileCows + m_TileRows - m_TileCows / 2;m_AppleImageArray[tTheTileIndex+1] = 14 ;m_AppleImageArray[tTheTileIndex] = 6 ;//右上角下边必须是大小西瓜tTheTileIndex =  m_TileCows ;m_AppleImageArray[tTheTileIndex] =  4;m_AppleImageArray[tTheTileIndex+1] = 12 ;//左下角上边必须是大小星tTheTileIndex =  2 * m_TileCows + m_TileRows ;m_AppleImageArray[tTheTileIndex] =  5;m_AppleImageArray[tTheTileIndex+1] = 13 ;//左上角是苹果m_AppleImageArray[0] = 0 ;//左1是小苹果m_AppleImageArray[1] = 8 ;//右上角是桔子m_AppleImageArray[m_TileCows-1] = 1 ;m_AppleImageArray[m_TileCows-2] = 9 ;//左下角是橄榄m_AppleImageArray[2 * m_TileCows + m_TileRows-1] = 2 ;m_AppleImageArray[2 * m_TileCows + m_TileRows-2] = 10 ;//右下角是铃铛m_AppleImageArray[m_TileCows + m_TileRows] = 3 ;m_AppleImageArray[m_TileCows + m_TileRows+1] = 11 ;//生成格子appleTileArray = new Tile[m_TileCount];for(int i = 0 ; i < m_TileCount ; i++){appleTileArray[i] =  new Tile();inttImageIndex = m_AppleImageArray[i];appleTileArray[i].SetImage(tImageIndex,m_BitMapArray[tImageIndex]);}//上行int tCount = 0;for(int i = 0 ; i < m_TileCows ; i++){appleTileArray[tCount].SetTile(i*m_TileW+m_Left,m_Top);tCount++;}//右列for(int i = 0 ; i < m_TileRows ; i++){appleTileArray[tCount].SetTile((m_TileCows-1)*m_TileW+m_Left,(i+1)*m_TileH+m_Top);tCount++;}//下行for(int i = m_TileCows-1 ; i >= 0  ; i--){appleTileArray[tCount].SetTile(i*m_TileW+m_Left,(m_TileRows+1)*m_TileH+m_Top);tCount++;}//左列for(int i = m_TileRows-1 ; i >= 0  ; i--){appleTileArray[tCount].SetTile(m_Left,(i+1)*m_TileH+m_Top);tCount++;}m_starttime = System.nanoTime();//获取当前时间,单位为纳秒m_Timer= 500;//每隔多久前进一次m_DecTimer= 40;//加速度m_MinTimer= 0;//最小时间间隔m_currentpathid = random.nextInt(m_TileCount);//起始位置}//退出释放public void Release(){m_BackMusic.stop();m_BackMusic = null;m_SoundPool.stop(m_SoundPoolMap.get(1));m_SoundPool.stop(m_SoundPoolMap.get(2));m_SoundPool.stop(m_SoundPoolMap.get(3));m_SoundPool.stop(m_SoundPoolMap.get(4));m_SoundPool = null;m_SoundOpen = false;m_MusicOpen = false;}//取得屏幕宽度public floatGetScreenWidth(){return m_ScreenWidth ;}//取得屏幕高度public floatGetScreenHeight(){return m_ScreenHeight;}//播放音效public voidPlaySound(int sound,int loop){     if(true == m_SoundOpen){AudioManager mgr = (AudioManager)winnerActivity.getSystemService(Context.AUDIO_SERVICE);float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);float volume = streamVolumeCurrent / streamVolumeMax;//播放音效m_SoundPool.play(m_SoundPoolMap.get(sound), volume, volume, 1, loop, 1f);}}//设置玩家人数public void  SetWinnerSize(int vWinnerSize){m_WinnerSize = vWinnerSize;}//打开气球public void  EnableQiQiu(boolean vQiQiuOpen){m_QiQiuOpen = vQiQiuOpen ;}//打开音效public void  EnableSound(boolean vSoundOpen){m_SoundOpen = vSoundOpen;}//打开音乐public void  EnableMusic(boolean vMusicOpen){m_MusicOpen = vMusicOpen;if(true == m_MusicOpen){m_BackMusic.start();}else{m_BackMusic.pause();}}//播放金币声音public void  PlayIconSound(){        PlaySound(1,0);}//播放路径声音public void  PlayPathSound(){        PlaySound(2,0);}//播放飞镖声音public void  PlayFeiBiaoSound(){        PlaySound(3,0);}//播放打破气球声音public void  PlayBombSound(){        PlaySound(4,0);}//改变窗口大小public void  ChangeWindowSize(int vScreenWidth,int vScreenHeight){m_ScreenWidth  = vScreenWidth;//屏幕宽度m_ScreenHeight = vScreenHeight;//屏幕高度//屏幕高度m_ScaleW= m_ScreenWidth/240.0f ;m_ScaleH= m_ScreenHeight/400.0f ;m_TileW = (int) (m_ScaleW * 30);//格子宽m_TileH = (int) (m_ScaleH * 32);//格子高m_HelpTextMinTop = (int) (70* m_ScaleH);//帮助状态时的最小文字位置m_HelpTextTop = m_HelpTextMinTop;//帮助状态时的文字Y位置m_BackGroundMatrix.reset();floatbW1 = m_WelcomeUI.getWidth() ;floatbH1 = m_WelcomeUI.getHeight() ;floatbW2 = m_ScreenWidth ;floatbH2 = m_ScreenHeight;floattScaleW = bW2/bW1;float tScaleH = bH2/bH1;m_BackGroundMatrix.postScale(tScaleW, tScaleH);m_CenterMatrix.reset();bW1 = m_BitMapArray[31].getWidth() ;bH1 = m_BitMapArray[31].getHeight() ;bW2 = m_ScreenWidth ;bH2 = m_ScreenHeight - m_ShowIconHeight;tScaleW = bW2/bW1;tScaleH = bH2/bH1;m_CenterMatrix.postScale(tScaleW, tScaleH);}//开始线程public void  StartThread(){if(!m_appleThread.isAlive()){m_appleThread.start();}}//退出线程public void  ExitThread(){m_appleThread.Exit();m_appleThread = null;//释放Release();}//更新public void  Update(){if(GAMEEXIT == m_GameState){m_currenttime = System.nanoTime();//获取当前时间,单位为纳秒m_TimeLength = (double)((m_currenttime - m_GameExitTime)/1000/1000);//毫秒if(m_TimeLength > 3000){winnerActivity.finish();}}//游戏帮助else if(HELPSTATE == m_GameState){m_HelpTextTop  -= 0.5f;}else if(GAMESTATE == m_GameState){//游戏开始状态if(true == m_bStartRun){m_currenttime = System.nanoTime();//获取当前时间,单位为纳秒m_TimeLength = (double)((m_currenttime - m_starttime)/1000/1000);//毫秒//加速变化if( m_TimeLength > m_Timer ){m_Timer -= m_DecTimer ;//加速到终点if(m_Timer < m_MinTimer){m_DecTimer = -m_DecTimer;}else if(m_Timer >= 1000){//减到到终点m_DecTimer = -m_DecTimer;m_Timer = 1000;m_starttime = m_currenttime ;m_currentpathid++;m_currentpathid = (m_currentpathid)%m_TileCount;//播放放金币声音PlayPathSound();//计算胜利结果CalculateWinner();m_bStartRun = false;m_ShowBaoWu = -1;return ;}m_starttime = m_currenttime ;m_currentpathid++;m_currentpathid = (m_currentpathid)%m_TileCount;//如果是招财进宝,则放气球inttCurrentImageId = appleTileArray[m_currentpathid].GetImageID() ;if( tCurrentImageId == 16){myHandler.sendEmptyMessage(1);//发送放气球的消息}}}else{if(m_WinnerAppleID >= 0){m_currenttime = System.nanoTime();//获取当前时间,单位为纳秒m_TimeLength = (double)((m_currenttime - m_starttime)/1000/1000);//毫秒if( m_TimeLength > 500 ){m_ShowWinner = !m_ShowWinner;m_starttime = m_currenttime ;}}}}}//渲染public void  Draw(Canvas canvas,Paint paint){//退出状态if(GAMEEXIT == m_GameState){intcenterBitmapW = m_BitMapArray[31].getWidth();intcenterBitmapH = m_BitMapArray[31].getHeight();BitmapcenterBitmap = Bitmap.createBitmap(m_BitMapArray[31],0,0,centerBitmapW,centerBitmapH,m_BackGroundMatrix,true);canvas.save();canvas.drawBitmap(centerBitmap, 0 , 0 , paint );canvas.restore();//=================="游戏人数设置====================================String text = "正退出游戏。。。";canvas.drawText(text, m_ScreenWidth /2 - 50*m_ScaleW, 40 * m_ScaleH, m_UITitle) ;return ;}//初始状态if(INITSTATE == m_GameState){intcenterBitmapW = m_WelcomeUI.getWidth();intcenterBitmapH = m_WelcomeUI.getHeight();BitmapcenterBitmap = Bitmap.createBitmap(m_WelcomeUI,0,0,centerBitmapW,centerBitmapH,m_BackGroundMatrix,true);canvas.save();canvas.drawBitmap(centerBitmap, 0 , 0 , paint );canvas.restore();//按钮inttBtnLeft = 20;inttBtnHeight = (int) (m_BitMapArray[ 44 ].getHeight()+3 * m_ScaleH);inttBtnTop  = (int) (m_ScreenHeight - 4*(tBtnHeight+2)) ;for(int i = 0 ; i < 4 ; i++){canvas.drawBitmap(m_BitMapArray[ 44 + i ], tBtnLeft + i * 40 * m_ScaleW , tBtnTop + i * tBtnHeight , paint );}return ;}//SETTINGSTATE= 1;//游戏设置if(SETTINGSTATE == m_GameState){intcenterBitmapW = m_BitMapArray[31].getWidth();intcenterBitmapH = m_BitMapArray[31].getHeight();BitmapcenterBitmap = Bitmap.createBitmap(m_BitMapArray[31],0,0,centerBitmapW,centerBitmapH,m_BackGroundMatrix,true);canvas.save();canvas.drawBitmap(centerBitmap, 0 , 0 , paint );canvas.restore();//=================="游戏人数设置====================================String text = "游 戏 设 置";canvas.drawText(text, m_ScreenWidth /2 - 50*m_ScaleW, 40 * m_ScaleH, m_UITitle) ;m_UIText.setColor(Color.BLACK);text = "游戏人数设置:";canvas.drawText(text, 20*m_ScaleW, 70 * m_ScaleH, m_UITitle) ;inttShowConfig1 = (int) (100 * m_ScaleH);int tHalfUITextHeight = m_UITextHeight / 2 ;if( 1 ==  m_WinnerSize){canvas.drawBitmap(m_BitMapArray[18], 40*m_ScaleW , tShowConfig1 , paint );text = "单人";canvas.drawText(text, 70*m_ScaleW, tShowConfig1 + tHalfUITextHeight , m_UIText) ;canvas.drawBitmap(m_BitMapArray[17], 120*m_ScaleW , tShowConfig1 , paint );text = "双人";canvas.drawText(text, 150*m_ScaleW, tShowConfig1 + tHalfUITextHeight, m_UIText) ;}else{canvas.drawBitmap(m_BitMapArray[17], 40*m_ScaleW , tShowConfig1 , paint );text = "单人";canvas.drawText(text, 70*m_ScaleW, tShowConfig1 + tHalfUITextHeight, m_UIText) ;canvas.drawBitmap(m_BitMapArray[18], 120*m_ScaleW , tShowConfig1 , paint );text = "双人";canvas.drawText(text, 150*m_ScaleW, tShowConfig1 + tHalfUITextHeight, m_UIText) ;}//================气球飞镖设置======================================text = "弹出气球设置:";canvas.drawText(text, 20*m_ScaleW, 140 * m_ScaleH, m_UITitle) ;inttShowConfig2 = (int) (170 * m_ScaleH);if( true ==  m_QiQiuOpen){canvas.drawBitmap(m_BitMapArray[18], 40*m_ScaleW , tShowConfig2 , paint );text = "开";canvas.drawText(text, 70*m_ScaleW, tShowConfig2 + tHalfUITextHeight, m_UIText) ;canvas.drawBitmap(m_BitMapArray[17], 120*m_ScaleW , tShowConfig2 , paint );text = "关";canvas.drawText(text, 150*m_ScaleW, tShowConfig2 + tHalfUITextHeight, m_UIText) ;}else{canvas.drawBitmap(m_BitMapArray[17], 40*m_ScaleW , tShowConfig2 , paint );text = "开";canvas.drawText(text, 70*m_ScaleW, tShowConfig2 + tHalfUITextHeight, m_UIText) ;canvas.drawBitmap(m_BitMapArray[18], 120*m_ScaleW , tShowConfig2 , paint );text = "关";canvas.drawText(text, 150*m_ScaleW, tShowConfig2 + tHalfUITextHeight, m_UIText) ;}//=================游戏音效设置=====================================text = "游戏音效设置:";canvas.drawText(text, 20*m_ScaleW, 210 * m_ScaleH, m_UITitle) ;inttShowConfig3 = (int) (240 * m_ScaleH);if( true ==  m_SoundOpen){canvas.drawBitmap(m_BitMapArray[18], 40*m_ScaleW , tShowConfig3 , paint );text = "开";canvas.drawText(text, 70*m_ScaleW, tShowConfig3 + tHalfUITextHeight, m_UIText) ;canvas.drawBitmap(m_BitMapArray[17], 120*m_ScaleW , tShowConfig3 , paint );text = "关";canvas.drawText(text, 150*m_ScaleW, tShowConfig3 + tHalfUITextHeight, m_UIText) ;}else{canvas.drawBitmap(m_BitMapArray[17], 40*m_ScaleW , tShowConfig3 , paint );text = "开";canvas.drawText(text, 70*m_ScaleW, tShowConfig3 + tHalfUITextHeight, m_UIText) ;canvas.drawBitmap(m_BitMapArray[18], 120*m_ScaleW , tShowConfig3 , paint );text = "关";canvas.drawText(text, 150*m_ScaleW, tShowConfig3 + tHalfUITextHeight, m_UIText) ;}//================背景音乐设置======================================text = "背景音乐设置:";canvas.drawText(text, 20*m_ScaleW, 280 * m_ScaleH, m_UITitle) ;inttShowConfig4 = (int) (310 * m_ScaleH);if( true ==  m_MusicOpen){canvas.drawBitmap(m_BitMapArray[18], 40*m_ScaleW , tShowConfig4 , paint );text = "开";canvas.drawText(text, 70*m_ScaleW, tShowConfig4 + tHalfUITextHeight, m_UIText) ;canvas.drawBitmap(m_BitMapArray[17], 120*m_ScaleW , tShowConfig4 , paint );text = "关";canvas.drawText(text, 150*m_ScaleW, tShowConfig4 + tHalfUITextHeight, m_UIText) ;}else{canvas.drawBitmap(m_BitMapArray[17], 40*m_ScaleW , tShowConfig4 , paint );text = "开";canvas.drawText(text, 70*m_ScaleW, tShowConfig4 + tHalfUITextHeight, m_UIText) ;canvas.drawBitmap(m_BitMapArray[18], 120*m_ScaleW , tShowConfig4 , paint );text = "关";canvas.drawText(text, 150*m_ScaleW, tShowConfig4 + tHalfUITextHeight, m_UIText) ;}inttShowConfig5 = (int) (m_ScreenHeight - 30);text = "返回主界面";canvas.drawText(text, m_ScreenWidth /2 - 54*m_ScaleW, tShowConfig5, m_UITitle) ;return ;}//游戏帮助if(HELPSTATE == m_GameState){intcenterBitmapW = m_BitMapArray[31].getWidth();intcenterBitmapH = m_BitMapArray[31].getHeight();BitmapcenterBitmap = Bitmap.createBitmap(m_BitMapArray[31],0,0,centerBitmapW,centerBitmapH,m_BackGroundMatrix,true);canvas.save();canvas.drawBitmap(centerBitmap, 0 , 0 , paint );canvas.restore();String text = "游  戏  帮  助";canvas.drawText(text, m_ScreenWidth /2 - 50*m_ScaleW, 40*m_ScaleH, m_UITitle) ;m_UIText.setColor(Color.BLACK);//为画笔设置颜色inttAreaHeight = (int) ( m_ScreenHeight - m_HelpTextMinTop + 80);floattHeight = m_HelpTextTop - (tAreaHeight - 20);tHeight += 90 * m_ScaleH ;{float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "进入游戏后开始下注, ";canvas.drawText(text, 70*m_ScaleW, tRealPosY, m_UIText) ;}}tHeight += 30* m_ScaleH;{float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "在最下方水果上点击进行下注,";canvas.drawText(text, 5*m_ScaleW, tRealPosY, m_UIText) ;}}tHeight += 30* m_ScaleH;{float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "点击";canvas.drawText(text, 5*m_ScaleW, tRealPosY, m_UIText) ;text = " 按钮可以开始游戏转动,";canvas.drawText(text, 72*m_ScaleW, tRealPosY, m_UIText) ;canvas.drawBitmap(m_BitMapArray[32], 42*m_ScaleW, tRealPosY - 18* m_ScaleH ,paint );}}tHeight += 30* m_ScaleH;{float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "金币用完后,点击";canvas.drawText(text, 5*m_ScaleW, tRealPosY, m_UIText) ;text = " 可以投入";canvas.drawText(text, 165*m_ScaleW, tRealPosY, m_UIText) ;canvas.drawBitmap(m_BitMapArray[33], 140*m_ScaleW, tRealPosY - 15* m_ScaleH ,paint );}}tHeight += 30* m_ScaleH;{float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "一个金币继续游戏,转动时经过";canvas.drawText(text, 5*m_ScaleW, tRealPosY, m_UIText) ;}}tHeight += 30* m_ScaleH;{float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "图块时会从底部放出气球";canvas.drawText(text, 40*m_ScaleW, tRealPosY, m_UIText) ;canvas.drawBitmap(m_BitMapArray[16], 10*m_ScaleW, tRealPosY - 15* m_ScaleH ,paint );}}tHeight += 30* m_ScaleH;{float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = ",点击下注水果图片可以使左右两";canvas.drawText(text, 5*m_ScaleW, tRealPosY, m_UIText) ;}}tHeight += 30* m_ScaleH;{float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "排相应水果释放 ";canvas.drawText(text, 5*m_ScaleW, tRealPosY, m_UIText) ;text = " ,击中";canvas.drawText(text, 150*m_ScaleW, tRealPosY, m_UIText) ;canvas.drawBitmap(m_BitMapArray[40], 120*m_ScaleW, tRealPosY - 15* m_ScaleH ,paint );canvas.drawBitmap(m_BitMapArray[34], 205*m_ScaleW, tRealPosY - 15* m_ScaleH ,paint );}}tHeight += 30* m_ScaleH;//if(tHeight > m_HelpTextMinTop){float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "会有意想不到的奖励哦。";canvas.drawText(text, 5*m_ScaleW, tRealPosY, m_UIText) ;}}tHeight += 30* m_ScaleH;m_UIText.setColor(Color.BLUE);//为画笔设置颜色//if(tHeight > m_HelpTextMinTop){float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "开发者:红孩儿安卓游戏乐园";canvas.drawText(text, 30*m_ScaleW, tRealPosY, m_UIText) ;}}tHeight += 30* m_ScaleH;//if(tHeight > m_HelpTextMinTop){/*float   tRealPosY = (m_ScreenHeight-90* m_ScaleH)+(int)(tHeight)%tAreaHeight;if(tRealPosY > m_HelpTextMinTop && tRealPosY < (m_ScreenHeight - 90* m_ScaleH)){text = "QQ群:205100149";canvas.drawText(text, 30*m_ScaleW, tRealPosY, m_UIText) ;}*/}inttShowConfig4 = (int) (m_ScreenHeight - 30*m_ScaleH);text = "返回主界面";canvas.drawText(text, m_ScreenWidth /2 - 54*m_ScaleW, tShowConfig4, m_UITitle) ;m_UIText.setColor(Color.BLACK);return ;}//=========================游戏主界面显示===========================================//背景图//===========================================================intcenterBitmapW = m_BitMapArray[31].getWidth();intcenterBitmapH = m_BitMapArray[31].getHeight();BitmapcenterBitmap = Bitmap.createBitmap(m_BitMapArray[ 31 ],0,0,centerBitmapW,centerBitmapH,m_CenterMatrix,true);canvas.save();canvas.drawBitmap(centerBitmap, 0 , 0 , paint );canvas.restore();//===========================================================//canvas.drawBitmap(m_BitMapArray[31], 0, 0 ,paint );//显示玩家金币情况for(int i = 0 ; i < m_WinnerSize ; i++){canvas.drawBitmap(m_BitMapArray[33], 8 + i * 100, 5 ,paint );int     tIconSize = m_WinnerRecord[i].GetIconSize();Stringtext = ""+tIconSize;canvas.drawText(text,( 8  + i * 100   + 30) * m_ScaleW , 20 * m_ScaleH, m_WinnerPaint[i]) ;}//显示返回菜单intmenuBitMapW = m_BitMapArray[48].getWidth();canvas.drawBitmap(m_BitMapArray[48],m_ScreenWidth - menuBitMapW - 5 , 2 * m_ScaleH ,paint );//显示水果种类与胜利数量Paint TextPaint = new Paint();//创建画笔对象String familyName = "宋体";Typeface font = Typeface.create(familyName, Typeface.BOLD);TextPaint.setTypeface(font);TextPaint.setColor(Color.RED);//为画笔设置颜色TextPaint.setTextSize(16* m_ScaleH);//为画笔设置字体大小TextPaint.setAntiAlias(true);//设置抗锯齿 for(int i = 0 ; i < m_TileCows ; i++){int index = m_TileCows - 1 - i;String text = ""+ m_Winsize[index];if(i == m_TileCows - 1 ){canvas.drawText(text, i * m_TileW + 5 * m_ScaleW + m_Left, m_ScreenHeight - m_ShowIconHeight + 10* m_ScaleH, TextPaint) ;}else{canvas.drawText(text, i * m_TileW + m_Left, m_ScreenHeight - m_ShowIconHeight + 10* m_ScaleH, TextPaint) ;}canvas.drawBitmap(m_BitMapArray[index], i * m_TileW +m_Left, m_ScreenHeight - m_ShowIconHeight + 10* m_ScaleH ,paint );}//开始按钮if(false == m_bStartRun){int tBtnW = m_BitMapArray[32].getWidth();int tBtnH = m_BitMapArray[32].getHeight();m_ShowStartBtnX = (int) ((m_ScreenWidth - tBtnW)/2);//显示GO按钮的位置Xm_ShowStartBtnY = (int) ((m_ScreenHeight - tBtnH)/2 + 20 * m_ScaleH);//显示GO按钮的位置Ycanvas.drawBitmap(m_BitMapArray[32], m_ShowStartBtnX, m_ShowStartBtnY ,paint );String familyName2 = "黑体";Typeface font2 = Typeface.create(familyName2, Typeface.BOLD);Paint TextPaint2 = new Paint();//创建画笔对象TextPaint2.setTypeface(font2);TextPaint2.setColor(Color.BLACK);//为画笔设置颜色TextPaint2.setTextSize(16* m_ScaleH);//为画笔设置字体大小TextPaint2.setAntiAlias(true);//设置抗锯齿 if(m_WinnerSize == 1){String text = "开始下注";canvas.drawText(text, m_ShowStartBtnX - 26* m_ScaleW , m_ShowStartBtnY + 50* m_ScaleH, TextPaint2) ;}else{if( m_CurrWinnerID >= 0 ){String text = "" + (m_CurrWinnerID + 1) + "号玩家下注";canvas.drawText(text, m_ShowStartBtnX - 36* m_ScaleW , m_ShowStartBtnY + 60* m_ScaleH, TextPaint2) ;}}}//中间显示//当前的图像IDinttCurrentImageId = appleTileArray[m_currentpathid].GetImageID() ;if( tCurrentImageId == 16){int tShowCurrentImageW = m_BitMapArray[tCurrentImageId].getWidth();int tShowCurrentImageH = m_BitMapArray[tCurrentImageId].getHeight();inttShowCurrentImageX = (int) (m_ShowStartBtnX - tShowCurrentImageW); int tShowCurrentImageY = (int) (m_ShowStartBtnY - tShowCurrentImageH - 10 * m_ScaleH);canvas.drawBitmap(m_BitMapArray[tCurrentImageId], tShowCurrentImageX , tShowCurrentImageY, paint );if( false == m_bStartRun ){Paint TextPaint2 = new Paint();//创建画笔对象String familyName2 = "黑体";Typeface font2 = Typeface.create(familyName2, Typeface.BOLD);TextPaint2.setTypeface(font2);TextPaint2.setColor(Color.RED);//为画笔设置颜色TextPaint2.setTextSize(32* m_ScaleH);//为画笔设置字体大小TextPaint2.setAntiAlias(true);//设置抗锯齿 String text = "X"+ m_Winsize[tCurrentImageId];canvas.drawText(text, tShowCurrentImageX + tShowCurrentImageW + 10 * m_ScaleW  , tShowCurrentImageY + tShowCurrentImageH, TextPaint2) ;}}else{int tShowCurrentImageW = m_BitMapArray[tCurrentImageId].getWidth();int tShowCurrentImageH = m_BitMapArray[tCurrentImageId].getHeight();inttShowCurrentImageX = (int) (m_ShowStartBtnX - tShowCurrentImageW); int tShowCurrentImageY = (int) (m_ShowStartBtnY - tShowCurrentImageH - 10 * m_ScaleH);inttGetIconSize = m_Winsize[tCurrentImageId] ;tCurrentImageId = tCurrentImageId % 8 ;canvas.drawBitmap(m_BitMapArray[tCurrentImageId], tShowCurrentImageX , tShowCurrentImageY , paint );//普通图像if( false == m_bStartRun ){Paint TextPaint2 = new Paint();//创建画笔对象String familyName2 = "黑体";Typeface font2 = Typeface.create(familyName2, Typeface.BOLD);TextPaint2.setTypeface(font2);TextPaint2.setColor(Color.RED);//为画笔设置颜色TextPaint2.setTextSize(32* m_ScaleH);//为画笔设置字体大小TextPaint2.setAntiAlias(true);//设置抗锯齿 String text = "X"+ tGetIconSize;canvas.drawText(text,  tShowCurrentImageX + tShowCurrentImageW + 10 * m_ScaleW , tShowCurrentImageY + tShowCurrentImageH, TextPaint2) ;}}//显示奖励if(m_ShowBaoWu >= 0){Paint TextPaint2 = new Paint();//创建画笔对象String familyName2 = "黑体";Typeface font2 = Typeface.create(familyName2, Typeface.BOLD);TextPaint2.setTypeface(font2);TextPaint2.setColor(Color.RED);//为画笔设置颜色TextPaint2.setTextSize(20* m_ScaleH);//为画笔设置字体大小TextPaint2.setAntiAlias(true);//设置抗锯齿 inttShowText_X = (int) (m_ScreenWidth / 2 );int tShowText_Y = (int) (m_ScreenHeight/ 2 + 30 * m_ScaleH);switch(m_ShowBaoWu){case 0://增加一个金币{String text = "增加一个金币";tShowText_X -= 70;canvas.drawText(text, tShowText_X , tShowText_Y, TextPaint2) ;}break;case 1://扣除一个金币{String text = "扣除一个金币";tShowText_X -= 70;canvas.drawText(text, tShowText_X , tShowText_Y, TextPaint2) ;}break;case 2://增加二个金币{String text = "增加二个金币";tShowText_X -= 70;canvas.drawText(text, tShowText_X , tShowText_Y, TextPaint2) ;}break;case 3://扣除二个金币{String text = "扣除二个金币";tShowText_X -= 70;canvas.drawText(text, tShowText_X , tShowText_Y, TextPaint2) ;}break;case 4://再持续一圈{String text = "再发力转动";tShowText_X -= 60;canvas.drawText(text, tShowText_X , tShowText_Y, TextPaint2) ;}break;case 5://停下来{String text = "停下来";tShowText_X -= 40;canvas.drawText(text, tShowText_X , tShowText_Y, TextPaint2) ;}break;case 6://所有水果都中奖{String text = "所有水果都中奖";tShowText_X -= 75;canvas.drawText(text, tShowText_X , tShowText_Y, TextPaint2) ;}break;case 7://中奖水果X2倍奖金{String text = "中奖水果X2倍奖金";tShowText_X -= 100;canvas.drawText(text, tShowText_X , tShowText_Y, TextPaint2) ;}break;}}//显示当前位置格子背景appleTileArray[m_currentpathid].DrawBack(canvas,m_RunNum%4);//格子元素显示for(int i = 0 ; i < m_TileCount ; i++){appleTileArray[i].OnDraw(canvas,paint);}/*// ===============================小珠显示============================================//左上角canvas.drawBitmap(m_BitMapArray[17], 25+m_Left,25+m_Top, paint);//右上角canvas.drawBitmap(m_BitMapArray[17], (m_TileCows-1)*m_TileW-10+m_Left,25+m_Top, paint);//左下角canvas.drawBitmap(m_BitMapArray[17], 25+m_Left,(m_TileRows+1)*m_TileH - 12+m_Top, paint);//右下角canvas.drawBitmap(m_BitMapArray[17], (m_TileCows-1)*m_TileW-10+m_Left,(m_TileRows+1)*m_TileH - 12+m_Top, paint);//其它for(int i = 1 ; i < m_TileCows-1 ; i++){//上行canvas.drawBitmap(m_BitMapArray[17], i*m_TileW+5+m_Left,25+m_Top, paint);//下行canvas.drawBitmap(m_BitMapArray[17], i*m_TileW+5+m_Left,(m_TileRows+1)*m_TileH - 12+m_Top  , paint);}for(int i = 0 ; i < m_TileRows ; i++){//右列canvas.drawBitmap(m_BitMapArray[17],(m_TileCows-1) * m_TileW-5+m_Left,(i + 1)* m_TileH + 5+m_Top, paint);//左行canvas.drawBitmap(m_BitMapArray[17], 20+m_Left,(i + 1) * m_TileH + 5+m_Top, paint);}//红珠int     tPathIndex = m_currentpathid;if(0 == tPathIndex){//左上角canvas.drawBitmap(m_BitMapArray[18], 25+m_Left,25+m_Top, paint);}else if(7 == tPathIndex){//左上角canvas.drawBitmap(m_BitMapArray[18], (m_TileCows-1)*m_TileW-10+m_Left,25+m_Top, paint);}else if(15 == tPathIndex){//右下角canvas.drawBitmap(m_BitMapArray[18], (m_TileCows-1)*m_TileW-10+m_Left,(m_TileRows+1)*m_TileH - 12+m_Top, paint);}else if(22 == tPathIndex){//左下角canvas.drawBitmap(m_BitMapArray[18], 25+m_Left,(m_TileRows+1)*m_TileH - 12+m_Top, paint);}else{if(0 < tPathIndex && tPathIndex < 7){//上行canvas.drawBitmap(m_BitMapArray[18], tPathIndex*m_TileW+5+m_Left,25+m_Top, paint);}else if(7 < tPathIndex && tPathIndex < 15){//右列int tIndex = tPathIndex - 8 ;canvas.drawBitmap(m_BitMapArray[18],(m_TileCows-1) * m_TileW-5+m_Left,(tIndex + 1)* m_TileH + 5+m_Top, paint);}else if(15 < tPathIndex && tPathIndex < 22){//下行int tIndex = (22 - tPathIndex);canvas.drawBitmap(m_BitMapArray[18], tIndex*m_TileW+5+m_Left,(m_TileRows+1)*m_TileH - 12+m_Top  , paint);}else {//左行int tIndex = (29 - tPathIndex) ;canvas.drawBitmap(m_BitMapArray[18], 20+m_Left,(tIndex + 1) * m_TileH + 5+m_Top, paint);}}// ===========================================================================*/if(true == m_QiQiuOpen){//显示气球if(true == m_QiQiuIsLive){//气球显示m_QiQiu.OnDraw(canvas,TextPaint);}//遍历飞镖列表,绘制每个飞镖对象for( FeiBiao fb:m_FeiBiaoArray){fb.OnDraw(canvas,TextPaint);}}//显示玩家下注情况for(int i = 0 ; i < m_TileCows ; i++){for(int j = 0 ; j < m_WinnerSize ; j++){int tLeft = (int) (i * m_TileW + 1* m_ScaleW);int tTop = (int) (m_ShowIconTop + 40* m_ScaleH + j * 20* m_ScaleH) ;int tRight = (int) (tLeft + m_TileW - 1* m_ScaleW);int tBottom = (int) (tTop + 20* m_ScaleH - 1);//背景canvas.drawRect(tLeft,tTop,tRight,tBottom, m_WinnerPaint[j]);inttappleIndex = m_TileCows-1-i;//取得是否有下注int tRecordSize = m_WinnerRecord[j].GetRecord(tappleIndex);if( tRecordSize > 0 ){if( (m_WinnerAppleID == tappleIndex || m_WinnerAppleID == m_WinAllAppleID )&& false == m_ShowWinner){}else{//数字String text = " " + tRecordSize;canvas.drawText(text, tLeft+4* m_ScaleW, tBottom-3* m_ScaleH, TextPaint) ;}}else{//数字String text = " " + tRecordSize;canvas.drawText(text, tLeft+4* m_ScaleW , tBottom-3* m_ScaleH, TextPaint) ;}}}//显示钱袋if( m_WinnerAppleID >= 0){if(true == m_ShowWinner){int tShowMoneW = m_BitMapArray[49].getWidth();int tShowMoneH = m_BitMapArray[49].getHeight();inttShowMoneyX = (int) ((m_ScreenWidth - tShowMoneW)/2);//显示钱袋的位置XinttShowMoneyY = (int) ((m_ScreenHeight - tShowMoneH)/2);//显示钱袋的位置Ycanvas.drawBitmap(m_BitMapArray[49], tShowMoneyX, tShowMoneyY - 35* m_ScaleH ,paint );}}/*//显示手if(m_HandIndex_apple >= 0){int tLeft = m_HandIndex_apple * m_TileW ;int tTop = m_ShowIconTop + m_HandIndex_winner * 20 + 40;canvas.drawBitmap(m_BitMapArray[27+m_HandIndex_winner], tLeft,tTop, paint);}*/}//设置游戏publicboolean  GameConfig(float mouseX,float mouseY){//如果是游戏设置状态if(SETTINGSTATE == m_GameState){if(mouseY < 120*m_ScaleH){//单双人if(mouseX < 120*m_ScaleW){SetWinnerSize(1);}else{SetWinnerSize(2);}}else if(mouseY < 190*m_ScaleH){//气球if(mouseX < 120*m_ScaleW){EnableQiQiu(true);}else{EnableQiQiu(false);}}else if(mouseY < 260*m_ScaleH){//音效if(mouseX < 120*m_ScaleW){EnableSound(true);}else{EnableSound(false);}}else if(mouseY < 330*m_ScaleH){//音乐if(mouseX < 120*m_ScaleW){EnableMusic(true);}else{EnableMusic(false);}}else{//返回游戏状态myHandler.sendEmptyMessage(2);//发送返回主界面的消息}return true;}else if(HELPSTATE == m_GameState){//如果是帮助界面,返回游戏状态if( mouseY > (m_ScreenHeight - 70*m_ScaleH)){myHandler.sendEmptyMessage(2);//发送返回主界面的消息}return true;}return false;}//重新开始public  void  Restart(float mouseX,float mouseY){//判断是否点击在"开始按钮"中int tBtnW = m_BitMapArray[32].getWidth();int tBtnH = m_BitMapArray[32].getHeight();int tLeft = m_ShowStartBtnX - 4;int tTop =  m_ShowStartBtnY - 4;int tRight = tLeft + tBtnW + 4;int tBottom = tTop + tBtnH + 4;if(mouseX < tLeft)return;if(mouseX > tRight)return;if(mouseY < tTop)return;if(mouseY > tBottom)return;if(true == IsReady()){m_starttime = System.nanoTime();//获取当前时间,单位为纳秒m_Timer= 500 + random.nextInt(500);//每隔多久前进一次m_DecTimer= 40  + random.nextInt(40);//加速度m_MinTimer= 0;//最小时间间隔//运行次数换图int    tBackImageIndex = m_RunNum % 4 ;switch(tBackImageIndex){case 0:m_BitMapArray[31] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.background1);//背景break;case 1:m_BitMapArray[31] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.background2);//背景break;case 2:m_BitMapArray[31] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.background3);//背景break;default:m_BitMapArray[31] = BitmapFactory.decodeResource(winnerActivity.getResources(), R.drawable.background4);//背景break;}m_RunNum++;m_bStartRun = true;//开始m_CurrWinnerID  = 0;//当前玩家}}//是否可以开始[检查是否有下注]publicboolean  IsReady(){booleantPutIcon = false;if(false == m_bStartRun){//如果是双人对战if(m_WinnerSize == 2){//查找是否有下注for(int i = 0 ; i < m_TileCows ; i++){for(int j = 0 ; j < m_WinnerSize ; j++){if( m_WinnerRecord[m_CurrWinnerID].GetRecord(i) > 0 ){tPutIcon = true;break;}}}if( true == tPutIcon ){if(m_CurrWinnerID < 2){m_CurrWinnerID++;}}if( m_CurrWinnerID == 2){tPutIcon = true;m_CurrWinnerID = -1;}else{tPutIcon = false;}}else{for(int i = 0 ; i < m_TileCows ; i++){for(int j = 0 ; j < m_WinnerSize ; j++){if( m_WinnerRecord[j].GetRecord(i) > 0 ){tPutIcon = true;break;}}}}}return tPutIcon;}//加币publicboolean  AddIcon(float mouseX,float mouseY){if(false == m_bStartRun){//显示返回菜单inttMaxRight = (int) (m_ScreenWidth - m_BitMapArray[48].getWidth()- 5);//显示玩家金币情况for(int i = 0 ; i < m_WinnerSize ; i++){int     tIconSize = m_WinnerRecord[i].GetIconSize();if( 0 ==  tIconSize){int tLeft = i * 100 ;int tTop = 0 ;int tRight = tLeft + 100 ;if(tRight >= tMaxRight ){tRight = tMaxRight - 1;}int tBottom = m_Top;if(mouseX < tLeft)continue;if(mouseX > tRight)continue;if(mouseY < tTop)continue;if(mouseY > tBottom)continue;m_WinnerRecord[i].AddIcon(1);//播放放金币声音PlayIconSound();return true;}}}return false;}//投注publicboolean  DecIcon(float mouseX,float mouseY){if(false == m_bStartRun){if(m_WinnerAppleID >= 0){//清空for(int j = 0 ; j < m_WinnerSize ; j++){m_WinnerRecord[j].CleanRecord(-1);}m_WinnerAppleID = -1;}for(int i = 0 ; i < m_TileCows ; i++){//for(int j = 0 ; j < m_WinnerSize ; j++)//{int tLeft = i * m_TileW ;int tTop = m_ShowIconTop ;//+ j * 20 ;int tRight = tLeft + m_TileW;int tBottom = (int) m_ScreenHeight;if(mouseX < tLeft)continue;if(mouseX > tRight)continue;if(mouseY < tTop)continue;if(mouseY > tBottom)continue;m_WinnerRecord[m_CurrWinnerID].AddRecord(m_TileCows-1-i);return true;//}}}return false;}//开始游戏public  boolean StartGame(float mouseX,float mouseY){//如果是开始界面if(INITSTATE == m_GameState){//按钮inttBtnLeft = (int) (20 * m_ScaleW);inttBtnWidth  = m_BitMapArray[ 44 ].getWidth();inttBtnHeight = (int) (m_BitMapArray[ 44 ].getHeight()+3 * m_ScaleH);inttBtnTop  = (int) (m_ScreenHeight - 4*(tBtnHeight+2)) ;for(int i = 0 ; i < 4 ; i++){int tLeft = (int) (tBtnLeft + i * 40 * m_ScaleW) ;int tTop =  (int) (tBtnTop + i * tBtnHeight ) ;int tRight = tLeft + tBtnWidth;int tBottom = tTop + tBtnHeight;if(mouseX < tLeft)continue;if(mouseX > tRight)continue;if(mouseY < tTop)continue;if(mouseY > tBottom)continue;if( 0 == i ){//进入游戏InitGameUI();m_GameState = GAMESTATE;}else if( 1 == i ){//游戏设置m_GameState = SETTINGSTATE ;}else if( 2 == i ){//游戏帮助m_GameState = HELPSTATE ;m_HelpTextTop = m_HelpTextMinTop;}else if( 3 == i ){//退出游戏m_GameState = GAMEEXIT ;m_GameExitTime = System.nanoTime();//获取当前时间,单位为纳秒 m_currenttime = System.nanoTime();//获取当前时间,单位为纳秒//winnerActivity.finish();//android.os.Process.killProcess(android.os.Process.myPid());}}return true;}return false;}//检查是否点击了返回菜单publicvoidCheckEnterReturnMenu(float mouseX,float mouseY){if( GAMESTATE == m_GameState ){//显示返回菜单intmenuBitMapW = m_BitMapArray[48].getWidth();intmenuBitMapH = m_BitMapArray[48].getHeight();int tLeft = (int) (m_ScreenWidth - menuBitMapW - 5 * m_ScaleW) ;int tTop = 0 ;int tRight = (int) (tLeft + m_TileW + 5 * m_ScaleW);int tBottom = (int) (tTop + menuBitMapH + 2 * m_ScaleH);if(mouseX < tLeft)return ;if(mouseX > tRight)return;if(mouseY < tTop)return;if(mouseY > tBottom)return;//重设状态m_starttime = System.nanoTime();//获取当前时间,单位为纳秒m_Timer= 500;//每隔多久前进一次m_DecTimer= 40;//加速度m_MinTimer= 0;//最小时间间隔m_bStartRun     = false;m_currentpathid = random.nextInt(m_TileCount);//起始位置m_CurrWinnerID = 0;m_InitIconSize = 10;//初始时10个金币for(int i = 0 ; i < m_MaxWinnerSize ; i++){//玩家m_WinnerRecord[i].SetIconSize(m_InitIconSize);m_WinnerRecord[i].CleanRecord(-1);}m_WinnerAppleID = -1;//返回菜单界面m_GameState = INITSTATE ;}}//打气球public  void    PutOutJianTou(float mouseX,float mouseY){if( GAMESTATE == m_GameState ){if( true == m_bStartRun &&  true == m_QiQiuOpen){//如果没有气球可用,直接返回if(false == m_QiQiuIsLive)return ;//取得点击的水果类型int vAppleType = -1;for(int i = 0 ; i < m_TileCows ; i++){int tLeft = i * m_TileW ;int tTop = m_ShowIconTop ;int tRight = tLeft + m_TileW;int tBottom = (int) m_ScreenHeight;if(mouseX < tLeft)continue;if(mouseX > tRight)continue;if(mouseY < tTop)continue;if(mouseY > tBottom)continue;vAppleType = m_TileCows - 1 -i;break;}if(-1 == vAppleType )return ;//如果已经有飞镖了,不能再发射了if(m_FeiBiaoArray.size() > 0)return ;//清空飞镖m_FeiBiaoArray.clear();//左边inttStartIndex = 2 * m_TileCows + m_TileRows ;for(int i = 0 ; i < m_TileRows ; i++){int tImageID = appleTileArray[tStartIndex + i].GetImageID();if(tImageID < 16){tImageID = tImageID % 8 ;if( vAppleType == tImageID){FeiBiaotFeiBiao = new FeiBiao();inttPosX = appleTileArray[tStartIndex + i].GetTileX();inttPosY = appleTileArray[tStartIndex + i].GetTileY();floattSpeed = 0.5f;if(tImageID > 3){tFeiBiao.Init(1, m_BitMapArray[42], 0, tPosX, tPosY, tSpeed);}else{tFeiBiao.Init(0, m_BitMapArray[40], 0, tPosX, tPosY, tSpeed);}m_FeiBiaoArray.add(tFeiBiao);}}}//右边tStartIndex = m_TileCows  ;for(int i = 0 ; i < m_TileRows ; i++){int tImageID = appleTileArray[tStartIndex + i].GetImageID();if(tImageID < 16){tImageID = tImageID % 8 ;if( vAppleType == tImageID){FeiBiaotFeiBiao = new FeiBiao();inttPosX = appleTileArray[tStartIndex + i].GetTileX();inttPosY = appleTileArray[tStartIndex + i].GetTileY();floattSpeed = 0.5f;if(tImageID > 3){tFeiBiao.Init(1, m_BitMapArray[43], 1, tPosX, tPosY, tSpeed);}else{tFeiBiao.Init(0, m_BitMapArray[41], 1, tPosX, tPosY, tSpeed);}m_FeiBiaoArray.add(tFeiBiao);}}}//播放飞镖声音if(m_FeiBiaoArray.size() > 0){PlayFeiBiaoSound();}}}}//放一个气球publicvoidPutOutQiQiu(){if( GAMESTATE == m_GameState ){if(false == m_QiQiuIsLive && true == m_QiQiuOpen){intvQiQiuID = random.nextInt(6);//气球色彩intvBaoWuID = random.nextInt(8);//宝物类型 float vSpeed = random.nextFloat()* 0.5f + 0.1f;inttImageW = m_BitMapArray[34 + vQiQiuID].getWidth();//inttImageH = m_BitMapArray[34 + vQiQiuID].getHeight();m_QiQiu.Init(vQiQiuID, m_BitMapArray[34 + vQiQiuID], (m_ScreenWidth - tImageW)/2, m_ScreenHeight, -vSpeed);m_QiQiu.SetBaoWu(vBaoWuID);m_QiQiuIsLive = true;}}}//飞镖碰撞气球public voidCollQiQiu(){if( GAMESTATE == m_GameState ){if(true == m_QiQiu.IsLive() &&  true == m_QiQiuOpen){inttBaoWuID = m_QiQiu.GetBaoWu();m_QiQiu.Kill();//播放打破气球的声音PlayBombSound();//刷币RefreshBaoWu(tBaoWuID);}}}//处理刷宝publicvoidRefreshBaoWu(int vBaoWuID){//播放放金币声音PlayIconSound();switch(vBaoWuID){case 0://增加一个金币m_WinnerRecord[0].AddIcon(1);break;case 1://扣除一个金币m_WinnerRecord[0].DecIcon();break;case 2://增加二个金币m_WinnerRecord[0].AddIcon(2);break;case 3://扣除二个金币m_WinnerRecord[0].DecIcon();m_WinnerRecord[0].DecIcon();break;case 4://再持续一圈m_Timer = 1000;break;case 5://停下来m_Timer = 2000;break;case 6://所有水果都中奖m_WinAllApple = 1;break;case 7://中奖水果X2倍奖金m_WinAllApple = 2;break;}m_ShowBaoWu = vBaoWuID ;}//鼠标publicvoidShowHand(float mouseX,float mouseY){/*if(false == m_bStartRun){for(int i = 0 ; i < m_TileCows ; i++){for(int j = 0 ; j < m_WinnerSize ; j++){int tLeft = i * m_TileW ;int tTop = m_ShowIconTop + j * 20;int tRight = tLeft + m_TileW;int tBottom = tTop + 20;if(mouseX < tLeft)continue;if(mouseX > tRight)continue;if(mouseY < tTop)continue;if(mouseY > tBottom)continue;m_HandIndex_apple = i ;m_HandIndex_winner = j ;return ;}}}m_HandIndex_apple = -1 ;m_HandIndex_winner = -1;*/}//结算publicvoidCalculateWinner(){m_WinnerAppleID = -1;//所有水果都中奖if( 1 == m_WinAllApple ){inttCurrentImageId = appleTileArray[m_currentpathid].GetImageID() ;boolean tWin = false;if( tCurrentImageId < 16){for(int i = 0 ; i < m_TileCows ; i++){for(int j = 0 ; j < m_WinnerSize ; j++){int tRecordSize = m_WinnerRecord[j].GetRecord(i);int tWinIconSisze = m_Winsize[i] * tRecordSize ;if( tWinIconSisze > 0){m_WinnerRecord[j].AddIcon(tWinIconSisze) ;tWin = true;}}}m_WinnerAppleID = m_WinAllAppleID ;}if(false == tWin){//清空for(int j = 0 ; j < m_WinnerSize ; j++){m_WinnerRecord[j].CleanRecord(-1);}}}else{//计算结果inttCurrentImageId = appleTileArray[m_currentpathid].GetImageID() ;boolean tWin = false;if( tCurrentImageId < 16){inttImageType = tCurrentImageId % 8  ;for(int j = 0 ; j < m_WinnerSize ; j++){int tRecordSize = m_WinnerRecord[j].GetRecord(tImageType);//如果下注数大于0if(tRecordSize > 0){int tWinIconSisze = m_Winsize[tCurrentImageId] * tRecordSize ;//中奖水果X2if( 2 == m_WinAllApple){tWinIconSisze = tWinIconSisze * 2 ;}m_WinnerRecord[j].AddIcon(tWinIconSisze) ;m_WinnerAppleID = tImageType ;tWin = true;}}}if(false == tWin){//清空for(int j = 0 ; j < m_WinnerSize ; j++){m_WinnerRecord[j].CleanRecord(-1);}}}//恢复m_WinAllApple = 0;}}

四.AppThread.java:多线程更新逻辑。

package win.gam;public class AppleThread extends Thread{int sleepSpan = 20;//休眠时间boolean flag = false;//线程执行标志位Appleapple = null;public AppleThread(Appleapple){this.apple = apple ;flag = true;//设置线程执行的标志位为true}public void Exit(){flag = false;}public void run(){while(flag){apple.Update();try{Thread.sleep(sleepSpan);//休眠一段时间}catch(Exception e){e.printStackTrace();}}}}   

五.AppleView.java:游戏视图。

package win.gam;import win.gam.DrawThread;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.util.DisplayMetrics;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;public class AppleView extends SurfaceView implements SurfaceHolder.Callback{WinnerActivitywinnerActivity;DisplayMetricsDMInfo;Appleapple;DrawThread dt;//后台屏幕绘制线程String fps="FPS:N/A";//用于显示帧速率的字符串,调试使用booleanButtonDown = false;public AppleView(Context activity){super(activity);//调用父类构造器winnerActivity = (WinnerActivity)activity;getHolder().addCallback(this);init();dt = new DrawThread(this,getHolder());//初始化重绘线程}public void init(){DMInfo = new DisplayMetrics();winnerActivity.getWindowManager().getDefaultDisplay().getMetrics(DMInfo);apple = new Apple(winnerActivity,DMInfo.widthPixels,DMInfo.heightPixels);}public boolean onTouchEvent(MotionEvent event){   if(event.getAction() == MotionEvent.ACTION_DOWN)   {   //如果是设置游戏   if(true == apple.GameConfig(event.getX(), event.getY()))return true;   //如果开始游戏   if(true == apple.StartGame(event.getX(), event.getY()))return true;      //如果游戏中,看是否点击返回菜单   apple.CheckEnterReturnMenu(event.getX(), event.getY());   //如果游戏中,可以发射箭头   apple.PutOutJianTou(event.getX(), event.getY());      ButtonDown = true;      //加分   if(false == apple.AddIcon(event.getX(), event.getY()))   {   //苹果机开始   if(false == apple.DecIcon(event.getX(), event.getY()))   {apple.Restart(event.getX(), event.getY());invalidate();   }   }   else   {   invalidate();   }   }   if(event.getAction() == MotionEvent.ACTION_UP)   {   ButtonDown = false;   }   //显示手   apple.ShowHand(event.getX(), event.getY());   return true; }public void doDraw(Canvas canvas) { Paint BackGraoundP = new Paint();//创建画笔对象 BackGraoundP.setColor(Color.BLACK);//为画笔设置颜色 //刷背景色 RectFtRect = new RectF(0,0, this.getWidth(),this.getHeight()); canvas.drawRect(tRect, BackGraoundP);      //画水果机         Paint paintApple = new Paint();         apple.Draw(canvas, paintApple);                           /*         //画FPS  Paint p = new Paint();//创建画笔对象  p.setColor(Color.BLUE);//为画笔设置颜色  p.setTextSize(18);//为画笔设置字体大小  p.setAntiAlias(true);//设置抗锯齿   canvas.drawText(fps, 30, 30, p);//画出帧速率字符串  */}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {//重写surfaceChanged方法apple.ChangeWindowSize(width,height);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {//从写surfaceCreated方法if(!dt.isAlive()){//如果DrawThread没有启动,就启动这个线程dt.start();}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {//重写surfaceDestroyed方法dt.flag = false;//停止线程的执行dt = null;//将dt指向的对象声明为垃圾apple.ExitThread();}}

六.DrawThread.java:多线程更新

   package win.gam;      import win.gam.AppleView;   import android.graphics.Canvas;   import android.view.SurfaceHolder;      public class DrawThread extends Thread   {   AppleView bv;//BallView对象引用   SurfaceHolder surfaceHolder;//SurfaceHolder对象引用   boolean flag=false;//线程执行标志位   int sleepSpan = 30;//休眠时间   long start = System.nanoTime();//记录起始时间,该变量用于计算帧速率   int count=0;//记录帧数,该变量用于计算帧速率   //构造器   public DrawThread(AppleView bv,SurfaceHolder surfaceHolder){   this.bv = bv;//为BallView对象应用赋值   this.surfaceHolder = surfaceHolder;//为SurfaceHolder对象应用赋值   this.flag = true;//设置标志位   }   //方法:线程的执行方法,用于绘制屏幕和计算帧速率   public void run(){   Canvas canvas = null;//声明一个Canvas对象   while(flag){   try{   canvas = surfaceHolder.lockCanvas(null);//获取BallView的画布   synchronized(surfaceHolder){   bv.doDraw(canvas);//调用BallView的doDraw方法进行绘制   }   }   catch(Exception e){   e.printStackTrace();//捕获并打印异常   }   finally{   if(canvas != null){//如果canvas不为空   surfaceHolder.unlockCanvasAndPost(canvas);//surfaceHolder解锁并将画布对象传回   }   }   this.count++;   if(count == 20){//如果计满20帧   count = 0;//清空计数器   long tempStamp = System.nanoTime();//获取当前时间   long span = tempStamp - start;//获取时间间隔   start = tempStamp;//为start重新赋值   double fps = Math.round(100000000000.0/span*20)/100.0;//计算帧速率   bv.fps = "FPS:"+fps;//将计算出的帧速率设置到BallView的相应字符串对象中   }   try{   Thread.sleep(sleepSpan);//线程休眠一段时间   }   catch(Exception e){   e.printStackTrace();//捕获并打印异常   }   }   }}

.FeiBiao.java:飞镖类

   package win.gam;      import android.graphics.Bitmap;   import android.graphics.Canvas;   import android.graphics.Paint;      public class FeiBiao   {   intm_FeiBiaoType = 0;//飞镖类型   intm_FangXiang = 0;//方向 0右 1左   floatm_PosX= 0;//位置X   floatm_PosY= 0;//位置Y   floatm_Speed= -0.01f;//速度   booleanm_IsLive= false;//是否存活   Bitmapm_Image= null;//图像      FeiBiao()   {      }      //设置气球   publicvoidInit(int vFeiBiaoType,BitmapImage,int vFangXiang ,int vPosX,int vPosY,float vSpeed)   {   m_FeiBiaoType = vFeiBiaoType;   m_Image= Image ;   m_FangXiang = vFangXiang ;   m_PosX = vPosX;   m_PosY = vPosY;   m_Speed = vSpeed;   m_IsLive = true;   }   //是否存活   public  boolean IsLive()   {   return m_IsLive;   }   //取得气球类型   publicintGetQiQiuType()   {   return m_FeiBiaoType;   }   //取得气球位置   publicfloatGetPosX()   {   return m_PosX;   }   public  floatGetPosY()   {   return m_PosY;   }   //取得气球的宽度   public float GetImageWidth()   {   return m_Image.getWidth();   }   //取得气球的高度   public floatGetImageHeight()   {   return m_Image.getHeight();   }   //更新   public voidUpdate(float vScreenWidth,float vScreenHeight)   {   if(m_IsLive)   {   inttImageW = m_Image.getWidth();   //右   if(0 == m_FangXiang)   {   if( m_PosX > (vScreenWidth + tImageW))   {   m_IsLive = false;   }   else   {   m_PosX += m_Speed ;   }   }   else   {   //左   if( m_PosX < - tImageW)   {   m_IsLive = false;   }   else   {   m_PosX -= m_Speed ;   }   }      }   }   //绘制   publicvoidOnDraw(Canvas canvas,Paint paint)   {   if(m_IsLive)   {   canvas.drawBitmap(m_Image, m_PosX ,m_PosY, paint);   }   }}

.FeiBiaoThread.java:多线程更新飞镖逻辑。

package win.gam;public class FeiBiaoThread extends Thread{int sleepSpan = 2;//休眠时间boolean flag = false;//线程执行标志位Appleapple = null;public FeiBiaoThread(Appleapple){this.apple = apple ;flag = true;//设置线程执行的标志位为truethis.start();}//运行public void run(){while(flag){//更新飞镖if( apple.m_FeiBiaoArray.size() > 0 ){booleanIsLive = false;//位置floattLeft = apple.m_QiQiu.GetPosX();floattTop  = apple.m_QiQiu.GetPosY();float   tRight= tLeft + apple.m_QiQiu.GetImageWidth();float   tBottom= tTop + apple.m_QiQiu.GetImageHeight();//遍历飞镖列表,绘制每个飞镖对象for( FeiBiao fb:apple.m_FeiBiaoArray){fb.Update(apple.GetScreenWidth(),apple.GetScreenHeight());if(true == fb.IsLive()){IsLive = true;//位置floattLeft2 = fb.GetPosX();floattTop2 = fb.GetPosY();float   tRight2= tLeft2 + fb.GetImageWidth();float   tBottom2= tTop2 + fb.GetImageHeight();if(true == CheckColl(tLeft,tTop,tRight,tBottom,tLeft2,tTop2,tRight2,tBottom2)){apple.CollQiQiu();}}}//如果都结束了退出线程if(false == IsLive){apple.m_FeiBiaoArray.clear();}}try{Thread.sleep(sleepSpan);//休眠一段时间}catch(Exception e){e.printStackTrace();}}}//检查是否碰撞publicbooleanCheckColl(float vLeft1,float vTop1,float vRight1,float vBottom1,float vLeft2,float vTop2,float vRight2,float vBottom2){if(vLeft1 > vRight2 )return false;if(vTop1 > vBottom2 )return false;if(vRight1 < vLeft2 )return false;if(vBottom1 < vTop2 )return false;return true;}}

.QiQiu.java:气球类

   package win.gam;      import android.graphics.Bitmap;   import android.graphics.Canvas;   import android.graphics.Paint;      public class QiQiu    {   intm_QiQiuType = 0;//气球类型   intm_BaoWu= 0;//宝物   floatm_PosX= 0;//位置X   floatm_PosY= 0;//位置Y   floatm_Speed= -0.1f;//速度   booleanm_IsLive= false;//是否存活   Bitmapm_Image= null;//图像   QiQiu()   {      }      //设置气球   publicvoidInit(int vQiQiuType,BitmapImage,float vPosX,float vPosY,float vSpeed)   {   m_QiQiuType = vQiQiuType;   m_Image= Image ;   m_PosX = vPosX;   m_PosY = vPosY;   m_Speed = vSpeed;   m_IsLive = true;   }   //是否存活   public  boolean IsLive()   {   return m_IsLive;   }   //杀掉气球   publicvoidKill()   {   m_IsLive = false;   }   //取得气球类型   publicintGetQiQiuType()   {   return m_QiQiuType;   }   //取得气球位置   publicfloatGetPosX()   {   return m_PosX;   }   public  floatGetPosY()   {   return m_PosY;   }   //取得气球的宽度   public float GetImageWidth()   {   return m_Image.getWidth();   }   //取得气球的高度   public floatGetImageHeight()   {   return m_Image.getHeight();   }   //设置宝物   publicvoidSetBaoWu(int vBaoWu)   {   m_BaoWu = vBaoWu;   }   //取得宝物   publicintGetBaoWu()   {   return m_BaoWu;   }   //更新   public voidUpdate(float vScreenWidth,float vScreenHeight)   {   if(m_IsLive)   {   inttImageH = m_Image.getHeight();   if( m_PosY < - tImageH)   {   m_IsLive = false;   }   else   {   m_PosY += m_Speed ;   }   }   }   //绘制   publicvoidOnDraw(Canvas canvas,Paint paint)   {   if(m_IsLive)   {   canvas.drawBitmap(m_Image, m_PosX ,m_PosY, paint);   }   }   }

.QiQiuThread.java:多线程更新气球逻辑。

package win.gam;public class QiQiuThread extends Thread{int sleepSpan = 2;//休眠时间boolean flag = false;//线程执行标志位Appleapple = null;public QiQiuThread(Appleapple){this.apple = apple ;flag = true;//设置线程执行的标志位为truethis.start();}//运行public void run(){while(flag){if(true == apple.m_QiQiu.IsLive()){//更新气球apple.m_QiQiu.Update(apple.GetScreenWidth(),apple.GetScreenHeight());//如果气球挂了,则退出线程if(false == apple.m_QiQiu.IsLive()){apple.m_QiQiuIsLive = false;}}else {apple.m_QiQiuIsLive = false;}try{Thread.sleep(sleepSpan);//休眠一段时间}catch(Exception e){e.printStackTrace();}}}}

十一.Tile.java:轮盘的格子类。

package win.gam;      import android.graphics.Bitmap;   import android.graphics.Canvas;   import android.graphics.Color;   import android.graphics.Paint;      public class Tile {   /*   staticfinalintFX_RIGHTTOP  = 0;   static  finalintFX_RIGHT = 1;   static  finalintFX_RIGHTBOTTOM = 2;   staticfinalintFX_BOTTOM= 3;   staticfinalintFX_LEFTBOTTOM= 4;   staticfinalintFX_LEFT= 5;   staticfinalintFX_LEFTTOP= 6;   staticfinalintFX_TOP= 7;   */         intTileX = 0;//格子位置   intTileY = 0;   //intFangXiang = FX_RIGHTTOP;//方向//   intImageID = 0;//图像ID   BitmapImage;//图像      Tile()   {      }   //设置位置   publicvoidSetTile(int vTileX,int vTileY)//,int vFangXiang)   {   TileX = vTileX;   TileY = vTileY;   //FangXiang = vFangXiang ;   }   //取得位置X   publicintGetTileX()   {   return TileX;   }   //取得位置Y   publicintGetTileY()   {   return TileY;   }   //设置图像ID   public  voidSetImage(int vBitMapID,BitmapvBitMap)   {   ImageID = vBitMapID ;   Image = vBitMap;   }   //取得图像ID   public intGetImageID()   {   return ImageID;   }   //绘制背景   publicvoidDrawBack(Canvas canvas,int  vBackIndex)   {      inttWidth = Image.getWidth();   int tHeight = Image.getHeight();      inttBorderSize = 4 ;      Paint tBackPaint = new Paint();//创建画笔对象   switch(vBackIndex)   {   case 0:   tBackPaint.setColor(Color.BLUE);//为画笔设置颜色   break;   case 1:   tBackPaint.setColor(Color.YELLOW);//为画笔设置颜色   break;   case 2:   tBackPaint.setColor(Color.CYAN);//为画笔设置颜色   break;   case 3:   tBackPaint.setColor(Color.RED);//为画笔设置颜色   break;   }      //绘制背景图   canvas.drawRect(TileX-tBorderSize,TileY-tBorderSize, TileX + tWidth+tBorderSize,TileY + tHeight+tBorderSize,tBackPaint);      }   //绘制   publicvoidOnDraw(Canvas canvas,Paint paint)   {   canvas.drawBitmap(Image, TileX,TileY, paint);   }}

代码讲解完了。原理应该很清楚了。但因为是使用SurfaceView,所以效率不太好,我正打算改成cocos2d-x版本,等改好后再教给大家如何使用Cocos2d-x来制做。好了,下课吧~

本游戏程序压缩包下载位置:

http://download.csdn.net/detail/honghaier/4976678




更多相关文章

  1. Android使用Canvas绘图
  2. Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
  3. android拍照压缩及添加水印3
  4. 初学Android,开发自定义的View(四)
  5. Paint的setMaskFilter(MaskFilter maskfilter)
  6. Android(安卓)自定义控件圆形图案
  7. Android(安卓)自定义View
  8. android画笔错位问题的解决
  9. Android简单画板的实现

随机推荐

  1. MySQL数据库中CAST与CONVERT函数实现类型
  2. Mysql通过存储过程分割字符串为数组
  3. mysql实现查询数据并根据条件更新到另一
  4. mysql 8.0.15 winx64安装配置方法图文教
  5. window下mysql 8.0.15 winx64安装配置方
  6. mysql 8.0.15 压缩版安装图文教程
  7. mysql 8.0.11 安装配置方法图文教程(win1
  8. mysql 8.0.15 安装配置方法图文教程(Windo
  9. win10下mysql 8.0.12 安装及环境变量配置
  10. mysql 8.0.15 安装图文教程及数据库基础