hitTestObject到数组中的特定实例。 AS3 OOP

时间:2012-03-12 19:00:22

标签: actionscript-3 oop

我正在AS3制作基于磁贴的游戏。现在我需要检查播放器和每个磁贴之间的冲突(在一个包含300个实例的数组中创建)。 我想在我的Main课程中这样做。玩家在一个名为Level的类中,而tileArray在另一个类中。 当我执行时,我得到经典的#2007错误 - “参数hitTestObject必须是非空的”。

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]个实例创建hitTest?

谢谢!

1 个答案:

答案 0 :(得分:1)

现在你正在做的就是查看tileArray并创建适当的tile,但是当你需要执行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");
    }
} 

根据需要进行调整,但重要的是要有两个数组 - 一个用于创建图块,另一个用于存储实际图块。