当我从数组中获取元素并尝试在其上使用某些函数时,我收到此错误:
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);
答案 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。上面发布的那行初始化了一个数组,其中第一个元素是一个类,而不是一个对象。