簡體   English   中英

如何測試一個矩形是否在另一個矩形中?

[英]How to test if one rect is in another rect?

好吧,所以我正在開發一款游戲,我發現我的敵人不喜歡我的碰撞檢測,這對我的玩家來說非常有效。 經過一些調試我發現它是因為我的敵人比我的瓷磚大,而我的玩家比我的瓷磚小。

現在我需要能夠成為大敵和老板,所以這不會做。 所以我需要找出一種更好的方法來測試碰撞檢測。 這就是我目前的做法:

上和下:

if((enemy.left > tile.left && enemy.left < tile.right || enemy.right > tile.left && enemy.right < tile.right) && enemy.top < tile.bottom && enemy.bottom > tile.top){
    //collision
}

左和右:

if((enemy.top > tile.top && enemy.top < tile.bottom || enemy.bottom > tile.top && enemy.bottom < tile.bottom) && enemy.left < tile.right && enemy.right > tile.left){
     //colision
}

在Java中,使用intersects(Rectangle r)

以下是如何正確進行分離軸測試(對於定向邊界框,就像你正在做的那樣)。

if (firstObject.Left < secondObject.Right && firstObject.Right > secondObject.Left
    && firstObject.Top < secondObject.Bottom && firstObject.Bottom > secondObject.Top)
{
    // Intersecting
}

轉到此站點,並使用圖3,一次性完成所有這些。 然后一次一個地打破每個測試。 你會憑經驗看到它有效,而且就像你能得到的一樣簡單:

http://www.metanetsoftware.com/technique/tutorialA.html#section1

如果你喜歡它,請閱讀整套教程。 一旦你開始在你的游戲中包含更多功能,它將是值得的:)

在.NET語言中,您可以使用Rectangle.IntersectsWith(Rectangle other)方法執行非常基本的碰撞檢測。

對於在Objective-C中工作的人尋找相同的答案,您可以使用:

bool CGRectIntersectsRect(CGRect rect1, CGRect rect2)

我認為問題在於

enemy.top < tile.bottom && enemy.bottom > tile.top

(在第一個代碼中),只有當敵人在瓷磚內完全(高度方面)時才會出現這種情況

enemy.top > tile.top && enemy.top < tile.bottom || enemy.bottom > tile.top && enemy.bottom < tile.bottom

就像你用左+右檢查一樣。

只是為了澄清這意味着你給的第一張支票將是:

if((enemy.left > tile.left && enemy.left < tile.right || enemy.right > tile.left && enemy.right < tile.right) && (enemy.top > tile.top && enemy.top < tile.bottom || enemy.bottom > tile.top && enemy.bottom < tile.bottom)){
//collision

}

有了這個我不認為你需要單獨上/下左/右檢查,如果敵人的任何部分在瓦片內,這應該返回true

精靈比拼貼寬,但“左右”代碼不檢查該情況。 如果我描繪你的代碼,它只是檢查敵人是否離開或敵人是否位於磁貼內:

(enemy.left > tile.left && enemy.left < tile.right
|| enemy.right > tile.left && enemy.right < tile.right)

// graphed as<br>
// TL EL TR ----- or ----- TL ER TR<br>

但如果整個瓷磚位於敵方區域內,則未檢測到任何擊中:

//  EL TL ----- and ----- TR ER

同樣,Tile比敵人更小,因此有必要檢查整個瓷磚是否位於敵人之內。 完整的圖形/偽代碼是:

 is_hit :
 // T{L,R,T,B} => tile, E{L,R,T,B} => enemy
 // left-right:
 [
  TL EL TR ----- or ----- TL ER TR
           . or .
  EL TL ----- and ----- TR ER
 ]
 .and.
 // top-bottom:
 [
  TT ET TB ----- or ----- TT EB TB
           . or .
  ET TT ----- and ----- TB EB
 ]

.Net中, Rect類中已經有一個名為Intersect(Rect rect)的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM