【问题标题】:splice Object into nested Array code error将对象拼接成嵌套数组代码错误
【发布时间】:2010-07-12 15:43:04
【问题描述】:

我正在尝试使用拼接替换嵌套数组 (colArray) 中的一个对象,该对象充当我的播放器,需要在它所在的数组周围进行操作。 问题是 splice 似乎没有显示任何回报,它出现了一个错误说: 无法访问空对象引用的属性或方法。

我做错了什么?我将如何在数组周围移动我的 playerObject? 今晚我已经多次尝试解决这个问题,如果我的某些代码效率低下,请纠正我。提前致谢。

var gridContainerMC:MovieClip = new MovieClip();
var gridSize:Array = [col,row]; //Rows, Columns
var gridArray:Array = new Array();

var col:Number = 44;
var row:Number = 33;
var mapWidth:Number = 800; // set size correct 
var mapHeight:Number = 600;
var sepCols:Number; 
var sepRows:Number;
var menuHeight:int = 2;
// remove rows for menu
gridSize[1] = row-menuHeight;
var colArray:Array

buildGrid();
//posPlayer();
function buildGrid() { 
sepCols = mapWidth / col;
sepRows = mapHeight / row;
// declare increment varibles
var i:int;
var n:int;
    // creates nested Array
    for (i = 0; i < gridSize[0]; i++) {
        colArray = new Array();
        for (n = 0; n < gridSize[1]; n++) {
            var tileObject:MovieClip = createClip();
            tileObject.x = i * (tileObject.width - 1);
            tileObject.y = n * (tileObject.width - 1);
            gridContainerMC.addChild(tileObject);
            colArray.push(tileObject);
        }
        gridArray.push(colArray);
    } 
    this.addChild(gridContainerMC);
    var playerObject:MovieClip = createCharacter();
    this.addChild(colArray.splice(1, 0, playerObject));
    trace(playerObject);
} // endOf BuildGrid 

function createClip ():MovieClip {
    var returnClip:MovieClip = new MovieClip();
    returnClip.graphics.lineStyle(1,0x8C8C8C);
    returnClip.graphics.beginFill(0xc2c2c2, 1);  
    returnClip.graphics.drawRect(0, 0, sepCols, sepRows);
    returnClip.graphics.endFill();
    return returnClip;
} // endOf createClip

function createCharacter():MovieClip {
    var playerClip:MovieClip = new MovieClip();
    playerClip.graphics.lineStyle(1, 0x999999);
    playerClip.graphics.beginFill(0x000000); //990033
    playerClip.graphics.drawRect(0, 0, sepCols, sepRows);
    playerClip.graphics.endFill();
    return playerClip;
}

【问题讨论】:

    标签: flash actionscript-3 arrays


    【解决方案1】:

    是否需要替换数组中的元素 #1?或者您是否尝试替换元素 #1,以便新对象出现在数组顶部附近?元素 0 是任何数组中实际的第一个元素....

    通过使用下面的代码,您实际上只是删除了元素。通过使用“0”作为第二个参数,您告诉该方法删除索引“1”处的数组元素,所以,我相信附加参数(playerObject)只是被忽略了:

    colArray.splice(1, 0, playerObject);
    

    如果你想简单地添加元素,我会使用 push() 方法:

    colArray.push(playerObject);
    

    如果要删除索引 1 处的元素,请使用:

    colArray.splice(1, 0);
    

    另外,通过使用 splice 方法,您实际上开始传递一个结果。它不是一个数组(除非您要删除多个元素)。它是该特定索引处数组的内容。

    所以,如果您想从数组中删除该项目,然后将其添加到舞台:

    playerObject = colArray.splice(1, 0);
    this.addChild( playerObject );
    

    如果将对象实例化为 MovieClip 时出现问题,您可以将其强制转换为特定类型的对象,因为 Flash 允许多种类型的对象:对象、MovieClip、DisplayObject...

    this.addChild( MovieClip( playerObject ) );
    

    或尝试.... this.addChild(playerObject as MovieClip);

    或尝试.... this.addChild(playObject as DisplayObject);

    希望这会有所帮助。

    【讨论】:

    • 感谢您深思熟虑的回复。我作为示例粘贴的代码是一个测试脚本。我想用我的 colArray 中的 playerObject 替换一个元素,但我不想只替换元素 #1。我试过 trace(colArray[0][1]);但输出是空对象引用的属性或方法。由于这没有返回任何内容,因此我无法拼接到数组中。这是我认为可能的。
    【解决方案2】:

    splice 返回一个数组,所以你应该尝试

    this.addChild(colArray.splice(1, 0, playerObject)[0]);
    

    或更好

    colArray.splice(1, 0, playerObject);
    this.addChild(playerobject);
    

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 2021-08-29
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      相关资源
      最近更新 更多