指数超出范围?

时间:2013-01-10 10:44:43

标签: arrays actionscript-3 vector

下面是两个2D对象,Array和Vector。如您所见,两者中描述的信息完全相同。我的游戏使用Array对象完美无缺,但是使用Vector会引发以下错误:

[Fault] exception, information=RangeError: Error #1125: The index 10 is out of range 10. 

var _platformMap:Array = [
       [10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
       [00, 00, 10, 10, 10, 10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10, 10, 00, 00, 00, 10],
       [10, 10, 10, 00, 00, 10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
       [10, 10, 00, 00, 00, 00, 00, 10, 10, 10],
       [10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
       [00, 00, 00, 00, 00, 00, 00, 00, 00, 00]
     ];

var _platformMap:Vector.<Vector.<int>> = Vector.<Vector.<int>>(
        [
            Vector.<int>([10,10,10,10,10,10,10,10,10,10]), 
            Vector.<int>([00,00,10,10,10,10,10,10,10,10]), 
            Vector.<int>([10,10,10,10,01,01,01,10,10,10]), 
            Vector.<int>([10,10,10,00,10,10,10,10,01,10]), 
            Vector.<int>([10,10,10,00,10,10,01,01,01,00]), 
            Vector.<int>([10,10,10,10,01,01,01,01,01,10]), 
            Vector.<int>([00,00,00,00,00,10,10,10,10,10]), 
            Vector.<int>([00,00,00,00,00,00,00,00,00,00])
        ]
    );

我读到除了Arrays之外,Vector对象还有运行时范围检查(或固定长度检查)。这可能是问题吗?

public class TileCollisionController
{
    private var _softPlatformOpen:Boolean = true;
    private var _elevatorOpen:Boolean = true;

    public function TileCollisionController()
    {}

    public function platformCollision(gameObject:TileModel, platformMap:Vector.<Vector.<int>>, maxTileSize:uint, platform:uint):void
    {
        var overlapX:Number;
        var overlapY:Number;
        //check top-left corner
        if (platformMap[gameObject.top][gameObject.left] == platform)
        {
            overlapX = gameObject.xPos % maxTileSize;
            overlapY = gameObject.yPos % maxTileSize;
            if (overlapY >= overlapX)
            {
                if (gameObject.vy < 0 && platformMap[gameObject.bottom][gameObject.left] != platform)
                {
                    //Collision on top side of the object
                    gameObject.setY = gameObject.mapRow * maxTileSize;
                    gameObject.vy = 0;
                }
            }
            else
            {
                //Collision on left side of the object
                gameObject.setX = gameObject.mapColumn * maxTileSize;
                gameObject.vx = 0;
            }
        }
        //check top-right corner
        if (platformMap[gameObject.top][gameObject.right] == platform)
        {
            overlapX = maxTileSize - ((gameObject.xPos + gameObject.width) % maxTileSize);
            overlapY = gameObject.yPos % maxTileSize;
            if (overlapY >= overlapX)
            {
                if (gameObject.vy < 0 && platformMap[gameObject.bottom][gameObject.right] != platform)
                {
                    gameObject.setY = (gameObject.mapRow * maxTileSize);
                    gameObject.vy = 0;
                }
            }
            else
            {
                //Collision on right
                gameObject.setX = (gameObject.mapColumn * maxTileSize) + ((maxTileSize - gameObject.width) - 1);
                gameObject.vx = 0;
            }
        }
        //check bottom-left corner
        if (platformMap[gameObject.bottom][gameObject.left] == platform)
        {
            overlapX = gameObject.xPos % maxTileSize;
            overlapY = maxTileSize - ((gameObject.yPos + gameObject.height) % maxTileSize);
            if (overlapY >= overlapX)
            {
                if (gameObject.vy > 0 && platformMap[gameObject.top][gameObject.left] != platform)
                {
                    //trace("Collision on bottom");
                    //Collision on bottom
                    gameObject.setY = (gameObject.mapRow * maxTileSize) + (maxTileSize - gameObject.height);
                    gameObject.vy = 0;
                    gameObject.jumping = false;
                }
            }
            else
            {
                //trace("Collision on bottom left");
                //Collision on left
                gameObject.setX = gameObject.mapColumn * maxTileSize;
                gameObject.vx = 0;
            }
        }
        //check bottom-right corner
        if (platformMap[gameObject.bottom][gameObject.right] == platform)
        {
            overlapX = maxTileSize - ((gameObject.xPos + gameObject.width) % maxTileSize);
            overlapY = maxTileSize - ((gameObject.yPos + gameObject.height) % maxTileSize);
            if (overlapY >= overlapX)
            {
                if (gameObject.vy > 0 && platformMap[gameObject.top][gameObject.right] != platform)
                {
                    //trace("Collision on bottom right");
                    //Collision on bottom
                    gameObject.setY = (gameObject.mapRow * maxTileSize) + (maxTileSize - gameObject.height);
                    gameObject.vy = 0;
                    gameObject.jumping = false;
                }
            }
            else
            {
                //trace("Collision on right");
                //Collision on right
                gameObject.setX = (gameObject.mapColumn * maxTileSize) + ((maxTileSize - gameObject.width) - 1);
                gameObject.vx = 0;
            }
        }
    }

}

}
See example

    public function platformCollision(gameObject:TileModel, platformMap:Vector.<Vector.<int>>, maxTileSize:uint, platform:uint):void
    {
        var overlapX:Number;
        var overlapY:Number;
        if(gameObject.bottom < platformMap.length && gameObject.right < platformMap[0].length)
        {
        //check top-left corner
        //...


Example after updates

3 个答案:

答案 0 :(得分:2)

您发布的代码没有任何问题,但这两个代码都没有索引10的对象?也许你应该看看索引9,因为它从0开始?

你能说明你是如何访问数组/向量的吗?我认为这就是错误的来源。

答案 1 :(得分:0)

试试此代码

var platformMap:Vector.<Vector.<int>> = new Vector.<Vector.<int>>(2);(
                [
                    Vector.<int>([10,10,10,10,10,10,10,10,10,10]), 
                    Vector.<int>([00,00,10,10,10,10,10,10,10,10]), 
                    Vector.<int>([10,10,10,10,01,01,01,10,10,10]), 
                    Vector.<int>([10,10,10,00,10,10,10,10,01,10]), 
                    Vector.<int>([10,10,10,00,10,10,01,01,01,00]), 
                    Vector.<int>([10,10,10,10,01,01,01,01,01,10]), 
                    Vector.<int>([00,00,00,00,00,10,10,10,10,10]), 
                    Vector.<int>([00,00,00,00,00,00,00,00,00,00])
                ]);

答案 2 :(得分:0)

向量长度为​​10,因此您可以从0到9进行访问。 向量包含向量,还有len。 尝试

trace("maxnumallowed", platformMap.length-1)

并注意,如果n介于0和platformMap.length-1之间,则只能访问platformMap [n]

相关问题