Не удалось преобразовать тип при добавлении объекта в массив - PullRequest
0 голосов
/ 30 января 2010

получаю следующую ошибку ..

 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.wielder - Массив, который объявлен внутри класса 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;
    }
   }
  }
 }
}

Вот класс, который я пытаюсь поместить в массив

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();
   }
  }
 }
}

Если никто не может решить эту проблему, по крайней мере, я хотел бы знать, насколько свободен массив в ActionScript? Можно ли использовать все типы классов или только классы одного родительского класса или что? спасибо!

Ответы [ 4 ]

1 голос
/ 30 января 2010

Ваша проблема в этой строке:

laser.wielder = this;

Вы назначаете wielder (Массив) для «this», которое является Stinger.

1 голос
/ 30 января 2010

Массивы во Flash очень"свободные"! Они не ограничены одним типом, поэтому они могут содержать любое количество различных типов объектов. Например, это действительно ActionScript 3: var arr: Array = new Array (); arr.push ("яблоко"); arr.push (новый MovieClip ()); arr.push (234); arr.push (новый StingerLaser ()); след (обр); // Трассировки: «яблоко», [объект MovieClip], 234, [объект StingerLaser]

Так что ваша проблема на самом деле не добавляет в ваш массив. Это потому, что в следующей строке в методе DoubleShot вашего Stinger Class:

laser.wielder = this;

"this" относится к экземпляру класса Stinger .

PS. Чтобы иметь массив, который может иметь только один тип, вы должны использовать тип верхнего уровня Vector . Однако это доступно только при публикации в FlashPlayer 10.

1 голос
/ 30 января 2010

Массивы очень открыты, вы можете вставить в них все, что захотите. Вот строка кода, вызывающая ваши неприятности:

laser.wielder = this

Это в классе "Stinger", метод "DoubleShot"

Гудлак!

0 голосов
/ 30 января 2010

Кроме того, вы можете проверить следующую строку, которая есть в методе updateObject StingerLaser: if(hitTestObject(eApi.gameStage[2][i]) && eApi.gameStage[2][i] != wielder)

Похоже, он сравнивает wielder (массив) с eApi.gameStage [2] [i], который, судя по вызову теста на попадание, должен быть каким-либо объектом DisplayObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...