如何检测该区域是否100%涂在as3中

时间:2013-03-12 04:19:01

标签: actionscript-3 flash bitmap paint bitmapdata

我正在制作一个模拟泛行业的游戏,其中一个过程就是绘画。

我想要做的是让玩家画平底锅,但我不希望它很容易使用FILL,我希望玩家用画笔画锅,然后游戏检测是否所有区域画了,让玩家前进。

对于绘画我打算使用该库:http://www.nocircleno.com/graffiti/

但我不知道如何检测是否所有区域都被涂上了。有人能告诉我某种方式吗?

3 个答案:

答案 0 :(得分:6)

其中一种方法是 - 你制作一个具有透明度并且不透明的屏蔽BitmapData,你需要你的玩家画画。 (根据需要对其进行着色,但要确保颜色完全不透明)。然后收集histogram()然后查询第255个值的alpha矢量,这将是填充零百分比的初始值。它们的范围为0-255,因此您不能使用100或任何其他固定值。然后,当玩家正在绘画时,您将画笔绘制在BitmapData上,blendMode参数设置为BlendMode.ERASE,这将净化您的BitmapData以获得绘制画笔的透明度。在播放器以任何方式完成绘制后(例如,涂料已用完),您在BitmapData上运行另一个histogram(),并查询Alpha通道矢量的第255个值。 0表示位图是完全透明的(或者至少只有少量像素保持不透明),因此您可以将零计为100%填充,对于任何更大的使用比例。

var bd:BitmapData=new BitmapData(w,h,true,0x0); // fully transparent initial bitmap
bd.draw(yourPaintBase); // a shape that designates area to be painted. Must be fully opaque
var bm:Bitmap=new Bitmap(bd);
// position it as needed, so the area which should be painted is aligned to wherever you need
addChild(bm);
addEventListener(Event.ENTER_FRAME,doPaint);
var baseValue:int=bd.histogram()[3][255]; // Vector #3 contains alpha, #255 contains 
// percentage of those pixels that have alpha of 255 = fully opaque
function doPaint(e:Event):void {
    if (!areWePainting) return;
    var sh:Shape=getBrush(); // shuold return an existing Shape object reference for performance
    sh.x=e.localX;
    sh.y=e.localY; // we are drawing where the mouse is
    bd.draw(sh,null,null,BlendMode.ERASE);
    decreasePaint(); // we have used some paint
    if (noMorePaint()) {
        e.target.removeEventListener(Event.ENTER_FRAME,doPaint);
        var endValue:int=Math.floor(100*(1-bd.histogram()[3][255]/baseValue));
        // aligning to percentage. This is the value you seek
        reportFilledPercentage(endValue);
    }
}

答案 1 :(得分:2)

您可以对BitmapData上的像素进行迭代,然后使用getPixel()检查所有像素的颜色是否为白色。如果找到白色,则图像未完全涂漆。

这样的事情:

function containsWhite(bitmapData:BitmapData):Boolean
{
    for(var c:int = 0; c < bitmapData.width; c++)
    {
        for(var r:int = 0; r < bitmapData.height; r++)
        {
            // Check if pixel is white.
            if(bitmapData.getPixel(c, r) >= 0xFFFFFF)
            {
                return true;
            }
        }
    }

    return false;
}

答案 2 :(得分:0)

你基本上处理碰撞检测问题。从查看他们的API,您可以尝试使用getColorAtPoint的for循环,并尝试确定他们已经在每个像素处绘制。

如果所有其他方法都失败,请查看库使用对象的.hitTestObject方法生成的对象之间的冲突。

请参阅:http://sierakowski.eu/list-of-tips/39-collision-detection-methods-hittest-and-hittestobject-alternatives.html

这是为了了解某人如何处理与像素的碰撞:http://www.emanueleferonato.com/2010/08/05/worms-like-destructible-terrain-in-flash-part-2/