Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android研究之游戲開發碰撞檢測

Android研究之游戲開發碰撞檢測

編輯:關於Android編程



游戲碰撞的大致可以分為這幾種類

1.主角與邊界的碰撞,限制主角不能走出手機屏幕外。
2.主角與物理層的碰撞,與地圖中的房子 桌子 椅子等等。
3.主角與游戲人物之間的碰撞,這裡指NPC等。
4.主角與腳本框發生的碰撞,例如走進房間出線一段劇情對話等等。

由此可見游戲中的碰撞主要是可以分為

1.點與矩形之間的碰撞
2.矩形與矩形之間的碰撞
3.圓形與圓形之間的碰撞
4.圓形與矩形之間的碰撞

今天我主要介紹一下以上中最特殊的一個碰撞方式 主角與物理層之間的碰撞。 如圖所示:每個小方塊中儲存著地圖塊的信息,在二位數組中如果為-1表示屬於物理層不可通過,其它均可通過。也就是說-1 這個地圖塊的位置繪制這物理層的東西。主角在行走的時候通過自己的坐標原點計算出自己在二位數組中的索引,然後根據索引找到數組中的數值 判斷自己是否可以通過。對動畫不明白的請看Android研究之游戲開發幀動畫實現

Android研究之游戲開發碰撞檢測(四) - 第1張

繪制地圖

根據地圖編輯器生成出來的數組,一定是先繪制背景層地圖,然後在繪制第物理地圖等等。
物理碰撞層生成的數組 是不用繪制的,只需要每次主角移動坐標的時候檢測是否與物理層發生碰撞.

背景底層

Android研究之游戲開發碰撞檢測(四) - 第2張

物理層

Android研究之游戲開發碰撞檢測(四) - 第3張

碰撞層

Android研究之游戲開發碰撞檢測(四) - 第4張

說到這裡可能有些朋友會問為什麼第一層要和第二層分開? 這兩層不能合二為一嗎?

如圖所示:用兩個圖層主要是為了解決物理層圖片不能全部顯示,好比下面這個荷花, 它的繪制區域在矩形中 周圍白色的則是透明的區域,所以我們需要先繪制地圖背景層在繪制物理層這樣就可以遮蓋透明區域。

Android研究之游戲開發碰撞檢測(四) - 第5張

代碼的實現方式

首先我們需要利用onKeyDown()和onKeyUp()方法確定當前手機那個按鍵被按下,根據按鍵信息更新人物動畫,檢測是否碰撞。
mIskeyDown = true 表示 按下方向鍵下
mIskeyLeft = true 表示 按下方向鍵左
mIskeyRight = true 表示 按下方向鍵右
mIskeyUp = true 表示 按下方向鍵上
mHeroPosX 表示人物的X坐標
mHeroPosY 表示人物的Y坐標
mAnimationState 表示播放動畫的ID 因為人物行走有4組方向的動畫 所以 mAnimationState 可以修改播放那組動畫


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /** 根據按鍵更新顯示動畫 **/ /** 在碰撞數組中尋找看自己是否與地圖物理層發生碰撞 **/ if (mIskeyDown) { mAnimationState = ANIM_DOWN; mHeroPosY += HERO_STEP; } else if (mIskeyLeft) { mAnimationState = ANIM_LEFT; mHeroPosX -= HERO_STEP; } else if (mIskeyRight) { mAnimationState = ANIM_RIGHT; mHeroPosX += HERO_STEP; } else if (mIskeyUp) { mAnimationState = ANIM_UP; mHeroPosY -= HERO_STEP; }

主角每次移動的時候我們還需要檢測一下他的X Y坐標是否超出屏幕
如果超出屏幕則保持他目前的位置不變


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /** 檢測人物是否出屏 **/ isBorderCollision = false; if (mHeroPosX <= 0) { mHeroPosX = 0; isBorderCollision =true; } else if (mHeroPosX >= mScreenWidth) { mHeroPosX = mScreenWidth; isBorderCollision =true; } if (mHeroPosY <= 0) { mHeroPosY = 0; isBorderCollision =true; } else if (mHeroPosY >= mScreenHeight) { mHeroPosY = mScreenHeight; isBorderCollision =true; }

主角應該有兩個坐標點

如圖所示: 為什麼主角要有2個坐標點的原因是 左上角的00點程序是不能進行邏輯判斷的 比如檢測主角向右移動走超出屏幕,因為坐標點在左上角 所以整個圖片都走出屏幕以後程序才能判斷出人物出屏, 所以不能用左上角的點來作為主角的坐標原點,須要用下面的點來計算人物的邏輯坐標 我的建議是我們只計算下面這個點然後根據這個點在算出來圖片左上角的原點,然後在通知圖像繪制。

Android研究之游戲開發碰撞檢測(四) - 第6張

判斷碰撞檢測

mCollision[][]這個二維數是地圖編輯器生成出來的,用來組保存碰撞層的所有信息 -1表示不能通過
mHeroIndexX 、mHeroIndexY 代表當前人物在二位數組中的索引位置,根據索引找到二維數組中的值判斷是否碰撞
mBackHeroPosX、mBackHeroPosY 備份發生碰撞前人物的坐標 一旦碰撞以後將使用備份的坐標 避免人物碰撞後不能返回。


1 2 3 4 5 6 7 8 9 if (mCollision[mHeroIndexY][mHeroIndexX] == -1) { mHeroPosX = mBackHeroPosX; mHeroPosY = mBackHeroPosY; isAcotrCollision = true; } else { mBackHeroPosX = mHeroPosX; mBackHeroPosY = mHeroPosY; isAcotrCollision = false; }

我用我寫的一個碰撞的demo和大家展示一下游戲碰撞的效果

與實體層發生碰撞 Android研究之游戲開發碰撞檢測(四) - 第7張  Android研究之游戲開發碰撞檢測(四) - 第8張  邊界碰撞 Android研究之游戲開發碰撞檢測(四) - 第9張  最後由於代碼較多我就不貼在博客中了 , 下面給出Demo源碼的下載歡迎大家下載閱讀互相學習,互相研究,互相討論一起進步。 源碼下載:Android碰撞
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved