我正在制作一个模拟泛的行业的游戏,其中一个过程就是绘画。如何检测该区域是否被100%涂成as3
我想要做的是让玩家在平底锅上画画,但是我不想让它变得容易使用FILL,我希望玩家用画笔画出平底锅,然后游戏检测是否所有的区域被涂上,让玩家前进。
对于绘画我打算使用该库:http://www.nocircleno.com/graffiti/
,但我不知道如何来检测,如果所有的区域被涂。有人能告诉我一些这样做吗?
我正在制作一个模拟泛的行业的游戏,其中一个过程就是绘画。如何检测该区域是否被100%涂成as3
我想要做的是让玩家在平底锅上画画,但是我不想让它变得容易使用FILL,我希望玩家用画笔画出平底锅,然后游戏检测是否所有的区域被涂上,让玩家前进。
对于绘画我打算使用该库:http://www.nocircleno.com/graffiti/
,但我不知道如何来检测,如果所有的区域被涂。有人能告诉我一些这样做吗?
的方法之一是 - 您将已有的透明度和不透明到位屏蔽的BitmapData您需要你的玩家画画。 (根据需要着色,但要确保颜色完全不透明)。然后收集histogram()
,然后查询第255个值的alpha向量,这将是零填充百分比的初始值。这些范围从0到255,因此您不能使用100或任何其他固定值。然后,当玩家正在绘画时,您将画笔绘制在该位图数据上,其参数设置为blendMode
,这将使您的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);
}
}
您可以迭代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;
}
值得一提的是,虽然这是正确的过程,它也是在处理器上一个非常沉重的过程,可能会很慢,取决于位图的大小。 – 2013-03-12 16:16:44
的确如此 - 您可以将较大的图像分解为块,然后分别对每个块执行检查。一旦所有的块都被评估过,你可以实现回调来接受真/假响应。这是一个很好的候选人的异步方法:) – Marty 2013-03-12 21:22:11
这是一个很好的候选卸载到工人或PixelBender,诚实。不过,显然你只能使用非移动项目的工作人员。 – 2013-03-12 21:48:57
你基本上是处理碰撞检测问题。从看他们的API,你可以尝试像getColorAtPoint for循环,并试图确定他们已经在每个像素绘制。
如果所有其他操作都无法查看库使用对象的.hitTestObject方法生成的对象之间的冲突。
而这,看看别人是如何处理与像素碰撞:http://www.emanueleferonato.com/2010/08/05/worms-like-destructible-terrain-in-flash-part-2/
对于我来说,你的回答比其他问题要难一些。 。但是如果我掌握了你的方式,我可以将我想要的图像放在盾牌后面。我会先试试你的答案,如果它对我来说太复杂了,我会试试其他的。 我无法为您的答案投票。我会尽力帮助一些人,当我有15个声望时,我会确定你的胜利。 – Pyva 2013-03-13 03:47:14