为什么当我更新二维数组时会出现“错误#1010”

问题描述 投票:0回答:1

在我的编程课上,

我需要用AS3创建一个Tiles游戏(比如zelda)。

在地图上,图块在数组中被初始化为黑色,之后,每当歌曲的左侧点数达到某个值时,它们就会随机变化。


当tile更改时,我需要使用新值更新Array。实际上,我总是得到错误#1010:术语未定义且没有属性。


这是瓷砖初始化的方式:

变量

    private var grid: MovieClip;
    private var nbRow: int = 6; 
    private var nbCol: int = 12; 
    private var oneTiles: Tiles;
    private var t: Tiles;

    public var tMap: Array = [
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    ];

创建地图

     private function createGrid(): void {
          grid = new MovieClip();
          addChild(grid);

          for (var r: int = 0; r < nbRow; r++) {
               for (var c: int = 0; c < nbCol; c++) {
                   t = new Tiles();
                   t.x = t.width * c;
                   t.y = t.height * r;
                   grid.addChild(t);
               }
         }
     }

设置瓷砖

    private function displayTiles(): void {
        var i: int = 0;
        for (var r: int = 0; r < nbRow; r++) {
            for (var c: int = 0; c < nbCol; c++) {
                var t: Tiles;
                t = Tiles(grid.getChildAt(i));
                t.gotoAndStop(tMap[r][c]);
                i++;
            }
        }
    }

这是每次leftpeak达到值时调用的函数

    private function resetTiles(): void {
        for (var i: int = 0; i < grid.numChildren; i++) {
            oneTiles = grid.getChildAt(i) as Tiles;

            oneTiles.getTiles();
            //30% chance gotoAndStop(1) black tiles
            //70% chance gotoAndStop(2) white tiles
       }
    }

这是问题的根源:为了更新数组,我在resetTiles()的for循环中添加了这个。打开它,我总是得到一个错误#1010:一个术语是未定义的,没有属性。 :

            private var posX: uint = 0; //global
            private var posY: uint = 0; //global

            tMap[posX][posY] = oneTiles.getFrame();

            if(posX == 11 && posY != 5){
                posX = 0;
                posY++;
            }else if(posX == 11 && posY == 5){
                posX = 0;
                posY = 0;
            }else{
                posX++;
            }
            trace(posX);
            trace(posY);

        }
  • 那么,问题出在哪里? Normaly,使用此代码,每次更改图块时,都应更新tMap中的好图块。
  • 我做了一些测试,似乎问题的根源是行tMap [posX] [posY] = oneTiles.getFrame();不过,我无法弄清楚原因
public function getFrame():void{
            this.currentFrame;
    }
arrays actionscript-3 flash random actionscript
1个回答
2
投票

让我解释一下如何处理这类问题。一旦您了解到某条特定线路给您带来麻烦,您就需要了解整体情况。您应该了解所涉及的每个对象的当前状态和值,如下所示:

import flash.utils.getQualifiedClassName;

function hyperTrace(prefix:String, target:*):void
{
    trace("");
    trace("Name:", prefix);
    trace("Value:", target);
    trace("Type:", typeof(target));
    trace("Class:", getQualifiedClassName(target));
}

然后你开始学习:

// Expected result: instance of Tiles class
hyperTrace("oneTiles", oneTiles);

// Expected result: Function
hyperTrace("oneTiles.getFrame", oneTiles.getFrame);

// Expected result: Array
hyperTrace("tMap", tMap);

// Expected result: Array
hyperTrace("tMap[" + posX + "]", tMap[posX]);

// Expected result: int
hyperTrace("tMap[" + posX + "][" + posY + "]", tMap[posX][posY]);

然后,搜索与预期结果不匹配的那个。某些对象不是您所期望的(包括posX和posY索引的值),这是错误的来源。既然您已经了解了问题所在,那么您应该确定以前的代码或开发逻辑究竟出了什么问题,以便产生意外结果。

如果没有深入挖掘我会猜测oneTiles结果是未定义的,或者posX和posY有错误的值,所以tMap [posX]是未定义的。

© www.soinside.com 2019 - 2024. All rights reserved.