在动作脚本3中输入强制失败,从数组中获取元素

时间:2014-06-02 02:00:22

标签: arrays actionscript-3 flash casting

当我从数组中获取元素并尝试在其上使用某些函数时,我收到此错误:

  

TypeError:错误#1034:类型强制失败:无法转换jogador $   去jogador。在laser / mover_tiro_baixo()

对不起,它是葡萄牙语,就像我将在下面粘贴的代码一样,但我认为你得到它:当我从数组中检索元素时,它的类型为'jogador $',如果我尝试使用它作为存在'jogador'它不起作用。我正在尝试手动强制强制,因为它试图将对象转换为DisplayObject(因为我正在尝试使用命中测试功能),但这也不起作用:

  

TypeError:错误#1034:类型强制失败:无法转换jogador $   到flash.display.DisplayObject。在laser / mover_tiro_baixo()

代码:

package {

    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event;
    import flash.debugger.enterDebugger;
    import flash.utils.getDefinitionByName;
    import flash.utils.getQualifiedClassName;
    import flash.display.DisplayObject;


    public class laser extends MovieClip {

        private var velo: Number;
        private var meuPalco: Stage;
        var dono: MovieClip;
        var inimigoTipo: Number;
        var Inimigos: Array;
        var Dano: Number;
        var Tam:Number;
        var i:Number;

        public function laser(palco: Stage, posX: Number, posY: Number, velocidade: Number, dano: Number, CimaBaixo: Number, Dono: MovieClip, vetJogadores: Array) {
            this.dono = Dono;
            this.Dano = dano;
            if (getClass(this.dono) == "jogador") {
                inimigoTipo = 0;
                Inimigos = jogador(this.dono).VetorInimigos;
            } else {
                inimigoTipo = 1;
                Inimigos = vetJogadores;
            }
            this.meuPalco = palco;
            this.velo = velocidade;
            this.x = posX;
            this.y = posY;
            if (CimaBaixo == 1) {
                this.addEventListener(Event.ENTER_FRAME, mover_tiro_cima);
            } else {
                this.addEventListener(Event.ENTER_FRAME, mover_tiro_baixo);
            }
            meuPalco.addChild(this);
        }


        public function mover_tiro_cima(evt: Event) {
            this.y -= velo;
            if (inimigoTipo == 0) { // Dono do tiro é o player          
                var Tam: Number = Inimigos.length;
                var i: Number = 0;
                while (i < Tam) {
                    if (this.hitTestObject(Inimigos[i])) {
                            inimigo(Inimigos[i]).vida.Diminuir(this.Dano);
                        }
                        i++;
                    }
                } else { // Dono do tiro é um inimigo
                    Tam = Inimigos.length;
                    i = 0;
                    while (i < Tam) {
                        if (this.hitTestObject(Inimigos[i])) {
                                jogador(Inimigos[i]).vida.Diminuir(this.Dano);
                            }
                            i++;
                        }
                    }
                    if (this.y <= 0) {
                        this.removeEventListener(Event.ENTER_FRAME, mover_tiro_cima);
                        meuPalco.removeChild(this);
                    }
                }

                public function mover_tiro_baixo(evt: Event) {
                    this.y += velo;
                    if (inimigoTipo == 0) { // Dono do tiro é o player          
                         Tam = Inimigos.length;
                         i = 0;
                        while (i < Tam) {
                            if (this.hitTestObject(Inimigos[i])) {
                                    inimigo(Inimigos[i]).vida.Diminuir(this.Dano);
                                }
                                i++;
                            }
                        } else { // Dono do tiro é um inimigo
                            Tam = Inimigos.length;
                            i = 0;
                            while (i < Tam) {
                                if (this.hitTestObject(Inimigos[i])) {
                                        jogador(Inimigos[i]).vida.Diminuir(this.Dano);
                                    }
                                    i++;
                                }
                            }
                            if (this.y <= 0) {
                                this.removeEventListener(Event.ENTER_FRAME, mover_tiro_baixo);
                                meuPalco.removeChild(this);
                            }
                        }

                        static function getClass(obj: Object): String {
                            return  String(Class(getDefinitionByName(getQualifiedClassName(obj))));
                        }
                    }

                }

每次激光测试时都会发生错误,看它是否在其功能中击中了敌人(hittest)。 mover_tiro_baixo()将镜头向下移动。

谢谢大家!

编辑:我创建数组的方式:

var player1:jogador = new jogador(stage,350,700,10,3,1);
var Jogadores:Array = [jogador];
player1.setJogadores(Jogadores);

var inimigo1:et = new et(stage,100,200,Jogadores);
var inimigo2:et = new et(stage,200,100,Jogadores);
var inimigo3:et = new et(stage,350,450,Jogadores);

var todosInimigos:Array = [inimigo1,inimigo2,inimigo3];
player1.DefinirInimigos(todosInimigos);

1 个答案:

答案 0 :(得分:1)

我检查了一些其他类似转换错误的堆栈溢出问题。大多数具有类似问题的其他人实际上是用 Class 填充他们的数组,而不是作为Class实例的对象。你是否正在填写这样的阵列?

for(var i:int = 0; i < 10; i++){
     Inimigos.push(jogador); //incorrect
}

如果是这样,那就是问题发生的原因。这是正确的方法:

for(var i:int = 0; i < 10; i++){
     Inimigos.push(new jogador()); //correct
}

编辑:

在你添加到第一篇文章的新代码中,这一行似乎是问题所在:

var Jogadores:Array = [jogador]; //jogador is a class

Flash Actionscript数组无法“初始化”,只能包含特定类型的对象。 Actionscript Vectors能够做到这一点,但不是Arrays。上面发布的那行初始化了一个数组,其中第一个元素是一个类,而不是一个对象。