实例介绍
【实例简介】
【实例截图】
【核心代码】
package flybird.view; import java.util.ArrayList; import java.util.List; import liqiang.flybird.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Rect; import android.os.Looper; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.widget.Toast; import flybird.config.Config; import flybird.config.Constants; import flybird.object.Bird; import flybird.object.Column; import flybird.object.Ground; import flybird.util.FileManager; import flybird.util.SoundPlayer; public class MainView extends BaseView { private Ground ground; private Column column1; private Column column2; private Column column3; private Bird bird; private FileManager fileManager; private Bitmap bgImg; private Bitmap startImg; private Bitmap endImg; private Bitmap restartButtonImg; private Bitmap exitButtonImg; private Bitmap noticeImg; private Bitmap pauseButtonImg; private Bitmap bigNumbersImg; private Bitmap smallNumbersImg; private Bitmap medalImg; private float startImgX; private float startImgY; private float endImgX; private float endImgY; private float noticeImgX; private float noticeImgY; private float restartButtonImgX; private float restartButtonImgY; private float exitButtonImgX; private float exitButtonImgY; private float pauseButtonImgX; private float pauseButtonImgY; private float bigNumbersImgX; private float bigNumbersImgY; private float smallNumbersImgX;//bestScore位置 private float smallNumbersImgY; private float smallScoreX; private float smallScoreY; private float medalImgX; private float medalImgY; private boolean isStart; private boolean isHit; private boolean isOver; private boolean isPause; private boolean isWrite; private int score; private int bestScore; //private Rect rect; public MainView(Context context, SoundPlayer soundPlayer) { super(context, soundPlayer); isStart = false; isHit = false; isOver = false; isPause = false; isWrite = false; //rect = new Rect(); //Toast.makeText(this.mainActivity.getApplicationContext(), Constants.SCREEN_WIDTH " " Constants.SCREEN_HEIGHT, Toast.LENGTH_LONG).show(); fileManager = new FileManager(); if(fileManager.sdIsAvalible()) { fileManager.initFile(); if(fileManager.fileReader().length() <= 0) { bestScore = 0; } else { bestScore = Integer.parseInt(fileManager.fileReader()); } } else { //Looper.prepare(); Toast.makeText(this.mainActivity.getApplicationContext(), "SD卡不可用,将无法保存您的最高纪录", Toast.LENGTH_LONG).show(); //Looper.loop(); } ground = new Ground(getResources()); column1 = new Column(getResources(), Config.COLUMN_X_GAP * 2, ground.getObjHeight()); column2 = new Column(getResources(), Config.COLUMN_X_GAP column1.getObjMidX(), ground.getObjHeight()); column3 = new Column(getResources(), Config.COLUMN_X_GAP column2.getObjMidX(), ground.getObjHeight()); bird = new Bird(getResources(), ground.getObjHeight()); this.thread = new Thread(this); } @Override public void run() { while(this.threadFlag) { if(!isHit && !isOver) { ground.step(); } if(isStart && !isHit &&!isOver) { column1.step(); column2.step(); column3.step(); } if(isStart) { bird.step(); } drawSelf(); if(isOver) { threadFlag = false; } if(isPause) { synchronized (thread) { try { thread.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } try { Thread.sleep(1000 / 60); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } drawSelf(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } drawNotice(); if(fileManager.sdIsAvalible()) { if(score > bestScore) { fileManager.fileWriter(String.valueOf(score)); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } for(int i=0; i<=score; i ) { drawResult(i); try { Thread.sleep(1000/60); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(thread) { drawMedal(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } drawButton(); isWrite = true; } @Override public void drawSelf() { try { canvas = sfh.lockCanvas(); drawObject(); if(!isHit) { if(bird.pass(column1) || bird.pass(column2) || bird.pass(column3)) { soundPlayer.playSound(2, 0); score ; } if(bird.hitColumn(column1) || bird.hitColumn(column2) ||bird.hitColumn(column3)){ soundPlayer.playSound(3, 0); paint.setAlpha(50); paint.setColor(Color.WHITE); canvas.drawRect(0, 0, Constants.SCREEN_WIDTH, Constants.SCREEN_HEIGHT, paint); isHit = true; } } /*paint.setTextSize(26); paint.setColor(Color.WHITE); paint.getTextBounds(String.valueOf(score), 0, String.valueOf(score).length(), rect); canvas.drawText(String.valueOf(score), 10, rect.height() 5, paint); */ if(!isOver) { drawScore(bigNumbersImg, bigNumbersImgX, bigNumbersImgY, score); } if(isOver) { soundPlayer.playSound(5, 0); canvas.drawBitmap(endImg, endImgX, endImgY, paint); } if(!isOver) { if(bird.hitGround(ground)){ soundPlayer.playSound(4, 0); isOver = true; } } if(!isStart) { if(!isStart) { canvas.drawBitmap(startImg, startImgX, startImgY, paint); } } if(isStart && !isHit && !isOver) { if(!isPause) { canvas.save(); canvas.clipRect(pauseButtonImgX, pauseButtonImgY, pauseButtonImgX pauseButtonImg.getWidth(), pauseButtonImgY pauseButtonImg.getHeight() / 2); canvas.drawBitmap(pauseButtonImg, pauseButtonImgX, pauseButtonImgY, paint); canvas.restore(); } else { canvas.save(); canvas.clipRect(pauseButtonImgX, pauseButtonImgY, pauseButtonImgX pauseButtonImg.getWidth(), pauseButtonImgY pauseButtonImg.getHeight() / 2); canvas.drawBitmap(pauseButtonImg, pauseButtonImgX, pauseButtonImgY - pauseButtonImg.getHeight() / 2, paint); canvas.restore(); } } } catch (Exception err) { err.printStackTrace(); } finally { if(canvas != null) { sfh.unlockCanvasAndPost(canvas); } } } public void drawNotice() { try { canvas = sfh.lockCanvas(); drawObject(); soundPlayer.playSound(5, 0); canvas.drawBitmap(endImg, endImgX, endImgY, paint); canvas.drawBitmap(noticeImg, noticeImgX, noticeImgY, paint); } catch (Exception err) { err.printStackTrace(); } finally { if(canvas != null) { sfh.unlockCanvasAndPost(canvas); } } } public void drawResult(int i) { try { canvas = sfh.lockCanvas(); drawObject(); //soundPlayer.playSound(5, 0); canvas.drawBitmap(endImg, endImgX, endImgY, paint); canvas.drawBitmap(noticeImg, noticeImgX, noticeImgY, paint); /* paint.setTextSize(26); paint.setColor(Color.WHITE); paint.getTextBounds(String.valueOf(bestScore), 0, String.valueOf(bestScore).length(), rect); canvas.drawText(String.valueOf(bestScore), noticeImgX noticeImg.getWidth() - rect.width(), noticeImgY noticeImg.getHeight() - rect.height(), paint); */ drawScore(smallNumbersImg, smallScoreX, smallScoreY, i); //drawScore(smallNumbersImg, smallNumbersImgX, smallNumbersImgY, bestScore); } catch (Exception err) { err.printStackTrace(); } finally { if(canvas != null) { sfh.unlockCanvasAndPost(canvas); } } } public void drawMedal() { try { canvas = sfh.lockCanvas(); drawObject(); soundPlayer.playSound(5, 0); canvas.drawBitmap(endImg, endImgX, endImgY, paint); canvas.drawBitmap(noticeImg, noticeImgX, noticeImgY, paint); /* paint.setTextSize(26); paint.setColor(Color.WHITE); paint.getTextBounds(String.valueOf(bestScore), 0, String.valueOf(bestScore).length(), rect); canvas.drawText(String.valueOf(bestScore), noticeImgX noticeImg.getWidth() - rect.width(), noticeImgY noticeImg.getHeight() - rect.height(), paint); */ drawScore(smallNumbersImg, smallScoreX, smallScoreY, score); drawScore(smallNumbersImg, smallNumbersImgX, smallNumbersImgY, bestScore); drawMedalImg(); } catch (Exception err) { err.printStackTrace(); } finally { if(canvas != null) { sfh.unlockCanvasAndPost(canvas); } } } public void drawButton() { try { canvas = sfh.lockCanvas(); drawObject(); soundPlayer.playSound(5, 0); canvas.drawBitmap(endImg, endImgX, endImgY, paint); canvas.drawBitmap(noticeImg, noticeImgX, noticeImgY, paint); drawScore(smallNumbersImg, smallScoreX, smallScoreY, score); drawScore(smallNumbersImg, smallNumbersImgX, smallNumbersImgY, bestScore); drawMedalImg(); canvas.drawBitmap(restartButtonImg, restartButtonImgX, restartButtonImgY, paint); canvas.drawBitmap(exitButtonImg, exitButtonImgX, exitButtonImgY, paint); } catch (Exception err) { err.printStackTrace(); } finally { if(canvas != null) { sfh.unlockCanvasAndPost(canvas); } } } public void drawObject() { canvas.save(); canvas.scale(scaleX, scaleY); canvas.drawBitmap(bgImg, 0, 0, paint); canvas.restore(); column1.drawSelf(canvas); column2.drawSelf(canvas); column3.drawSelf(canvas); bird.drawSelf(canvas); ground.drawSelf(canvas); } public void drawMedalImg() { canvas.save(); canvas.clipRect(medalImgX, medalImgY, medalImgX medalImg.getWidth(), medalImgY medalImg.getHeight() / 2); if(score >= 60) { canvas.drawBitmap(medalImg, medalImgX, medalImgY - medalImg.getHeight() / 2, paint); } else { canvas.drawBitmap(medalImg, medalImgX, medalImgY, paint); } canvas.restore(); } public void drawScore(Bitmap numbersImg, float x, float y, int num) { List<Integer> list = new ArrayList<Integer>(); int scoreCopy = num; int quotient = 0; while((quotient = scoreCopy / 10) != 0) { list.add(scoreCopy % 10); scoreCopy = quotient; } list.add(scoreCopy % 10); float posX = x; float posY = y; int len = list.size(); float oddNumW = numbersImg.getWidth() / 10; float oddNumH = numbersImg.getHeight(); posX -= len * oddNumW / 2; canvas.save(); for(int i=len-1; i>=0; i--) { switch(list.get(i)) { case 0: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 0 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 1: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 1 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 2: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 2 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 3: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 3 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 4: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 4 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 5: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 5 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 6: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 6 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 7: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 7 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 8: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 8 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; case 9: canvas.clipRect(posX, posY, posX oddNumW, posY oddNumH); canvas.drawBitmap(numbersImg, posX - 9 * oddNumW, posY, paint); posX = oddNumW; canvas.restore(); canvas.save(); break; } } canvas.restore(); } // 响应触屏事件的方法 @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN && event.getPointerCount() == 1) { float x = event.getX(); float y = event.getY(); if(isWrite) { if(x >= restartButtonImgX && x <= restartButtonImgX restartButtonImg.getWidth() && y >= restartButtonImgY && y <= restartButtonImgY restartButtonImg.getHeight()) { mainActivity.getHandler().sendEmptyMessage(Config.TO_MAIN_VIEW); } if(x >= exitButtonImgX && x <= exitButtonImgX exitButtonImg.getWidth() && y >= exitButtonImgY && y <= exitButtonImgY exitButtonImg.getHeight()) { mainActivity.getHandler().sendEmptyMessage(Config.END_GAME); } } if(!isStart) { isStart = true; } if(!isHit && !isOver) { if(x <= pauseButtonImgX || x>= pauseButtonImgX pauseButtonImg.getWidth() || y <= pauseButtonImgY || y>= pauseButtonImgY pauseButtonImg.getHeight() / 2) { bird.flappy(); soundPlayer.playSound(1, 0); } } if(isStart && !isHit && !isOver) { if(x >= pauseButtonImgX && x<= pauseButtonImgX pauseButtonImg.getWidth() && y >= pauseButtonImgY && y<= pauseButtonImgY pauseButtonImg.getHeight() / 2) { isPause = !isPause; if(isPause == false) { synchronized(this.thread) { thread.notify(); } } } } return true; } return false; } @Override public void surfaceCreated(SurfaceHolder arg0) { super.surfaceCreated(arg0); initBitmap(); if(this.thread.isAlive()) { this.thread.start(); } else { this.thread = new Thread(this); this.thread.start(); } } @Override public void initBitmap() { bgImg = BitmapFactory.decodeResource(getResources(), R.drawable.bg); startImg = BitmapFactory.decodeResource(getResources(), R.drawable.start); endImg = BitmapFactory.decodeResource(getResources(), R.drawable.text_gameover); restartButtonImg = BitmapFactory.decodeResource(getResources(), R.drawable.restartbutton); exitButtonImg = BitmapFactory.decodeResource(getResources(), R.drawable.exitbutton); noticeImg = BitmapFactory.decodeResource(getResources(), R.drawable.notice); pauseButtonImg = BitmapFactory.decodeResource(getResources(), R.drawable.pausebutton); bigNumbersImg = BitmapFactory.decodeResource(getResources(), R.drawable.bignumbers); smallNumbersImg = BitmapFactory.decodeResource(getResources(), R.drawable.smallnumbers); medalImg = BitmapFactory.decodeResource(getResources(), R.drawable.medal); this.scaleX = Constants.SCREEN_WIDTH / bgImg.getWidth(); this.scaleY = Constants.SCREEN_HEIGHT / bgImg.getHeight(); startImgX = Constants.SCREEN_WIDTH / 2 - startImg.getWidth() / 2; startImgY = Constants.SCREEN_HEIGHT / 2 - startImg.getHeight() / 2; endImgX = Constants.SCREEN_WIDTH / 2 - endImg.getWidth() / 2; endImgY = Constants.SCREEN_HEIGHT / 2 - endImg.getHeight() * 3; noticeImgX = Constants.SCREEN_WIDTH / 2 - noticeImg.getWidth() / 2; noticeImgY = Constants.SCREEN_HEIGHT / 2 - endImg.getHeight(); restartButtonImgX = Constants.SCREEN_WIDTH / 2 - restartButtonImg.getWidth() * 5 / 4; restartButtonImgY = Constants.SCREEN_HEIGHT / 2 noticeImg.getHeight(); exitButtonImgX = Constants.SCREEN_WIDTH / 2 exitButtonImg.getWidth() / 4; exitButtonImgY = Constants.SCREEN_HEIGHT / 2 noticeImg.getHeight(); pauseButtonImgX = 0; pauseButtonImgY = Constants.SCREEN_HEIGHT - pauseButtonImg.getHeight() / 2; bigNumbersImgX = Constants.SCREEN_WIDTH / 2; bigNumbersImgY = 10; smallNumbersImgX = noticeImgX noticeImg.getWidth() * 5 / 6; smallNumbersImgY =noticeImgY noticeImg.getHeight() - smallNumbersImg.getHeight() * 2; smallScoreX = smallNumbersImgX; smallScoreY = smallNumbersImgY - smallNumbersImg.getHeight() * 23 / 10; medalImgX = noticeImgX noticeImg.getWidth() / 8; medalImgY = noticeImgY noticeImg.getHeight() * 7 / 20; } @Override public void surfaceDestroyed(SurfaceHolder arg0) { super.surfaceDestroyed(arg0); release(); } @Override public void release() { if(!bgImg.isRecycled()) { bgImg.recycle(); } if(!startImg.isRecycled()) { startImg.recycle(); } if(!endImg.isRecycled()) { endImg.recycle(); } if(!restartButtonImg.isRecycled()) { restartButtonImg.recycle(); } if(!exitButtonImg.isRecycled()) { exitButtonImg.recycle(); } if(!noticeImg.isRecycled()) { noticeImg.recycle(); } if(!pauseButtonImg.isRecycled()) { pauseButtonImg.recycle(); } if(!bigNumbersImg .isRecycled()) { bigNumbersImg .recycle(); } if(!smallNumbersImg .isRecycled()) { smallNumbersImg .recycle(); } if(!medalImg.isRecycled()) { medalImg.recycle(); } ground.release(); column1.release(); column2.release(); column3.release(); bird.release(); } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论