我正在制作一个模拟泛行业的游戏,其中一个过程就是绘画。
我想要做的是让玩家画平底锅,但我不希望它很容易使用FILL,我希望玩家用画笔画锅,然后游戏检测是否所有区域画了,让玩家前进。
对于绘画我打算使用该库:http://www.nocircleno.com/graffiti/
但我不知道如何检测是否所有区域都被涂上了。有人能告诉我某种方式吗?
答案 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://www.emanueleferonato.com/2010/08/05/worms-like-destructible-terrain-in-flash-part-2/