我正在製作一個模擬泛的行業的遊戲,其中一個過程就是繪畫。如何檢測該區域是否被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