实例介绍
【实例简介】
【实例截图】
【核心代码】
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论