編輯:關於Android編程
本文目標實現控制小飛機的左右移動、躲避子彈、打boss。
本節實現 開始菜單界面
1、首先 資源文件拷過來
2、劃分游戲狀態
public static final int GAME_MENU = 0;// 游戲菜單 public static final int GAMEING = 1;// 游戲中 public static final int GAME_WIN = 2;// 游戲勝利 public static final int GAME_LOST = 3;// 游戲失敗 public static final int GAME_PAUSE = -1;// 游戲菜單 // 當前游戲狀態(默認初始在游戲菜單界面) public static int gameState = GAME_MENU;
定義五種狀態
定義完方法後 在繪圖方法中 ,實體鍵 按下方法 ,抬起方法,觸屏監聽,邏輯方法,switch
//在那幾個方法中加這個 switch (gameState) { case GAME_MENU: break; case GAMEING: break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; default: break; }
下面再聲明一些東西
//聲明一個Resources實例便於加載圖片 private Resources res = this.getResources(); //聲明游戲需要用到的圖片資源(圖片聲明) private Bitmap bmpBackGround;//游戲背景 private Bitmap bmpBoom;//爆炸效果 private Bitmap bmpBoosBoom;//Boos爆炸效果 private Bitmap bmpButton;//游戲開始按鈕 private Bitmap bmpButtonPress;//游戲開始按鈕被點擊 private Bitmap bmpEnemyDuck;//怪物鴨子 private Bitmap bmpEnemyFly;//怪物蒼蠅 private Bitmap bmpEnemyBoos;//怪物豬頭Boos private Bitmap bmpGameWin;//游戲勝利背景 private Bitmap bmpGameLost;//游戲失敗背景 private Bitmap bmpPlayer;//游戲主角飛機 private Bitmap bmpPlayerHp;//主角飛機血量 private Bitmap bmpMenu;//菜單背景 public static Bitmap bmpBullet;//子彈 public static Bitmap bmpEnemyBullet;//敵機子彈 public static Bitmap bmpBossBullet;//Boss子彈
初始化 游戲
/** * SurfaceView視圖創建,響應此函數 */ @Override public void surfaceCreated(SurfaceHolder holder) { screenW = this.getWidth(); screenH = this.getHeight(); initGame(); flag = true; // 實例線程 th = new Thread(this); // 啟動線程 th.start(); }
/** * 加載游戲資源 */ private void initGame() { //加載游戲資源 bmpBackGround = BitmapFactory.decodeResource(res, R.drawable.background); bmpBoom = BitmapFactory.decodeResource(res, R.drawable.boom); bmpBoosBoom = BitmapFactory.decodeResource(res, R.drawable.boos_boom); bmpButton = BitmapFactory.decodeResource(res, R.drawable.button); bmpButtonPress = BitmapFactory.decodeResource(res, R.drawable.button_press); bmpEnemyDuck = BitmapFactory.decodeResource(res, R.drawable.enemy_duck); bmpEnemyFly = BitmapFactory.decodeResource(res, R.drawable.enemy_fly); bmpEnemyBoos = BitmapFactory.decodeResource(res, R.drawable.enemy_pig); bmpGameWin = BitmapFactory.decodeResource(res, R.drawable.gamewin); bmpGameLost = BitmapFactory.decodeResource(res, R.drawable.gamelost); bmpPlayer = BitmapFactory.decodeResource(res, R.drawable.player); bmpPlayerHp = BitmapFactory.decodeResource(res, R.drawable.hp); bmpMenu = BitmapFactory.decodeResource(res, R.drawable.menu); bmpBullet = BitmapFactory.decodeResource(res, R.drawable.bullet); bmpEnemyBullet = BitmapFactory.decodeResource(res, R.drawable.bullet_enemy); bmpBossBullet = BitmapFactory.decodeResource(res, R.drawable.boosbullet); }
菜單類 GameMenu
菜單類
包括 初始化繪制按鈕和背景圖
package com.gsf; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.view.MotionEvent; /** * * @author liuml * @time 2016-5-27 下午5:43:34 */ public class GameMenu { // 菜單背景圖 private Bitmap bmpMenu; // 按鈕圖片資源(按下和未按下圖) private Bitmap bmpButton, bmpButtonPress; // 按鈕的坐標 private int btnX, btnY; // 按鈕是否按下標識位 private Boolean isPress; // 菜單初始化 public GameMenu(Bitmap bmpMenu, Bitmap bmpButton, Bitmap bmpButtonPress) { this.bmpMenu = bmpMenu; this.bmpButton = bmpButton; this.bmpButtonPress = bmpButtonPress; // X居中,Y緊接屏幕底部 btnX = MySurfaceView.screenW / 2 - bmpButton.getWidth() / 2; btnY = MySurfaceView.screenH - bmpButton.getHeight(); isPress = false; } public void draw(Canvas canvas, Paint paint) { // 繪制菜單背景圖 canvas.drawBitmap(bmpMenu, 0, 0, paint); if (isPress) { canvas.drawBitmap(bmpButtonPress, btnX, btnY, paint); } else { canvas.drawBitmap(bmpButton, btnX, btnY, paint); } } public void onTouchEvent(MotionEvent event) { // 獲取當前觸控位置 int pointX = (int) event.getX(); int pointyY = (int) event.getY(); // 當用戶是按下和移動時 if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) { // 判定用戶是否點擊按鈕 if (pointX > btnX && pointX < btnX + bmpButton.getWidth()) { if (pointyY > btnY && pointyY < btnY + bmpButton.getHeight()) { isPress = true; } else { isPress = false; } } else { isPress = false; } // 當用於是抬起動作時 } else if (event.getAction() == MotionEvent.ACTION_UP) { // 判斷抬起時是否點擊按鈕,防止用戶移動到別處 if (pointX > btnX && pointX < btnX + bmpButton.getWidth()) { if (pointyY > btnY && pointyY < btnY + bmpButton.getHeight()) { isPress = false;//抬起後重置 還原Button狀態為未按下狀態 //改變當前游戲狀態為開始游戲 MySurfaceView.gameState = MySurfaceView.GAMEING; } } } } }
然後 在MySurfaceView中使用 GameMenu 使用菜單類
public class MySurfaceView extends SurfaceView implements Callback, Runnable { private SurfaceHolder sfh; private Paint paint; private Thread th; private boolean flag; private Canvas canvas; // 1 定義游戲狀態常量 public static final int GAME_MENU = 0;// 游戲菜單 public static final int GAMEING = 1;// 游戲中 public static final int GAME_WIN = 2;// 游戲勝利 public static final int GAME_LOST = 3;// 游戲失敗 public static final int GAME_PAUSE = -1;// 游戲菜單 // 當前游戲狀態(默認初始在游戲菜單界面) public static int gameState = GAME_MENU; // 聲明一個Resources實例便於加載圖片 private Resources res = this.getResources(); // 聲明游戲需要用到的圖片資源(圖片聲明) private Bitmap bmpBackGround;// 游戲背景 private Bitmap bmpBoom;// 爆炸效果 private Bitmap bmpBoosBoom;// Boos爆炸效果 private Bitmap bmpButton;// 游戲開始按鈕 private Bitmap bmpButtonPress;// 游戲開始按鈕被點擊 private Bitmap bmpEnemyDuck;// 怪物鴨子 private Bitmap bmpEnemyFly;// 怪物蒼蠅 private Bitmap bmpEnemyBoos;// 怪物豬頭Boos private Bitmap bmpGameWin;// 游戲勝利背景 private Bitmap bmpGameLost;// 游戲失敗背景 private Bitmap bmpPlayer;// 游戲主角飛機 private Bitmap bmpPlayerHp;// 主角飛機血量 private Bitmap bmpMenu;// 菜單背景 public static Bitmap bmpBullet;// 子彈 public static Bitmap bmpEnemyBullet;// 敵機子彈 public static Bitmap bmpBossBullet;// Boss子彈 public static int screenW; public static int screenH; // private GameMenu gameMenu; /** * SurfaceView初始化函數 */ public MySurfaceView(Context context) { super(context); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setColor(Color.WHITE); paint.setAntiAlias(true); setFocusable(true); } /** * SurfaceView視圖創建,響應此函數 */ @Override public void surfaceCreated(SurfaceHolder holder) { screenW = this.getWidth(); screenH = this.getHeight(); initGame(); flag = true; // 實例線程 th = new Thread(this); // 啟動線程 th.start(); } /** * 加載游戲資源 */ private void initGame() { // 加載游戲資源 bmpBackGround = BitmapFactory .decodeResource(res, R.drawable.background); bmpBoom = BitmapFactory.decodeResource(res, R.drawable.boom); bmpBoosBoom = BitmapFactory.decodeResource(res, R.drawable.boos_boom); bmpButton = BitmapFactory.decodeResource(res, R.drawable.button); bmpButtonPress = BitmapFactory.decodeResource(res, R.drawable.button_press); bmpEnemyDuck = BitmapFactory.decodeResource(res, R.drawable.enemy_duck); bmpEnemyFly = BitmapFactory.decodeResource(res, R.drawable.enemy_fly); bmpEnemyBoos = BitmapFactory.decodeResource(res, R.drawable.enemy_pig); bmpGameWin = BitmapFactory.decodeResource(res, R.drawable.gamewin); bmpGameLost = BitmapFactory.decodeResource(res, R.drawable.gamelost); bmpPlayer = BitmapFactory.decodeResource(res, R.drawable.player); bmpPlayerHp = BitmapFactory.decodeResource(res, R.drawable.hp); bmpMenu = BitmapFactory.decodeResource(res, R.drawable.menu); bmpBullet = BitmapFactory.decodeResource(res, R.drawable.bullet); bmpEnemyBullet = BitmapFactory.decodeResource(res, R.drawable.bullet_enemy); bmpBossBullet = BitmapFactory .decodeResource(res, R.drawable.boosbullet); //菜單類實例化 gameMenu = new GameMenu(bmpMenu, bmpButton, bmpButtonPress); } /** * 游戲繪圖 */ public void myDraw() { try { canvas = sfh.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.WHITE); // 繪圖函數根據游戲狀態不同進行不同繪制 switch (gameState) { case GAME_MENU: gameMenu.draw(canvas, paint); break; case GAMEING: break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; default: break; } } } catch (Exception e) { // TODO: handle exception } finally { if (canvas != null) sfh.unlockCanvasAndPost(canvas); } } /** * 觸屏事件監聽 */ @Override public boolean onTouchEvent(MotionEvent event) { switch (gameState) { case GAME_MENU: gameMenu.onTouchEvent(event); break; case GAMEING: break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } return true; } /** * 按鍵事件監聽 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (gameState) { case GAME_MENU: break; case GAMEING: break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (gameState) { case GAME_MENU: break; case GAMEING: break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } return super.onKeyUp(keyCode, event); } /** * 游戲邏輯 */ private void logic() { switch (gameState) { case GAME_MENU: break; case GAMEING: break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } } @Override public void run() { while (flag) { long start = System.currentTimeMillis(); myDraw(); logic(); long end = System.currentTimeMillis(); try { if (end - start < 50) { Thread.sleep(50 - (end - start)); } } catch (InterruptedException e) { e.printStackTrace(); } } } /** * SurfaceView視圖狀態發生改變,響應此函數 */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } /** * SurfaceView視圖消亡時,響應此函數 */ @Override public void surfaceDestroyed(SurfaceHolder holder) { flag = false; } }
效果圖:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
開發背景最近是在做一個與健身相關的APP,裡面有訓練器模塊基本功能是按照特點動作的演示和描述來引導用戶完成訓練。在第一個版本時由於沒接觸過些類項目與功能花了幾周的時間大概
官方原文鏈接本文將介紹Services的定義、創建、啟動、綁定、前台Service等相關內容。Service是Android中一個類,它是Android四大組件之一,使用
上文中介紹了安卓客戶端與服務器交互,實現注冊功能,Android客戶端實現注冊/登錄詳解(一)本文將繼續介紹App與服務器的交互實現登錄和自動登錄的功能,上文說到請求服務
開發一個簡潔而實用的Android圖片加載緩存框架,並在內存占用與加載圖片所需時間這兩個方面與主流圖片加載框架之一Universal Image Loader做出比較,來