最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實(shí)戰(zhàn)打飛機(jī)游戲之無限循環(huán)的背景圖(2)

 更新時(shí)間:2016年07月26日 11:58:53   作者:liudao7994  
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)打飛機(jī)游戲之無限循環(huán)的背景圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

首先分析下游戲界面內(nèi)的元素:
無限滾動的背景圖, 可以操作的主角,主角的子彈, 主角的血量,兩種怪物(敵機(jī)),一個(gè)boss, boss的爆炸效果.

先看效果圖

1、首先實(shí)現(xiàn)無限滾動的背景圖 原理: 定義兩個(gè)位圖對象 當(dāng)?shù)谝粋€(gè)位圖到末尾是 第二個(gè)位圖從第一個(gè)位圖的末尾跟上.

public class GameBg {
 // 游戲背景的圖片資源
 // 為了循環(huán)播放,這里定義兩個(gè)位圖對象,
 // 其資源引用的是同一張圖片
 private Bitmap bmpBackGround1;
 private Bitmap bmpBackGround2;

 // 游戲背景坐標(biāo)
 private int bg1x, bg1y, bg2x, bg2y;

 private int speed = 3;

 public GameBg(Bitmap bmpBackGround) {
  this.bmpBackGround1 = bmpBackGround;
  this.bmpBackGround2 = bmpBackGround;
  // 首先讓第一張?zhí)顫M屏幕
  bg1y = -Math.abs(bmpBackGround.getHeight() - MySurfaceView.screenH);

  bg2y = bg1y - bmpBackGround1.getHeight() +50;
 }

 public void draw(Canvas canvas,Paint paint){

  canvas.drawBitmap(bmpBackGround1, bg1x, bg1y, paint);
  canvas.drawBitmap(bmpBackGround2, bg2x, bg2y, paint);
 }
 public void logic(){
  bg1y +=speed;
  bg2y +=speed;

  if(bg1y > MySurfaceView.screenH){
   bg1y = bg2y - bmpBackGround1.getHeight() +50;
  }
  if(bg2y > MySurfaceView.screenH){
   bg2y = bg1y - bmpBackGround1.getHeight() +50;
  }
 }

}

然后再在MySurfaceview里面調(diào)用方法

public class MySurfaceView extends SurfaceView implements Callback, Runnable {
 private SurfaceHolder sfh;
 private Paint paint;
 private Thread th;
 private boolean flag;
 private Canvas canvas;

 // 1 定義游戲狀態(tài)常量
 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;// 游戲菜單
 // 當(dāng)前游戲狀態(tài)(默認(rèn)初始在游戲菜單界面)
 public static int gameState = GAME_MENU;
 // 聲明一個(gè)Resources實(shí)例便于加載圖片
 private Resources res = this.getResources();
 // 聲明游戲需要用到的圖片資源(圖片聲明)
 private Bitmap bmpBackGround;// 游戲背景
 private Bitmap bmpBoom;// 爆炸效果
 private Bitmap bmpBoosBoom;// Boos爆炸效果
 private Bitmap bmpButton;// 游戲開始按鈕
 private Bitmap bmpButtonPress;// 游戲開始按鈕被點(diǎn)擊
 private Bitmap bmpEnemyDuck;// 怪物鴨子
 private Bitmap bmpEnemyFly;// 怪物蒼蠅
 private Bitmap bmpEnemyBoos;// 怪物豬頭Boos
 private Bitmap bmpGameWin;// 游戲勝利背景
 private Bitmap bmpGameLost;// 游戲失敗背景
 private Bitmap bmpPlayer;// 游戲主角飛機(jī)
 private Bitmap bmpPlayerHp;// 主角飛機(jī)血量
 private Bitmap bmpMenu;// 菜單背景
 public static Bitmap bmpBullet;// 子彈
 public static Bitmap bmpEnemyBullet;// 敵機(jī)子彈
 public static Bitmap bmpBossBullet;// Boss子彈
 public static int screenW;
 public static int screenH;

 //
 private GameMenu gameMenu;
 private GameBg gameBg;

 /**
  * SurfaceView初始化函數(shù)
  */
 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視圖創(chuàng)建,響應(yīng)此函數(shù)
  */
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  screenW = this.getWidth();
  screenH = this.getHeight();
  initGame();
  flag = true;
  // 實(shí)例線程
  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);

  //菜單類實(shí)例化
  gameMenu = new GameMenu(bmpMenu, bmpButton, bmpButtonPress);

  gameBg = new GameBg(bmpBackGround);

 }

 /**
  * 游戲繪圖
  */
 public void myDraw() {
  try {
   canvas = sfh.lockCanvas();
   if (canvas != null) {
    canvas.drawColor(Color.WHITE);
    // 繪圖函數(shù)根據(jù)游戲狀態(tài)不同進(jìn)行不同繪制

    switch (gameState) {
    case GAME_MENU:

     gameMenu.draw(canvas, paint);
     break;
    case GAMEING:
     gameBg.draw(canvas, paint);
     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);
  }
 }

 /**
  * 觸屏事件監(jiān)聽
  */
 @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;
 }

 /**
  * 按鍵事件監(jiān)聽
  */
 @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:
   gameBg.logic();
   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視圖狀態(tài)發(fā)生改變,響應(yīng)此函數(shù)
  */
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
 }

 /**
  * SurfaceView視圖消亡時(shí),響應(yīng)此函數(shù)
  */
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  flag = false;
 }
}


以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android使用DisplayManager創(chuàng)建虛擬屏流程及原理解析

    Android使用DisplayManager創(chuàng)建虛擬屏流程及原理解析

    這篇文章主要介紹了Android使用DisplayManager創(chuàng)建虛擬屏流程及原理解析,DisplayManager提供了createVirtualDisplay接口,用于創(chuàng)建虛擬屏,虛擬屏可以把屏幕分出不同的區(qū)域,需要的朋友可以參考下
    2024-05-05
  • android UI繪制加減號按鈕

    android UI繪制加減號按鈕

    這篇文章主要為大家詳細(xì)介紹了android UI繪制加減號按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Android Studio無法改變Button背景顏色解決辦法

    Android Studio無法改變Button背景顏色解決辦法

    今天我來和大家探討一個(gè)在Android開發(fā)中常見但可能讓初學(xué)者感到困惑的問題,如何在Android Studio中改變Button的背景顏色,這個(gè)問題看似簡單,但實(shí)際操作中可能會遇到一些意想不到的挑戰(zhàn),接下來,我將從多個(gè)角度為大家提供解決方案,需要的朋友可以參考下
    2024-05-05
  • Android實(shí)現(xiàn)淘寶底部圖標(biāo)導(dǎo)航欄

    Android實(shí)現(xiàn)淘寶底部圖標(biāo)導(dǎo)航欄

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)淘寶底部圖標(biāo)導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android Fragment源碼分析Add方法

    Android Fragment源碼分析Add方法

    Fragment是Android3.0后引入的一個(gè)新的API,他出現(xiàn)的初衷是為了適應(yīng)大屏幕的平板電腦, 當(dāng)然現(xiàn)在他仍然是平板APP UI設(shè)計(jì)的寵兒,而且我們普通手機(jī)開發(fā)也會加入這個(gè)Fragment, 我們可以把他看成一個(gè)小型的Activity,又稱Activity片段
    2022-08-08
  • Android開發(fā)中ViewPager實(shí)現(xiàn)多頁面切換效果

    Android開發(fā)中ViewPager實(shí)現(xiàn)多頁面切換效果

    ViewPager用于實(shí)現(xiàn)多頁面的切換效果,該類存在于Google的兼容包里面,所以在引用時(shí)記得在BuilldPath中加入“Android-support-v4.jar”。具體詳情大家可以參考下本文
    2016-11-11
  • Android仿支付寶微信支付密碼界面彈窗封裝dialog

    Android仿支付寶微信支付密碼界面彈窗封裝dialog

    這篇文章主要介紹了Android仿支付寶微信支付密碼界面彈窗封裝dialog的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • Android 捕獲錯(cuò)誤日志的方法

    Android 捕獲錯(cuò)誤日志的方法

    這篇文章主要介紹了Android 捕獲錯(cuò)誤日志的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Flutter路由的幾種用法小結(jié)

    Flutter路由的幾種用法小結(jié)

    這篇文章主要介紹了Flutter路由的幾種用法,包括基本路由跳轉(zhuǎn)和路由跳轉(zhuǎn)傳參方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Android對話框AlertDialog詳解

    Android對話框AlertDialog詳解

    本文詳細(xì)講解了Android對話框AlertDialog的實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評論

阿城市| 同江市| 泽州县| 洛宁县| 开阳县| 札达县| 乌什县| 六枝特区| 文安县| 邯郸市| 临夏县| 铁岭县| 高邑县| 凤庆县| 那坡县| 黄浦区| 历史| 宝鸡市| 清新县| 阿拉善左旗| 邵武市| 河曲县| 台山市| 苏尼特左旗| 岐山县| 珲春市| 谢通门县| 怀宁县| 思南县| 长白| 武城县| 偏关县| 新干县| 安国市| 綦江县| 阳高县| 绍兴市| 措美县| 大城县| 穆棱市| 扶沟县|