![](/img/trans.png)
[英]How to handle the 4 sides of rect object in case of intersectsWith another one?
[英]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.