Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 向数组添加对象时类型转换失败_Flash_Actionscript 3_Actionscript - Fatal编程技术网

Flash 向数组添加对象时类型转换失败

Flash 向数组添加对象时类型转换失败,flash,actionscript-3,actionscript,Flash,Actionscript 3,Actionscript,我收到以下错误 Type Coercion failed: cannot convert Stinger@d8d43a1 to Array. 在总结中。这就是我想做的 var laser = new StingerLaser(); laser.laserDir = dir1; laser.wielder.push(this); laser.x = x + 20; laser.y = y + 40; eApi.addGameChild(laser);

我收到以下错误

 Type Coercion failed: cannot convert Stinger@d8d43a1 to Array.
在总结中。这就是我想做的

var laser = new StingerLaser();
    laser.laserDir = dir1;
    laser.wielder.push(this);
    laser.x = x + 20;
    laser.y = y + 40;
    eApi.addGameChild(laser);
其中laser.Welver是在StingerLaser类中声明的数组。到目前为止,我只尝试将一种类型的对象放入数组中。这就是毒刺

尝试将Stinger类型的对象添加到数组时。这是我的密码

package com.objects{

 import flash.display.MovieClip

 public class StingerLaser extends gameObject {

  public var speed:Number = 20;
  public var targets:Array;
  public var laserDir:Number = -40;
  public var wielder:Array; // <-------- Here is the array

  public function StingerLaser():void{
   stop();
   wielder = new Array(); //<---- it gets declared here
   targets = new Array();

  }

  override public function updateObject():void
  {
   blowUp();
   rotation = laserDir;
   //blowUp();
   var xdir = Math.cos(laserDir * Math.PI/180);
   var ydir = Math.sin(laserDir * Math.PI/180);
   x += xdir * speed;
   y += ydir * speed;

   if(y > 800 || y < -30 || x > 800 || x < -30)
   {    
    garbage = true;
   }

   if(eApi.gameStage[2] != undefined && eApi.gameStage[2] != null)
   {
    for(var i = 0; i < eApi.gameStage[2].length; i++)
    {
     if(hitTestObject(eApi.gameStage[2][i]) && eApi.gameStage[2][i] != wielder)
     {
      //dead();
      var w:Boolean = false;
      for(var wd = 0; wd < wielder.length; wd++)
      {
       if(eApi.gameStage[2][i] == wielder[wd])
        w = true;
      }
      if(eApi.gameStage[2][i].dead != true && w != true)
      {
       eApi.gameStage[2][i].Hit(.01);
       dead = true;
      }
     }
    }
   }
  }//update object

  protected function blowUp():void
  {
   if(dead)
   {
    play();
    if(currentFrame == totalFrames)
    {
     garbage = true;
    }
   }
  }
 }
}
包com.objects{
导入flash.display.MovieClip
公共类StingerLaser扩展了gameObject{
公共var速度:数字=20;
公共var目标:数组;
公共var激光雷达:数字=-40;
公共变量持用者:数组;//800 | | x<-30)
{    
垃圾=真;
}
if(eApi.gameStage[2]!=undefined&&eApi.gameStage[2]!=null)
{
对于(var i=0;i
下面是我试图放入数组中的类

package com.objects{

 import flash.display.MovieClip

 public class Stinger extends gameObject {

  public var cspeed:Number = 2;
  public var attackDelay:Number = 1350;

  protected var scale:Number = 1;

  public function Stinger():void
  {
   stop();
   lastTime = getTime();
   health = 1;
  }

  public function Hit(dmg:Number = .01):void {
   if(health > 0)
    health -= dmg;

   if(health < 0)
    health = 0;
  }

  public function blowUp():void
  {
   attackDelay = 100;
   scaleX -= .01;
   scaleY -= .01;
   if((getTime() - lastTime) > attackDelay)
   {
    var explode = new Explosions();
    explode.x = x - (width/2) + (Math.random()* width);
    explode.y = y - (height/2) + (Math.random()* height);
    explode.scaleX = scaleX;
    explode.scaleY = scaleY;
    eApi.addGameChild(explode,3);
    lastTime = getTime();    
   }

   if(scaleX < .5)
   {
    rotation = 25;
    cspeed = 20;
   }
  }

     override public function Attack(dir:Number = 40):void
  {
   if((getTime() - lastTime) > attackDelay)
   {
    var laser = new StingerLaser();
    laser.laserDir = dir;
    laser.wielder.push(this);
    laser.x = x;
    laser.y = y;
    eApi.addGameChild(laser);
    lastTime = getTime();    
   }
  }

  public function DoubleShot(dir1:Number = 40, dir2:Number = 120):void
  {
   if((getTime() - lastTime) > attackDelay)
   {
    var laser = new StingerLaser();
    laser.laserDir = dir1;
    laser.wielder.push(this);
    laser.x = x + 20;
    laser.y = y + 40;
    eApi.addGameChild(laser);

    var laser2 = new StingerLaser();
    laser2.laserDir = dir2;
    laser2.wielder.push(this);
    laser2.x = x + -20;
    laser2.y = y + 40;
    eApi.addGameChild(laser2);
    lastTime = getTime();
    laser.wielder = this;
   }
  }

  override public function updateObject():void
  {
   eApi.setChildIndex(this, (eApi.numChildren - 5));
   if(!dead)
   {
    DoubleShot(70,110);
   }
   y += cspeed;

   if(y > 800 || y < -45)
    garbage = true;

   if(health <= 0)
   {
    dead = true;
    blowUp();
   }
  }
 }
}
包com.objects{
导入flash.display.MovieClip
公共类毒刺扩展游戏对象{
公共变量cspeed:Number=2;
公共var attackDelay:Number=1350;
保护var标度:数字=1;
公用函数托管架():void
{
停止();
lastTime=getTime();
健康=1;
}
公共函数命中(dmg:Number=.01):无效{
如果(运行状况>0)
健康-=dmg;
如果(健康状况<0)
健康=0;
}
公共函数blowUp():void
{
攻击延迟=100;
scaleX-=.01;
scaleY-=.01;
if((getTime()-lastTime)>attackDelay)
{
var explode=新爆炸();
explode.x=x-(宽度/2)+(Math.random()*宽度);
explode.y=y-(高度/2)+(数学随机()*高度);
explode.scaleX=scaleX;
explode.scaleY=scaleY;
eApi.addGameChild(explode,3);
lastTime=getTime();
}
如果(scaleX<.5)
{
旋转=25;
cspeed=20;
}
}
覆盖公共函数攻击(dir:Number=40):无效
{
if((getTime()-lastTime)>attackDelay)
{
var激光=新的StingerLaser();
laser.laserDir=dir;
激光。持用者。推(这个);
激光x=x;
激光y=y;
eApi.addGameChild(激光);
lastTime=getTime();
}
}
公共功能双重射击(dir1:Number=40,dir2:Number=120):无效
{
if((getTime()-lastTime)>attackDelay)
{
var激光=新的StingerLaser();
laser.laserDir=dir1;
激光。持用者。推(这个);
激光,x=x+20;
激光,y=y+40;
eApi.addGameChild(激光);
var laser2=新的StingerLaser();
laser2.laserDir=dir2;
激光2。持用者。推(这个);
激光器2.x=x+-20;
激光器2.y=y+40;
eApi.addGameChild(激光2);
lastTime=getTime();
laser.Welver=这个;
}
}
重写公共函数updateObject():void
{
eApi.setChildIndex(这个(eApi.numChildren-5));
如果(!死了)
{
双打(70110);
}
y+=cspeed;
如果(y>800 | | y<-45)
垃圾=真;

如果(health数组非常开放,您可以将任何需要的内容推入其中。下面是导致您出现问题的代码行:

laser.wielder = this
它在“毒刺”类,方法“双重射击”中


祝你好运!

阵列非常开放,你可以将任何你想要的东西放入其中。下面是导致你麻烦的代码行:

laser.wielder = this
它在“毒刺”类,方法“双重射击”中


祝你好运!

你的问题是这一行:

laser.wielder = this;

您正在将持用者(阵列)分配给“this”,这是一个毒刺。

您的问题是这行:

laser.wielder = this;

您正在将持用者(一个数组)分配给“this”,这是一个毒刺。

Flash中的数组非常松散!它们不限于单一类型,因此可以包含任意数量的不同类型的对象。例如,这在ActionScript 3中是有效的: var arr:Array=new Array(); arr.push(“苹果”); arr.push(新的MovieClip()); arr.push(234); arr.push(新StingerLaser()); trace(arr);//Traces:“苹果”[object MovieClip],234[object StingerLaser]

因此,您的问题实际上并没有添加到阵列中。这是因为在Stinger类的DoubleShot方法的以下行中:

laser.wielder = this;
“this”指的是Stinger类的实例


注:要使数组只能有一种类型,必须使用顶级类型。但是,这仅在发布到FlashPlayer 10时可用。

Flash中的数组非常松散!它们不限于单个类型,因此可以包含任意数量的不同类型的对象。例如,这在ActionScript 3中是有效的: var arr:Array=new Array(); arr.push(“苹果”); arr.push(新的MovieClip()); arr.push(234); arr.push(新StingerLaser()); trace(arr);//Traces:“苹果”[object MovieClip],234[object StingerLaser]

因此,您的问题实际上并没有添加到阵列中。这是因为在Stinger类的DoubleShot方法的以下行中:

laser.wielder = this;
“this”指的是Stinger类的实例


注:要使数组只能有一种类型,必须使用顶级类型。但是,这仅在发布到FlashPlayer 10时可用。

此外,您可能需要查看StingerLaser的updateObject方法中的以下行:
if(hitTestObject(eApi.gameStage[2][i])&eApi.gameStage[2][i]!=持用者)

它似乎在比较持用者(阵列)和什么