使用另一个.as文件中的变量?

时间:2013-05-03 14:02:12

标签: actionscript-3 flash-cs6

如果我在一个名为Main.as的文档中创建了变量,如下所示:

var backgroundLayer:Sprite = new Sprite;
var gameLayer:Sprite = new Sprite;
var interfaceLayer:Sprite = new Sprite;

如何在另一个.as文件中访问这些内容?我正在尝试将游戏中的对象分层,但是我遇到了错误。例如,我有一个EnemyShip.as文件,其中包含以下内容:

function enterFrame(e:Event)
        {
            this.x -= speed;
            if(this.x < -100)
            {
                removeEventListener("enterFrame", enterFrame);
                stage.removeChild(this);
            }
        }

function kill()
        {
            var explosion = new Explosion();
            stage.addChild(explosion);
            explosion.x = this.x;
            explosion.y = this.y;
            removeEventListener("enterFrame", enterFrame);
            stage.removeChild(this);
            Main.updateScore(1);
            shot.play();
        }

问题是我试图将stage.addChild(explosion)更改为gameLayer.addChild(explosion)但我收到了access of undefined property gameLayer错误。

我可能会遗漏一些明显的东西,所以请告诉我。我也不太确定我是否应该使用new Spritenew Movieclip;我的大部分游戏都是由电影剪辑和按钮组成的,所以也许这应该改变一下?

感谢。

编辑:我通过执行以下操作尝试了Kodiak的第二个解决方案(相关部分):

EnemyShip.as:

package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.ui.Mouse;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.text.TextFormat;
import flash.text.TextField;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.system.LoaderContext;
import flash.display.Sprite;
import flash.net.Socket;

public class EnemyShip extends MovieClip
{
    public static var gameLayer:Sprite;

    var speed:Number;
    var shot = new ShotSound();

    public function EnemyShip()
    {
        this.x = 800;
        this.y = Math.random() * 275 + 75;
        speed = Math.random()*5 + 9;
        addEventListener("enterFrame", enterFrame);
        addEventListener(MouseEvent.MOUSE_DOWN, mouseShoot);
    }

Main.as:

package  {
 import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.ui.Mouse;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.text.TextFormat;
import flash.text.TextField;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.system.LoaderContext;
import flash.display.Sprite;
import flash.net.Socket;


public class Main extends MovieClip {

EnemyShip.gameLayer = gameLayer;
var interfaceLayer:Sprite = new Sprite;
var menuLayer:Sprite = new Sprite;
var endGameLayer:Sprite = new Sprite;

我在1120: Access of undefined property gameLayer这样的行上遇到EnemyShip.gameLayer = gameLayer;等错误,当我尝试执行以下操作时:

    crosshair = new crosshair_mc();
    gameLayer.addChild(crosshair);

我得到了同样的错误。

1 个答案:

答案 0 :(得分:0)

标准

要尊重OOP,您应该将游戏图层作为参数提供给EnemyShip类。例如:

package
{
   public class EnemyShip extends Sprite
   {
       private var _gameLayer:Sprite;

       public function EnemyShip(pGameLayer:Sprite)
       {
           _gameLayer = pGameLayer;
       }
   }
}

当你从Main.as实现它时:

var enemy:EnemyShip = new EnemyShip(gameLayer);

静态

另一个不那么简单但易于使用的解决方案是使用静态变量,例如:

package
{
   public class EnemyShip extends Sprite
   {
       public static var gameLayer:Sprite;

       public function EnemyShip()
       {
           if (!gameLayer)
           {
              throw new Error("Game Layer not defined on EnemyShip");
           }
       }
   }
}

在你的Main.as:

EnemyShip.gameLayer = gameLayer; //once and for ever
var enemy:EnemyShip = new EnemyShip();
var enemy2:EnemyShip = new EnemyShip();