Search code examples
actionscript-3flash-cs6

Use variables from one .as file in another?


If I have created variables in one document named Main.as as follows:

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

How can I access these in another .as file? I'm trying to sort the objects in my game into layers but I'm getting errors. For example, I have a EnemyShip.as file with the following in it:

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

The problem is I was trying to change stage.addChild(explosion) to gameLayer.addChild(explosion) but I got an access of undefined property gameLayer error.

There may be something obvious I am missing, so please let me know. I'm also not too sure whether I should be using new Sprite or new Movieclip; the majority of my game is made up of movie clips and buttons, so perhaps this should be changed?

Thanks.

EDIT: I tried Kodiak's second solution by doing the following (Relevant parts):

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;

I'm getting errors like 1120: Access of undefined property gameLayer on lines such as EnemyShip.gameLayer = gameLayer; and when I try to do things like:

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

I get the same error.


Solution

  • Standard

    To respect OOP, you should give the game layer to your EnemyShip class as a parameter. For example:

    package
    {
       public class EnemyShip extends Sprite
       {
           private var _gameLayer:Sprite;
    
           public function EnemyShip(pGameLayer:Sprite)
           {
               _gameLayer = pGameLayer;
           }
       }
    }
    

    and when you instanciate it from your Main.as:

    var enemy:EnemyShip = new EnemyShip(gameLayer);
    

    Static

    Another solution, less trivial but easier to use, would be having a static variable such as:

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

    And in your Main.as:

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