Aenil
Aenil

Reputation: 13

Using variable from another class as3

i separated one big file into multiple file to have it cleaned and i got a problem now.

I have my main.as, character.as, camera.as.

What i'm trying to do is access a variable from another class which i set later on that class. Ill show you what i mean.

From my main.as im loading each class and add them as child so it get displayed on screen.

    public function buildGame()
    {
        var loadMap:Sprite = new nf_MapBuilder();
        var xChar:Sprite = new nf_Character();
        var xCam:Sprite = new nf_Camera();
        var UserControl:nf_UserControl = new nf_UserControl();

        addChild(loadMap);
        addChild(xChar);
        addChild(xCam);
        addChild(UserControl);
    }

Everything show on screen like it needed. Then it goes to my character.as:

package as3
{
import flash.display.Sprite;
import flash.events.Event;

public class nf_Character extends Sprite
{
    public var character_pos:Array = new Array();
    public var character_is_moving:Boolean = false;
    public var character_x_dir:int = 0;
    public var character_y_dir:int = 0;
    public var character:hero = new hero();

    public function nf_Character()
    {
        addEventListener(Event.ADDED_TO_STAGE,xCharLoad);
    }

    public function xCharLoad(e:Event)
    {
        character_pos = [2,2];
        character.x=64*(character_pos[1]);
        character.y=64*(character_pos[0]);
        addChild(character);
    }
}
}

There is the problem. I need to use those variable i set there in my character.as to use it in my camera.as:

package as3
{
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.display.StageScaleMode;

import as3.nf_Character;

public class nf_Camera extends Sprite
{
    private var xChar:nf_Character = new nf_Character();

    //Camera variables
    var stageW2:Number;
    var stageH2:Number;
    var view:Rectangle;

    public function nf_Camera()
    {
        addEventListener(Event.ADDED_TO_STAGE,xCamGo);
    }

    public function xCamGo(e:Event):void
    {
        trace("Camera pos - " + xChar.x + " " + xChar.character.y);

        view = new Rectangle(0,0,stage.stageWidth,stage.stageHeight)
        stageW2 = stage.stageWidth / 2 - 32;
        stageH2 = stage.stageHeight / 2 - 32;

        addEventListener(Event.ENTER_FRAME,CamView);
    }
    public function CamView(e:Event):void
    {
        view.x = xChar.character.x - stageW2;
        view.y = xChar.character.y - stageH2;
        scrollRect = view;
    }
}
}

When it was all in one big file it was ok i just had to set the variable in the class and acessing it trough every function but now im kinda confused. Anyone see how i could do this?

Upvotes: 0

Views: 3753

Answers (2)

net.uk.sweet
net.uk.sweet

Reputation: 12431

In short, I think you should subscribe to an event from your character in your main class which is fired whenever the character moves. In the handler for that event you could call a method on the camera to set it's position according to the current position of the character.

main.as

private var xChar:Sprite = new nf_Character();
private var xCam:Sprite = new nf_Camera();

public function buildGame()
{
    var loadMap:Sprite = new nf_MapBuilder();
    var UserControl:nf_UserControl = new nf_UserControl();

    // listen for when the character has moved
    xChar.addEventListener(MoveEvent.MOVED, characterMovedHandler);

    addChild(loadMap);
    addChild(xChar);
    addChild(xCam);
    addChild(UserControl);
}

private function characterMovedHandler(event:MoveEvent):void
{
    xCam.setPosition(xChar.x, xChar.y);
}

nf_Character.as

public class nf_Character extends Sprite
{
    public var character_pos:Array = new Array();
    public var character_is_moving:Boolean = false;
    public var character_x_dir:int = 0;
    public var character_y_dir:int = 0;
    public var character:hero = new hero();

    public function nf_Character()
    {
        addEventListener(Event.ADDED_TO_STAGE,xCharLoad);
    }

    public function xCharLoad(e:Event)
    {
        character_pos = [2,2];
        character.x=64*(character_pos[1]);
        character.y=64*(character_pos[0]);
        addChild(character);
    }

    public function xCharMoved() 
    {
        // Dispatch a custom event when the character moves
        dispatchEvent(new MovedEvent(MovedEvent.MOVED)); 
    }
}

nf_Camera.as

public class nf_Camera extends Sprite
{
    private var xChar:nf_Character = new nf_Character();

    //Camera variables
    var stageW2:Number;
    var stageH2:Number;
    var view:Rectangle;

    public function nf_Camera()
    {
        addEventListener(Event.ADDED_TO_STAGE,xCamGo);
    }

    public function xCamGo(e:Event):void
    {
        trace("Camera pos - " + xChar.x + " " + xChar.character.y);

        view = new Rectangle(0,0,stage.stageWidth,stage.stageHeight)
        stageW2 = stage.stageWidth / 2 - 32;
        stageH2 = stage.stageHeight / 2 - 32;

        // Probably only need one enterframe either in your character class or main
        //addEventListener(Event.ENTER_FRAME,CamView);
    }
    public function setPosition(x:Number, y:Number):void
    {
        view.x = xChar.character.x - stageW2;
        view.y = xChar.character.y - stageH2;
        scrollRect = view;
    }
}

Out of interest, how are you moving the character?

Upvotes: 1

bwroga
bwroga

Reputation: 5459

You can pass your character class instance to your camera class instance as an argument of the constructor. You will then have a reference to the character inside the camera class and you can access it's variables

// Inside buildGame() in main.
var xChar:nf_Character = new nf_Character();
var xCam:nf_Camera = new nf_Camera(xChar);

// Inside nf_Camera
public function nf_Camera(char:nf_Character) {
    xChar = char;
}

Upvotes: 0

Related Questions