【问题标题】:add two enemy in one array AS3在一个阵列中添加两个敌人 AS3
【发布时间】:2014-10-31 01:31:56
【问题描述】:

我想添加两个敌人一个数组进行循环,这是我的代码 全球时间++; // 生成敌人 if (global_time % 40 == 0) { 敌人 = 新敌人(); 敌人.x = 40 + Math.random() * 400; 敌人.y = 0; addChild(敌人); 军队.push(敌人); System.gc();

            enemy2 = new Enemy2();
            enemy2.x = 40 + Math.random() * 400;
            enemy2.y = 0;
            addChild(enemy2);
            army.push(enemy2);
        }
        for (var k:int = army.length - 1; k >= 0; k--) {
            enemy = army[k];
            enemy2 = army[k]
            // update all enemies
            enemy.update();
            enemy2.update2();

            // if its out of bound, remove from stage
            if (enemy.y < 0) {
                army.splice(k, 1); 
                enemy.parent.removeChild(enemy);
                continue;
                System.gc();
            }
            //* enemy2
            if (enemy2.y < 0) {
                army.splice(k, 1); 
                enemy2.parent.removeChild(enemy2);
                continue;
                System.gc();
            }
        }

当我运行此程序时出现错误“无法将 Enemy2@501f5e1 转换为 Enemy”。请帮忙

【问题讨论】:

  • 没有看到完整的代码/源代码很难判断,但是,此错误可能表明 SWF 中的 ActionScript 无效或文件已损坏。是您的任何错误 - 1034 Type Coercion failed: cannot convert %a to %t.或 1050 无法将 %o 转换为原语。 ?

标签: actionscript-3 flash


【解决方案1】:

问题是你的军队有两种不同类型的敌人,Enemy 和 Enemy2。

在 for 循环的开头,您从军队数组中挑选出第 k 个敌人。这可以是 Enemy 或 Enemy2 对象之一,但不能同时是两者(除非有一些我们看不到的继承)。

所以在你的循环中发生的事情是你从军队数组中挑选出最后一个敌人,它的类型是 Enemy2,然后你将那个敌人分配给你的可变敌人,它的类型是 Enemy。这就是转换失败的地方。

可能你应该有一个 Enemy 类,并将其用于两个敌人,但是如果你想使用两个不同的类,你必须在对你的敌人进行操作之前进行类型检查:

for (var k:int = army.length - 1; k >= 0; k--) {
    if (army[k] is Enemy) {
        enemy = army[k];
        enemy.update();
        if (enemy.y < 0) {
            army.splice(k, 1); 
            enemy.parent.removeChild(enemy);
            continue;
            System.gc();
        }
    } else if (army[k] is Enemy2) {
        enemy2 = army[k]
        enemy2.update2();
        if (enemy2.y < 0) {
            army.splice(k, 1); 
            enemy.parent.removeChild(enemy);
            continue;
            System.gc();
        }
    }
}

然而,最好的办法是让它们从同一个基类继承,即

class Enemy {
    public var x;
    public var y;
    public function update() {...}
}

class Enemy1 extends Enemy {
    override public function update() { // Enemy1 special updates }
}

class Enemy2 extends Enemy {
    override public function update() { // Enemy2 special updates }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 2023-03-21
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多