簡體   English   中英

針對精靈的AS3透明png碰撞檢測

[英]AS3 transparent png collision detection against a sprite

我在這里,因為我目前正忙着為我的AS3應用程序進行碰撞檢測。 我正在加載一個位圖,代表一個房間 - 它有邊界(牆),其余部分是透明的(地板)。 然后我創建一個內部有圓圈的精靈。

我想我的精靈在這些邊界內移動並停在牆上,我能夠實現后面的邏輯,我要求的是一種檢測與牆碰撞的方法,我的整個房間都是位圖,所以我猜我只會檢查與這個位圖的碰撞,但不幸的是它也會計算透明部分。

我已經對此進行了谷歌研究,但我發現非常復雜的系統無論如何都無法運行。 我這樣做是出於學習目的,所以我想知道如何自己實現它。

因此,我問是否有人可以為我提供一段代碼,只檢查我位圖的非透明部分的碰撞? (或者我應該將此png作為向量加載?怎么做?)。

我也在旋轉我的“圈子”,所以我想這也應該考慮。 我假設我應該做位圖檢查位圖而不是精靈到位圖?

我根本沒有碰撞的工作代碼,所以我不會提供任何代碼。

我應該提供更多信息請告訴我。

提前致謝!

@編輯

這是我的功能代碼,它屬於Room Class。

public function detectCollisionWith(obj:Sprite):Boolean
    {
        var _bitmapData:BitmapData = new BitmapData(obj.width, obj.height, true, 0);
        _bitmapData.draw(obj);
        var _bitmap:Bitmap = new Bitmap(_bitmapData);
        if (_bitmapData.hitTest(new Point(_bitmap.x, _bitmap.y), 255, this.bitmap, new Point(this.x, this.y), 255))
            return true;
        return false;
    }

使用BitmapData hitTest()當它們都是位圖時,您可以非常輕松地檢查這一點。

位於bitmapData Adobe hitTest()

在一個位圖圖像與點,矩形或其他位圖圖像之間執行像素級命中檢測。 命中被定義為不透明像素上的點或矩形的重疊,或兩個重疊的不透明像素。 執行命中測試時,不考慮任何對象的拉伸,旋轉或其他變換。


現在舉例說明如何實現它。 如果你將精靈變成位圖:

var spriteBmd:BitmapData = new BitmapData( mySprite.width, mySprite.height, true, 0 );
spriteBmd.draw( mySprite ); //get the sprite asset
var spriteBitmap:Bitmap = new Bitmap( spriteBmd ); //create the bitmap to use

然后你可以針對兩個位圖運行hitTest()而忽略透明部分:

if ( spriteBitmap.bitmapData.hitTest( new Point( mySprite.x, mySprite.y ), 
     255, levelBitmap, new Point( levelBitmap.x, levelBitmap.y ), 255 ) ) {
    trace("Collision detected");
}

這僅檢查位圖的不透明部分是否存在沖突。 如果要增加檢測允許的透明度,可以在if語句中調整值255

很多年前做過...但如果我沒有錯,你可以解決問題,創建一個帶有牆的矢量形狀的MC(將它放在牆下)並檢查與它的碰撞,而不是與位圖。

簡單的房間? 它是簡單的矩形嗎? 因此,我建議通過檢查預定義矩形中的點來計算碰撞。 創建矩形,在圓的半徑上插入它的大小,並檢查矩形內部的圓心

//Some room
var roomBounds:Rectangle = new Rectangle(0, 0, 700, 500);
const circleRadius:int = 10;
var collisionBounds: Rectangle = new Rectangle(circleRadius, circleRadius, roomBounds.width - 2*circleRadius, roomBounds.height - 2*circleRadius);

//Check if center of circle inside of collisionBounds
//For example you have point with name circlePosition
//collisionBounds.containsPoint(circlePosition)
if(!collisionBounds.contains(circleX, circleY)){
    trace("Houston! We have collision here!");
}

暫無
暫無

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

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