实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.chrislee.tetris; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; import android.view.View; public class TetrisView extends View implements Runnable{ final static int SCREEN_WIDTH = 320; final static int SCREEN_HEIGHT = 455; final int STATE_MENU = 0; final int STATE_PLAY = 1; final int STATE_PAUSE = 2; final int STATE_OVER = 3; // final int MENU_NEWGAME = 10; // final int MENU_SETTING = 11; // final int MENU_HELP = 12; // // final int SETTING_MUSIC_ON = 21; // final int SETTING_MUSIC_OFF = 22; // final int SETTING_LEVEL = 23; // final int OPTION_RESUME = 31; // final int OPTION_MENU = 32; // final int OPTION_QUIT = 33; public static final int MAX_LEVEL = 6; public static final String TAG = "TetrisView"; public static final String DATAFILE = "save.dt"; int mGamestate = STATE_PLAY; int mScore = 0; int mSpeed = 1; int mDeLine = 0; boolean mIsCombo = false; // boolean mIsPaused = false; boolean mIsVoice = true; long mMoveDelay = 600; long mLastMove = 0; // int mAtPause = OPTION_RESUME; private Context mContext = null; private Paint mPaint = new Paint(); RefreshHandler mRefreshHandler = null; //RefreshHandler mRefreshHandler = null; TileView mCurrentTile = null; TileView mNextTile = null; Court mCourt = null; ResourceStore mResourceStore = null; /////////// MusicPlayer mMPlayer = null; public TetrisView(Context context) { super(context); init(context); // TODO Auto-generated constructor stub } protected void init(Context context) { mContext = context; mCurrentTile = new TileView(context); Log.i("tetris","mCurrentTile builed"); mNextTile = new TileView(context); mCourt = new Court(context); mRefreshHandler = new RefreshHandler(this); mResourceStore = new ResourceStore(context); //////////////////////////////////////// mMPlayer = new MusicPlayer(context); // setLevel(1); mPaint.setAntiAlias(true); mPaint.setColor(Color.RED); setFocusable(true); new Thread(this).start(); } public void logic() { switch(mGamestate) { case STATE_MENU: // mGamestate = STATE_PLAY; break; case STATE_PLAY: //startGame(); playGame(); break; case STATE_PAUSE: // if(mAtPause == OPTION_RESUME) // { // mIsPaused = false; // mGamestate = STATE_PLAY; // break; // } //if(mPusedChoose = ) break; case STATE_OVER: // startGame(); // mGamestate = STATE_PLAY; break; default:; } } public void startGame() { mGamestate = STATE_PLAY; mCourt.clearCourt(); mCurrentTile = new TileView(mContext); mNextTile = new TileView(mContext); // mSpeed = speed choosed // mScore // mLine setLevel(1); mScore = 0; mDeLine = 0; mIsPaused = false; mIsCombo = false; playGame(); } public void playGame() { long now = System.currentTimeMillis(); if(now - mLastMove > mMoveDelay) { if(mIsPaused) { return; } if(mIsCombo) { mCourt.placeTile(mCurrentTile); ////// mMPlayer.playMoveVoice(); if(mCourt.isGameOver() ) { mGamestate = STATE_OVER; return; } int line = mCourt.removeLines(); if(line > 0 ) { mMPlayer.playBombVoice(); } mDeLine = line; countScore(line); mCurrentTile = mNextTile; mNextTile = new TileView(mContext); mIsCombo = false; } moveDown(); mLastMove = now; } } private void countScore(int line) { switch(line) { case 1: mScore = 100;break; case 2: mScore = 300;break; case 3: mScore = 600;break; case 4: mScore = 1000;break; default: ; } if(mScore >= 2000 && mScore <4000) { setLevel(2); } else if(mScore >= 4000 && mScore < 6000) { setLevel(3); } else if(mScore >= 6000 && mScore < 8000) { setLevel(4); } else if(mScore >= 8000 && mScore < 10000) { setLevel(5); } else if(mScore >= 10000) { setLevel(6); } } protected void onDraw(Canvas canvas) { switch(mGamestate) { case STATE_MENU: paintMenu(canvas); break; case STATE_PLAY: paintGame(canvas); break; case STATE_PAUSE: paintPause(canvas); break; case STATE_OVER: paintOver(canvas); break; default:; } } public boolean isGameOver() { return mCourt.isGameOver(); } public boolean onKeyDown(int keyCode,KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_DPAD_UP: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { rotate(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_DOWN: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { moveDown(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_LEFT: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { moveLeft(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_RIGHT: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { moveRight(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_ENTER: ; case KeyEvent.KEYCODE_DPAD_CENTER: if(mGamestate == STATE_PLAY) { if(!mIsPaused) { fastDrop(); mMPlayer.playMoveVoice(); } } else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; // case KeyEvent.KEYCODE_S: if(mGamestate == STATE_PLAY) { mIsPaused = true; } else if(mGamestate == STATE_PAUSE) { mIsPaused = false; } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_SPACE: mIsPaused = !mIsPaused; if(mIsPaused) { mRefreshHandler.pause(); } else { mRefreshHandler.resume(); } break; default: ; } return super.onKeyDown(keyCode,event); } private void rotate() { // check if(!mIsCombo) mCurrentTile.rotateOnCourt(mCourt); } private void moveDown() { if(!mIsCombo) { if( ! mCurrentTile.moveDownOnCourt(mCourt) ) mIsCombo = true; } } private void moveLeft() { if(!mIsCombo) { mCurrentTile.moveLeftOnCourt(mCourt); } } private void moveRight() { if(!mIsCombo) { mCurrentTile.moveRightOnCourt(mCourt); } } private void fastDrop() { if(!mIsCombo) { mCurrentTile.fastDropOnCourt(mCourt); mIsCombo = true; } } private void paintMenu(Canvas canvas) { DrawTool.paintImage(canvas,mResourceStore.getMenuBackground(),0,0); DrawTool.paintImage(canvas,mResourceStore.getMenu(),0,SCREEN_HEIGHT/2 - mResourceStore.getMenu().getHeight()/2 ); } private void paintGame(Canvas canvas) { mCourt.paintCourt(canvas); mCurrentTile.paintTile(canvas); //mNextTile.paintTile(canvas); mPaint.setTextSize(20); paintNextTile(canvas); paintSpeed(canvas); paintScore(canvas); paintDeLine(canvas); } private void paintNextTile(Canvas canvas) { int i,j; for(i = 0;i<4;i ) { for(j = 0;j<4;j ) { if(mNextTile.mTile[i][j] != 0) { DrawTool.paintImage( canvas,mResourceStore.getBlock(mNextTile.getColor()-1), (int)(Court.BEGIN_DRAW_X getBlockDistance(Court.COURT_WIDTH) getBlockDistance((float) (i 0.5)) ), (int)( getBlockDistance((float)(j 0.5) ) ) ); } } } } private void paintSpeed(Canvas canvas) { mPaint.setColor(Color.BLUE); canvas.drawText("等级:",getBlockDistance(Court.COURT_WIDTH) getRightMarginToCourt(), getBlockDistance(9),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mSpeed),getBlockDistance(Court.COURT_WIDTH) 2*getRightMarginToCourt(), getBlockDistance(11),mPaint); } private void paintScore(Canvas canvas) { mPaint.setColor(Color.BLUE); canvas.drawText("得分:",getBlockDistance(Court.COURT_WIDTH) getRightMarginToCourt(), getBlockDistance(13),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mScore),getBlockDistance(Court.COURT_WIDTH) 2*getRightMarginToCourt(), getBlockDistance(15),mPaint); } private void paintDeLine(Canvas canvas) { mPaint.setColor(Color.BLUE); canvas.drawText("消去行数:",getBlockDistance(Court.COURT_WIDTH) getRightMarginToCourt(), getBlockDistance(17),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mDeLine),getBlockDistance(Court.COURT_WIDTH) 2*getRightMarginToCourt(), getBlockDistance(19),mPaint); } private float getBlockDistance(float blockNum) { return blockNum * Court.BLOCK_WIDTH; } private float getRightMarginToCourt() { return (float)10.0; } private void paintPause(Canvas canvas) { } private void paintOver(Canvas canvas) { paintGame(canvas); Paint paint = new Paint(); paint.setTextSize(40); paint.setAntiAlias(true); paint.setARGB(0xe0,0xff,0x00,0x00); canvas.drawText("Game Over",getBlockDistance(1),getBlockDistance(Court.COURT_HEIGHT/2-2),paint); //DrawTool.paintImage(canvas,mResourceStore.getGameover(),0,SCREEN_HEIGHT/2 - mResourceStore.getGameover().getHeight()/2 ); } @Override public void run() { // TODO Auto-generated method stub while(!Thread.currentThread().isInterrupted() ) { Message ms = new Message(); ms.what = RefreshHandler.MESSAGE_REFRESH; this.mRefreshHandler.sendMessage(ms); try { Thread.sleep(/*RefreshHandler.DELAY_MILLIS*/mMoveDelay); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } } public void setLevel(int level) { mSpeed = level; mMoveDelay = (long) (600*(1.0 - (double)mSpeed / 7.0 ) ); } public void setVoice(boolean isVoice) { mIsVoice = isVoice; mMPlayer.setMute(!mIsVoice); } public void restoreGame() { Properties pro = new Properties(); try { FileInputStream in = mContext.openFileInput(DATAFILE); pro.load(in); in.close(); } catch(IOException e) { Log.i(TAG,"file open failed in restoreGame()"); return; } mGamestate = Integer.valueOf(pro.get("gamestate").toString() ); mSpeed = Integer.valueOf(pro.get("speed").toString() ); setLevel(mSpeed); mScore = Integer.valueOf(pro.get("score").toString() ); mDeLine = Integer.valueOf(pro.get("deLine").toString() ); mIsVoice = Boolean.valueOf(pro.get("isVoice").toString() ); mIsCombo = Boolean.valueOf(pro.get("isCombo").toString() ); mIsPaused = Boolean.valueOf(pro.get("isPaused").toString() ); restoreCourt(pro); restoreTile(pro,mCurrentTile); restoreTile(pro,mNextTile); } private void restoreCourt(Properties pro) { int[][] matrix = mCourt.getMatrix(); int i,j; for(i = 0;i<Court.COURT_WIDTH;i ) { for(j = 0;j<Court.COURT_HEIGHT;j ) { matrix[i][j] = Integer.valueOf(pro.get("courtMatrix" i j).toString() ); } } } private void restoreTile(Properties pro,TileView tile) { int[][] matrix = tile.getMatrix(); int i,j; for(i = 0;i<4;i ) { for(j = 0;j<4;j ) { matrix[i][j] = Integer.valueOf(pro.get("tileMatrix" i j).toString() ); } } tile.setColor(Integer.valueOf(pro.get("tileColor").toString() )); tile.setShape(Integer.valueOf(pro.get("tileShape").toString() )); tile.setOffsetX(Integer.valueOf(pro.get("tileOffsetX").toString() )); tile.setOffsetY(Integer.valueOf(pro.get("tileOffsetY").toString() )); } public void saveGame() { Properties pro = new Properties(); pro.put("gamestate",String.valueOf(mGamestate)); pro.put("speed",String.valueOf(mSpeed)); pro.put("score",String.valueOf(mScore)); pro.put("deLine",String.valueOf(mDeLine)); Boolean b = new Boolean(mIsVoice); pro.put("isVoice",b.toString()); b = new Boolean(mIsCombo); pro.put("isCombo",b.toString()); b = new Boolean(mIsPaused); pro.put("isPaused",b.toString()); saveCourt(pro); saveTile(pro,mCurrentTile); saveTile(pro,mNextTile); try { FileOutputStream stream = mContext.openFileOutput(DATAFILE,Context.MODE_WORLD_WRITEABLE); pro.store(stream,""); stream.close(); } catch(IOException e) { Log.i(TAG,"ioexeption in saveGame()"); return; } } private void saveCourt(Properties pro) { int[][] court = mCourt.getMatrix(); int i,j; for(i = 0;i<Court.COURT_WIDTH;i ) { for(j = 0;j<Court.COURT_HEIGHT;j ) { pro.put("courtMatrix" i j,String.valueOf(court[i][j]) ); } } } private void saveTile(Properties pro,TileView tile) { int[][] matrix = tile.getMatrix(); int i,j; for(i =0;i<4;i ) { for(j = 0;j<4;j ) { pro.put("tileMatrix" i j,String.valueOf(matrix[i][j]) ); } } pro.put("tileColor",String.valueOf(tile.getColor() ) ); pro.put("tileShape",String.valueOf(tile.getShape() ) ); pro.put("tileOffsetX",String.valueOf(tile.getOffsetX() ) ); pro.put("tileOffsetY",String.valueOf(tile.getOffsetY() ) ); } public void onPause() { mRefreshHandler.pause(); mIsPaused = true; } public void onResume() { mRefreshHandler.resume(); mIsPaused = false; } public void freeResources() { mMPlayer.free(); } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论