actionscript 3 - AS3: كيف يمكنني مسح الرسومات في بكسل/منطقة محددة




actionscript-3 graphics (2)

فتح تجاوز كومة للرد على بعض الأسئلة، والتفكير في الساعة القادمة حول كيفية وضع الثقوب في الجبن ... :)

يمكنك أيضا تعيين الخاصية بليندمود كائن حفرة الخاص بك إلى BlendMode.ERASE في تركيبة مع cacheAsBitmap . هذا يعمل على غرار الأقنعة إلا أنك سوف تكون في الواقع رسم بائعي وليس المنطقة خارجها. هنا مثال:

//make cheese
var cheese:Sprite = new Sprite();
cheese.cacheAsBitmap = true;
stage.addChild(cheese);
cheese.x = cheese.y = 10;

//define holes 
var holes:Shape = new Shape();
holes.blendMode = BlendMode.ERASE;
cheese.addChild(holes);

//draw cheese
var g = cheese.graphics;
g.beginFill(0xFFCC00);
g.drawRect(0,0,200,150);

//**Attack chees with mices.
g = holes.graphics;
for (var i:int = 0; i < 10; i++){
    g.beginFill(0xFF00FF);
    var hx = Math.random()*(cheese.width-7)+7;
    var hy = Math.random()*(cheese.height-7)+7;
    var s = Math.random()*15;
    g.drawCircle(hx, hy, s);
    g.endFill();
}

النتيجة ستكون شيئا من هذا القبيل:

تصحيح:

تبين أنك لا تحتاج إلى استخدام cacheAsBitmap إذا قمت بتعيين وضع مزيج من الكائن الأصل إلى LAYER (وثيقة يقول أنه ينبغي تعيين تلقائيا ...) حتى تتمكن من استخدام cheese.blendMode = BlendMode.LAYER; بدلا من cheese.cacheAsBitmap = true; . وإذا كنت أتذكر بشكل صحيح، أقنعة أيضا لا تتطلب cahceAsBitmap ، حتى مع وضع مزج NORMAL .

وأنا أعلم أنك تستخدم graphics.clear لمسح كافة الرسومات ولكن أن مسح الرسومات من المرحلة، وأود أن مسح الرسومات في بكسل معين (ق) أو بين قيمة زي كيف أفعل ذلك؟


لا توجد طريقة للقيام بذلك مع الرسومات. حاولت فقط، رسم الأشكال شفافة لا تخلق ثقوب، للأسف.

يجب تحويل الرسومات لديك إلى مثيل النقطية والعمل مع وحدات البكسل:

package
{
    import flash.geom.Matrix;
    import flash.geom.Rectangle;

    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;

    public class Holey extends Sprite
    {
        public function Holey() 
        {
            super();

            // Lets create some example graphics.
            graphics.beginFill(0x990000);
            graphics.drawCircle(200, 200, 100);
            graphics.endFill();

            // Convert into raster and make 1 pixel transparent.
            var aBit:Bitmap = rasterize(this);
            aBit.bitmapData.setPixel32(50, 50, 0x00000000);

            graphics.clear();
            addChild(aBit);
        }

        private function rasterize(source:DisplayObject):Bitmap
        {
            // Obtain bounds of the graphics.
            var aBounds:Rectangle = source.getBounds(source);

            // Create raster of appropriate size.
            var aRaster:BitmapData = new BitmapData(aBounds.width, aBounds.height, true, 0x00000000);

            // Make an offset to capture all the graphics.
            var aMatrix:Matrix = new Matrix;
            aMatrix.translate(-aBounds.left, -aBounds.top);

            aRaster.draw(source, aMatrix);
            return new Bitmap(aRaster);
        }
    }
}