2013-03-12 6 views
3

저는 팬 산업을 시뮬레이션하는 게임을 만들고 있습니다. 그 중 하나가 그림입니다.영역이 100 % as3으로 그려 졌는지 탐지하는 방법

내가하고 싶은 것은 플레이어가 냄비에 페인트 칠하도록하는 것이지만, FILL을 사용하는 것이 쉽지 않기를 바랄 것이다. 나는 플레이어가 브러시로 팬을 페인트하고 게임이 영역을 그려서 플레이어가 나아 가게하십시오. 그림에 대한

은 내가 해당 라이브러리 사용하려는 : http://www.nocircleno.com/graffiti/

을하지만 난 어떻게 모든 영역이 그려진 경우 감지하는 아무 생각이 없습니다. 누군가 그 일을하는 어떤 방법을 보여줄 수 있습니까?

답변

6

하나 - 당신은 투명성을 가지고 있으며, 장소에 불투명 차폐의 BitmapData을하는 당신을 플레이어에게 칠할 필요가 있습니다. 필요에 따라 색상을 지정하지만 색상이 완전히 불투명한지 확인하십시오. 그런 다음 histogram()을 수집 한 다음 255 번째 값에 대해 알파 벡터를 쿼리하면 0 % 채우기의 초기 값이됩니다. 범위는 0-255이므로 100이나 다른 고정 값을 사용할 수 없습니다. 그런 다음 플레이어가 페인팅하는 동안 BlendMode.ERASEblendMode 매개 변수를 설정하여 해당 BitmapData 위에 브러시를 그립니다. 그러면 브러시가 그려지는 투명도를 얻기 위해 BitmapData가 정리됩니다. 플레이어가 그림 그리기를 마친 후 (예 : 페인트가 다 써 버린 경우) BitmapData에 histogram()을 다시 실행하고 알파 채널 벡터의 255 번째 값을 쿼리합니다. 0은 비트 맵이 완전히 투명 함을 의미합니다 (또는 최소한 소량의 픽셀 만 불투명하게 유지됨). 따라서 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

답변이 다른 것보다 조금 더 어렵습니다. . 그러나 내가 그 일을하는 너의 방법을 습득하면, 내가 쉴드 뒤에서 원하는 이미지를 놓을 수있다. 나는 당신의 대답을 먼저 시도 할 것이고, 그것이 나에게 너무 복잡해지면 나는 다른 것을 시도 할 것이다. 답변을 투표 할 수 없습니다. 나는 어떤 사람들을 돕기 위해 노력할 것이고, 15 가지 평판을 얻었을 때 나는 definatelly 당신을 업 그레 이드 할 것이다. – Pyva

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; 
} 
+1

올바른 프로세스이지만 프로세서에서 매우 많은 프로세스이기 때문에 비트 맵의 ​​크기에 따라 속도가 매우 느릴 수 있습니다. –

+0

사실입니다. 더 큰 이미지를 청크로 분할 한 다음 각 청크에서 개별적으로 검사를 수행 할 수 있습니다. 모든 청크가 평가되면 true/false 응답을 받아들이도록 콜백을 구현할 수 있습니다. 이것은 비동기 접근을위한 좋은 후보입니다 :) – Marty

+0

이것은 직원이나 PixelBender에 솔직히 오프로드 할 수있는 좋은 후보입니다. 물론 모바일이 아닌 프로젝트에서만 작업자를 사용할 수 있습니다. –

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/