2012-03-12 9 views
1

私はAS3でタイルベースのゲームを作っています。今度は、プレイヤーと各タイル(300種類のインスタンスを持つ配列で作成された)の衝突をチェックする必要があります。 私はメインクラスでそれをしたいと思います。プレーヤーはLevelというクラスにあり、tileArrayは別のクラスにあります。 私が実行すると、#2007の古典的なエラー - "パラメータhitTestObjectはnullでない必要があります"が表示されます。配列内の特定のインスタンスに対するhitTestObject。 AS3 OOP

MAIN

public function checkCollision():void{ 


     if(_level._tileSetBMP._tileArray[0] == null){ 
      _level._tileSetBMP._tileArray[0] as flash.display.DisplayObject; 
     } 
     for (var i:int = 0; i < _level._tileSetBMP._tileList.length; i++){ 
      if (_player._sneezy.hitTestObject(_level._tileSetBMP._tileList[_level._tileSetBMP._tileArray[0]])) { 
       trace("Die"); 
      } 
     }  
    } 

タイルセット

package GameObjects{ 


public class TileSet extends GameObjects.GameObjects 
{ 
    public var _til:Tile; 
    public var _tileArray:Array = new Array; 


    public function TileSet() 
    {   
     _tileArray = 
      [[0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], 
      [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0], 
      [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0], 
      [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0], 
      [0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0], 
      [0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0], 
      [0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0], 
      [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0], 
      [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0], 
      [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]; 

     setup(); 

     } 

    public function setup():void{ 

     for(var row:int = 0; row<_tileArray.length; row++) 
     { 
      for(var col:int = 0; col < _tileArray[row].length; col++){ 
       trace('type:',_tileArray[row][col]); 

       if(_tileArray[row][col] == 1){ 
        var tile:Tile; 
        tile = new Tile(); 
        tile.x = col * (tile.width -3) + Settings.STARTX; 
        tile.y = row * (tile.height -3) + Settings.STARTY; 

        addChild(tile); 
       } 

       if (_tileArray[row][col] == 0) { 
        var grassTile:Tile; 
        grassTile = new Tile(); 
        grassTile.alpha = 0.1; 
        grassTile.x = col * (grassTile.width -3) + Settings.STARTX; 
        grassTile.y = row * (grassTile.height -3) + Settings.STARTY; 

        addChild(grassTile); 
       }      
      } 
     } 
    } 
} 

私は、配列の[0] -instancesのそれぞれにhitTestを作るために何ができますか?

感謝!

答えて

1

今のところ、tileArrayを見て適切なタイルを作成するだけですが、hitTestを実行するときにはまだ数字が入っているtileArrayが表示されます。明らかにhitTestは実行できませんDisplayObjectと数値の間(そして、試してみるとDisplayObjectにキャストできません)。

これにはいくつかの方法がありますが、基本的な点は、作成するときに各タイルを別の配列にプッシュすることです。したがって、このような何か:

var realTileArray:Array = []; 
//... 
var tile:Tile; 
tile = new Tile(); 
tile.x = col * (tile.width -3) + Settings.STARTX; 
tile.y = row * (tile.height -3) + Settings.STARTY; 
addChild(tile); 
realTileArray.push(tile); 

そして、衝突試験用:必要に応じて

for (var i:int = 0; i < realTileArray.length; i++){ 
    if (_player._sneezy.hitTestObject(realTileArray[i])) { 
      trace("Die"); 
    } 
} 

は調整しますが、重要なことは、2つの配列持つことである - 実際のタイルを格納するためにタイルを作成するための1つずつを。

+0

もちろん!どうもありがとう!私はしばらくこの周りを頭で包んできた。チャームのように働いた! :) –

関連する問題