2012-04-25 7 views
0

私は衝突検出にBitmapDataを使用しようとしていますが、これまでには失敗していますが、理由はわかりません。コードはコンパイルされますが、何もしません( "ヒット"を出力する必要がある場合)。誰でも助けてくれますか?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

。最初に変換するには、localToGlobal、次にglobalToLocalを使用します。 – Cameron

+0

@Cameronどうすればいいですか?私はその前にこれらの機能を使ったことがありません... – MKII

答えて

1
限り、このスクリプトは、私に語ったように複数行の後

!そのため、空のBitmapDataと比較すると常にfalseが返されます。

そうに答えたときにすべきことを出力ヒット - 決して;)

そして追記として1.書き込みごとに、ここでコメントすることにより、より読みやすい、それを維持しようとあなたの意図は何があり、2 GOの直接的な方法:私にとって

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); 

それは次のようになります。あなたが `hitTest`呼び出すときは、` plMask`のと壁の座標系を混合している

// 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それは壁とプレーヤーを含み、それを空に照らしてテストする - >常にfalse ||またはそれは壁(bgMask)に描かれた1つのマスクであり、プレイヤー(plMask)との1つのマップ - > hittestは真実かもしれません - >それは私にとってより意味があります;) – Sidrich2009

+0

ありがとう、ありがとう。私はちょうどタイプミスなどのために私がここに来るときにそれを嫌う... – MKII