0

如果我在一个名为 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 Spriteor new Movieclip; 我的大部分游戏都是由电影剪辑和按钮组成的,所以也许这应该改变?

谢谢。

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

敌舰.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);
    }

主要作为:

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 gameLayerEnemyShip.gameLayer = gameLayer;

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

我犯了同样的错误。

4

1 回答 1

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();
于 2013-05-03T14:23:06.570 回答