畫素精確碰撞演算法優化

2021-08-31 02:12:29 字數 2112 閱讀 9036

package

public static function intersectionrectangle(target1:displayobject, target2:displayobject):rectangle

public static function complexintersectionrectangle(target1:displayobject, target2:displayobject, scalex:number , scaley:number , pt:point , ct:colortransform ,oldhitrectangle:rectangle,hitrectangle:rectangle,noww:int,nowh:int):rectangle

//繪製物件2其縮放比例和位移量由getdrawmatrix()函式計算,並且把不透明處繪製為ct的顏色,並且模式為疊加。如此一來兩個物件重疊的部分顏色值必定大於0xff00000f。

bitmapdata.draw(target2, bitmaphittestplus.getdrawmatrix(target2, hitrectangle , scalex , scaley ),ct, blendmode.add);

//把所有顏色值大於0xff00000f的部分(也就是重疊部分)重新替換為不透明紅色方便後面getcolorboundsrect()方法計算尺寸。這裡替換的原因是getcolorboundsrect()不支援範圍取色而只支援單色計算。

//物件1縮放後可以重新替換掉透明色,但是物件2則無法使用同一方法,但是物件2由於也是經過縮放繪製也會有半透明畫素,那麼重疊部分雖然全部大於0xff00000f,但未必是統一的。

var hits:int=bitmapdata.threshold(bitmapdata,bitmapdata.rect,pt,">",0xff00000f,0xffff0000)

//判斷紅色區域尺寸

var intersection:rectangle=bitmapdata.getcolorboundsrect(0xffffffff, 0xffff0000);

//

bitmapdata = null

//如果紅色區域寬度不為0,即bitmapdata中含有紅色畫素。此時說明物件1和物件2在此次判定中有重疊有碰撞

if(intersection.width!=0)else

if(intersection.height!=nowh)else

//根據檢測出來的縮的碰撞區域來計算未縮小的碰撞區域大小以方便下一次計算的時候縮小檢測範圍。

oldhitrectangle.x += (intersection.x - xadd) * scalex

oldhitrectangle.y += (intersection.y - yadd) * scaley

oldhitrectangle.width = (intersection.width + xadd*2) * scalex

oldhitrectangle.height = (intersection.height + yadd*2) * scaley

//根據檢測期望縮小到的尺寸重新計算縮小倍率

scalex = (oldhitrectangle.width / nextw)

scaley = (oldhitrectangle.height / nexth)

//如果倍率小於2則直接按原始尺寸

scalex = scalex < 2 ? 1 : scalex

scaley = scaley < 2 ? 1 : scaley

//進行下一次判定

intersection=complexintersectionrectangle(target1,target2, scalex , scaley ,pt,ct,oldhitrectangle,hitrectangle,nextw,nexth) }}

}return intersection;

} protected static function getdrawmatrix(target:displayobject, hitrectangle:rectangle , scalex:number , scaley:number ):matrix

}}

畫素級碰撞的一種演算法

在 flash 中,任何形狀的元件都是被包含在乙個完整的矩形容器裡的,此碰撞演算法就是根據這一點來獲取兩個不規則形狀的交集,這麼說可能你聽起來有些不明白,我們來進一步解釋一下。假如我們這裡有兩個不規則形狀的 mc 即 mc1 和 mc2 如下圖 為了更方便於的理解,我將形狀做在的容器 mc1 和 m...

xna畫素的碰撞檢測

畫素碰撞檢測要點在於檢測兩個交叉影象畫素點的的透明度alpha。這樣可以提公升碰撞檢測的精確度。一般的我們選取人物,怪物遊戲素材影象,都不可能佔滿整個影象 如果我們以整張定義乙個矩形方框來檢測碰撞顯然不夠精確 但其實已經夠用 我們的主角可能沒碰到這顆樹就發生了碰撞檢測 掛掉了 我們希望的是主角真正的...

碰撞遍歷的優化

碰撞遍歷的優化 1,逐單位兩兩檢測,時間複雜度o n 2 只適用於少量單位檢測,效能隨著單位數量增加呈二次曲線下降 2,分階段檢測,broad phase和narrow phase,即粗篩和細篩 3,粗篩使用aabb檢測,不旋轉,簡單的整數加減,效能很高。快速篩選出可能碰撞單位進行細篩 4,narr...