2012-04-25 2 views
0

충돌 감지에 BitmapData를 사용하려했지만 지금까지 실패했으며 그 이유를 모르겠습니다. 코드는 컴파일되지만 아무 것도하지 않습니다 ("hit"을 인쇄해야하는 경우). 누구든지 나를 도울 수 있습니까?BitmapData Collision

var bgBitMapData:BitmapData = new BitmapData(bg.width,bg.height,true,0); 
    // bgBitMapData is an empty BMP at this point cause its just freshly instanciated 
    bgMask = bgBitMapData.clone(); 
    wall.x = bg.x; 
    wall.y = bg.y; 
    bgMask.draw(wall); 

    var plBitMapData:BitmapData = new BitmapData(pl.width,bg.height,true,0); 
    // no idea y you make this plBitMapData anyway 
    plMask = bgBitMapData.clone(); 
    // now you clone the empty bgBitMapData to be plMask 
    bgMask.draw(pl); 

plMask은 아무것도 채워지지 않습니다 :

package 
{ 
import flash.events.KeyboardEvent; 
import flash.events.Event; 
import flash.display.MovieClip; 
import flash.ui.Keyboard; 
import flash.display.BitmapData; 
import flash.geom.Point; 

public class Main extends MovieClip 
{ 
    private var spd:int = 5; 
    private var pressedKeys:Object = {}; 
    private var bgMask:BitmapData; 
    private var plMask:BitmapData; 
    private var wall:Wall = new Wall(); 

    public function Main() 
    { 
     var bgBitMapData:BitmapData = new BitmapData(bg.width,bg.height,true,0); 
     bgMask = bgBitMapData.clone(); 
     wall.x = bg.x; 
     wall.y = bg.y; 
     bgMask.draw(wall); 

     var plBitMapData:BitmapData = new BitmapData(pl.width,bg.height,true,0); 
     plMask = bgBitMapData.clone(); 
     bgMask.draw(pl); 

     stage.addEventListener(KeyboardEvent.KEY_DOWN,this.keyPressHandler); 
     stage.addEventListener(KeyboardEvent.KEY_UP,this.keyPressHandler); 
     stage.addEventListener(Event.ENTER_FRAME,this.gameLoop); 
    } 

    public function keyPressHandler(evt:KeyboardEvent):void 
    { 
     if (evt.type == KeyboardEvent.KEY_DOWN) 
     { 
      pressedKeys[evt.keyCode] = 1; 
     } 
     else 
     { 
      delete pressedKeys[ evt.keyCode ]; 
     } 
    } 

    public function inputHandler():void 
    { 
     var moveXBy:int; 
     var moveYBy:int; 

     if (pressedKeys[Keyboard.J]) 
     { 
      moveXBy -= spd; 
     } 

     if (pressedKeys[Keyboard.K]) 
     { 
      moveYBy += spd; 
     } 

     if (pressedKeys[Keyboard.L]) 
     { 
      moveXBy += spd; 
     } 

     if (pressedKeys[Keyboard.I]) 
     { 
      moveYBy -= spd; 
     } 

     pl.x += moveXBy; 
     pl.y += moveYBy; 

    } 

    public function playerWallCollision():void 
    { 
     if (plMask.hitTest(new Point(wall.x, wall.y), 1, bgMask, new Point(pl.x, pl.y), 1)) 
     { 
      trace( "hit"); 
     } 
    } 

    public function gameLoop(evt:Event):void 
    { 
     wallUpdate(); 
     inputHandler(); 
     playerWallCollision(); 
    } 

    private function wallUpdate() 
    { 
     wall.x = bg.x; 
     wall.y = bg.y; 
    } 
} 
} 
+0

당신은'와 벽의 좌표계를 혼합하고 plMask'의 당신은'hitTest'를 호출 할 때. 먼저 localToGlobal을 사용하여 globalToLocal을 사용하여 변환하십시오. – Cameron

+0

@Cameron 어떻게해야합니까? 나는 전에 그 기능들을 사용 해본 적이 없다 ... – MKII

답변

1
까지이 스크립트는, 내게 말하길로 선 후

! 따라서 비어있는 BitmapData와 비교하면 항상 false를 반환해야합니다.

그래서에 대한 대답 할 때해야 그것을 출력 히트 - 결코)

그리고 (!) 참고로 1. 쓰기 모든 여기에 코멘트로 가독성을 유지하려고하고 당신의 의도가 무엇인지가 2. 이동에 대한 직접 방법 : 나를 위해

var bgBitMapData:BitmapData = new BitmapData(bg.width,bg.height,true,0); 
    bgMask = bgBitMapData.clone(); 
    // this position seems just wrong to me wall.x or wall.y do not effect the draw so keep it somewhere else... since you will copy the inside of wall 
    wall.x = bg.x; 
    wall.y = bg.y; 
    bgMask.draw(wall); 

그것과 같아야합니다

// placing a wall to new/init coordinates 
    wall.x = bg.x; 
    wall.y = bg.y; 

    // drawing wall on bgMask for hittesting against player or what ever you intende here 
    bgMask = new BitmapData(bg.width,bg.height,true,0); 
    bgMask.draw(wall); 
+0

나는 처음 부분을 같은 방식으로하고 튜토리얼을 따랐다. – MKII

+1

다시 한번 살펴 보라. 내 모든 요점은 plMask가 항상 알파 0 %를 유지한다는 것을 의미한다. 아무 것도 그것을 칠 수 없다 ... 당신의 튜토리얼에 약간의 차이가있을 것이라고 추측한다.> 나는 bgMask 대신에 마지막 행을 복사 한 첫번째 코드 니펫에 plMask.draw (pl)가 있어야한다고 생각한다 : 그렇지 않으면 결국 bgMask로 끝난다. 벽과 플레이어를 포함하여 비어있는 상태에서 테스트 -> 항상 거짓 || 또는 벽에 그려진 벽 (bgMask)과 플레이어 (plMask)와의 맵 -> hittest가 참일 수 있습니다 -> 그게 더 나을 수 있습니다.) – Sidrich2009

+0

감사합니다. 내가 오타 나 그런 것 때문에 여기 올 때 나는 그것을 싫어한다. – MKII