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