如何在AS3中制作2D矢量图形

3
我可以这样做:
        var levelVector = new Vector.<Vector.<int>>();
        levelVector[0] = new Vector.<int>();
        levelVector[1] = new Vector.<int>();
        levelVector[2] = new Vector.<int>();


        levelVector[0][0] = 0;
        levelVector[0][1] = 0;
        levelVector[0][2] = 5;
        levelVector[0][3] = 0;
        levelVector[0][4] = 0;
        levelVector[0][5] = 0;
        levelVector[1][0] = 0;
        levelVector[1][1] = 0;
        levelVector[1][2] = 5;
        levelVector[1][3] = 0;
        levelVector[1][4] = 0;
        levelVector[1][5] = 0;
        levelVector[2][0] = 0;
        levelVector[2][1] = 5;
        levelVector[2][2] = 2;
        levelVector[2][3] = 2;
        levelVector[2][4] = 2;
        levelVector[2][5] = 2;

但我更希望有这样的东西:
levelVector = [[0,0,3,2,1],[1,1,2,2,2],[3,2,2,1,2]];

这样会更加有用:

levelVector = [
              [0,0,3,2,1],
              [1,1,2,2,2],
              [3,2,2,1,2]
              ];

因为现在它实际上读起来像一个二维数组或者网格,这非常有帮助。我认为我可以用数组做到这一点,那么使用向量有什么方法吗?对于一个大的二维向量填充每个值,每个值都有自己的一行代码,这很难看懂、理解和编写。我是不是忽略了什么,还是这只是向量的短板?
谢谢!
2个回答

4

是的,但你不能直接将二维数组(或者数组的数组)转换为向量的向量。但你可以这样做:

var levelVector:Vector.<Vector.<int>>=Vector.<Vector.<int>>(
    [
        Vector.<int>([0,0,3,2,1]),
        Vector.<int>([1,1,2,2,2]),
        Vector.<int>([3,2,2,1,2])
    ]
);

啊!!括号!!谢谢!我明天会试一下。 - Neal Davis
这个在我测试时不起作用。但是,我调整了你的代码,现在它可以工作了。我尝试编辑你的答案以便我可以接受它作为正确答案,但是被拒绝了。哦,好吧。也许你可以编辑一下。它需要有一行来构建数组,然后你可以按照你的方式填充它,这正是我要找的。所以第一行将是var levelVector:Vector.<Vector>.<int>> = Vector.<Vector.<int>>(3);,然后下一行可以是levelVector = [ //yada yada just like you said - Neal Davis
编辑答案并不是正确的回应方式。你可以在评论区留言,或者添加自己的答案来说明你是如何解决这个问题的。 - Vesper

2

就像其他人所说的(并进一步解释,因为您似乎有些困惑),您可以使用Vector 全局函数Array转换为Vector

var level:Vector.<int> = Vector.<int>([
    0, 0, 3, 2, 1,
    1, 1, 2, 2, 2,
    3, 2, 2, 1, 2
]);

你可以嵌套调用这个函数来形成一个二维向量(其实你并不需要 -- 我建议你只使用一个平面向量):

var level:Vector.<Vector.<int>> = Vector.<Vector.<int>>([
    Vector.<int>([0, 0, 3, 2, 1]),
    Vector.<int>([1, 1, 2, 2, 2]),
    Vector.<int>([3, 2, 2, 1, 2])
]);

或者你可以像文档中所示,直接使用预设的向量实例化:

var level:Vector.<Vector.<int>> = new <Vector.<int>>[
    new <int>[0, 0, 3, 2, 1],
    new <int>[1, 1, 2, 2, 2],
    new <int>[3, 2, 2, 1, 2]
];

最后,你可以编写一个函数将2D数组转换为2D向量:

function createLevelVector(level:Array):Vector.<Vector.<int>> {
    var levelVector:Vector.<Vector.<int>> = new Vector.<Vector.<int>>(level.length);
    for (var i:int = 0; i < level.length; i++) {
        levelVector[i] = Vector.<int>(level[i]);
    }
    return levelVector;
}

var level:Vector.<Vector.<int>> = createLevelVector(
    [
        [0, 0, 3, 2, 1],
        [1, 1, 2, 2, 2],
        [3, 2, 2, 1, 2]
    ]
);

你关于我使用的(3)是正确的。它没有引起编译错误(不确定为什么),但也没有添加任何有用的东西。我刚刚测试了一下没有加上它,两种方式都可以工作,所以Flash可能会忽略它,即使我使用严格模式和警告模式。 - Neal Davis
另外,我不确定我的问题中说了什么让它听起来像是我试图将一个数组转换为向量。我只是想创建一个二维向量。感谢您抽出时间来回答。我会测试每个代码的效果。您在答案中的第二个代码块与@Vesper的建议相同。但这并不起作用。正如我在我的答案中所说,似乎需要在一行代码中创建向量,然后才能填充它。 - Neal Davis
至于为什么我要使用2D数组,是因为我想能够在其他地方的深度控制函数中迭代遍历每个子向量。 - Neal Davis
1
使用Vector全局函数(如其他答案所示)将数组转换为向量。它并没有直接实例化一个向量(就像我的第三个例子一样)。当然,区别大多是语义上的;你最终得到的是相同的东西。 - Aaron Beall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接