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

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

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

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

先看效果圖

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

public class GameBg {
 // 游戲背景的圖片資源
 // 為了循環(huán)播放,這里定義兩個(gè)位圖對(duì)象,
 // 其資源引用的是同一張圖片
 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;// 游戲開(kāi)始按鈕
 private Bitmap bmpButtonPress;// 游戲開(kāi)始按鈕被點(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);
  // 啟動(dòng)線程
  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)聽(tīng)
  */
 @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)聽(tīng)
  */
 @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;
 }
}


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(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繪制加減號(hào)按鈕

    android UI繪制加減號(hào)按鈕

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

    Android Studio無(wú)法改變Button背景顏色解決辦法

    今天我來(lái)和大家探討一個(gè)在Android開(kāi)發(fā)中常見(jiàn)但可能讓初學(xué)者感到困惑的問(wèn)題,如何在Android Studio中改變Button的背景顏色,這個(gè)問(wèn)題看似簡(jiǎn)單,但實(shí)際操作中可能會(huì)遇到一些意想不到的挑戰(zhàn),接下來(lái),我將從多個(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ī)開(kāi)發(fā)也會(huì)加入這個(gè)Fragment, 我們可以把他看成一個(gè)小型的Activity,又稱Activity片段
    2022-08-08
  • Android開(kāi)發(fā)中ViewPager實(shí)現(xiàn)多頁(yè)面切換效果

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

    ViewPager用于實(shí)現(xiàn)多頁(yè)面的切換效果,該類存在于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ò)誤日志的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Flutter路由的幾種用法小結(jié)

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

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

    Android對(duì)話框AlertDialog詳解

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

最新評(píng)論

郁南县| 潢川县| 科尔| 垫江县| 塔河县| 阿荣旗| 元江| 凤阳县| 沙湾县| 灌云县| 措美县| 宝应县| 碌曲县| 如皋市| 安乡县| 彭阳县| 梅河口市| 邛崃市| 昭通市| 深泽县| 佳木斯市| 长宁区| 双辽市| 东港市| 文水县| 孝义市| 荃湾区| 文山县| 娄底市| 湖北省| 泗阳县| 万全县| 拉萨市| 大悟县| 射阳县| 容城县| 都匀市| 许昌县| 土默特右旗| 福安市| 阳新县|