2012-03-12 4 views
1

타일 기반 게임을 AS3에서 만들고 있습니다. 이제 플레이어와 300 개의 인스턴스가있는 배열로 만들어진 각 타일 사이의 충돌을 검사해야합니다. 내 메인 클래스에서 그렇게하고 싶습니다. 플레이어는 Level이라는 클래스에 있고 tileArray는 다른 클래스에 있습니다. 실행하면 "매개 변수 hitTestObject는 null이 아니어야합니다"라는 고전적인 # 2007 오류가 발생합니다.배열 내의 특정 인스턴스에 대한 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); 
       }      
      } 
     } 
    } 
} 

I 배열의 [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"); 
    } 
} 

가 조정하지만, 중요한 것은 두 배열하는 것입니다 - 실제 타일을 저장하기위한 타일 생성을위한 하나 하나를 .

+0

물론! 고마워요! 나는 잠시 동안 이것에 대해 내 머리를 감쌌다. 매력처럼 일했습니다! :) –