Search code examples
actionscript-3classinstance-variablesaddchild

How do I pass variables to new children? [flash AS3]


The code illustrates the problem pretty well, I've cut everything unrelated out.

Create 2-4 kinsmen when the game starts

function createInitialKinsmen()
{
    for (var k:int = 1; k < 3 + Math.round(Math.random() * 2; k++)
    {
        if (k == 1)
        {
            createKinsmen(0);
            trace ("player");
        }
        else
        {
            createKinsmen(1);
            trace ("starting kinsmen");
        }
    }
}

Kinsmen creation function

function createKinsmen(arrivalTypeVar:int)
{
    var newKinsmen = new kinsmen;
    listPanel.kinsmenDivider.addChild(newKinsmen);
    totalKinsmen++;
    totalKinsmenAlive++;
    newKinsmen.name = "kinsmen" + totalKinsmen;
    newKinsmen.arrivalType = arrivalTypeVar;
}

Kinsmen class

public class kinsmen extends MovieClip
{
    var arrivalType:int;
    function kinsmen()
    {
        trace(this.name);
        if (this.arrivalType = 0)
        {
            trace("player");
        }
        if (this.arrivalType = 1)
        {
            trace("starting kinsmen");
        }
    }
}

The output should say:

kinsmen1
player
player
kinsmen2
starting kinsmen
starting kinsmen
kinsmen3
starting kinsmen
starting kinsmen
kinsmen4
starting kinsmen
starting kinsmen

But instead says:

kinsmen1
player
player
kinsmen2
player
starting kinsmen
kinsmen3
player
starting kinsmen
kinsmen4
player
starting kinsmen

Which means that the arrivalType variable isn't being passed on. It seems to be hard-coded variables can be passed though thus at the moment I have a square with alpha 0 inside the kinsmen movieclip and it's x position determines the value of arrivalType in the constructor but this surely can't be good practice, is there a better way of doing this?


Solution

  • I think you just want to modify your constructor function for the kinsmen class to accept a parameter for the arrivalType and the name.

    What you're currently doing is constructing a new kinsmen object and afterwards setting the arrivalType and the name on that object. So when the constructor code runs, the arrivalType is the default value of an int which is 0.

    Modify your constructor function like this in the kinsmen class:

    function kinsmen(arrivalType:int, name:String)
    {
        this.name = name;
        this.arrivalType = arrivalType;
        if (this.arrivalType == 0)
        {
            trace("player");
        }
        if (this.arrivalType == 1)
        {
            trace("starting kinsmen");
        }
    }
    

    And modify your createKinsmen() function so that it passes in a value for the arrivalType to the constructor method, instead of setting the arrivalType and name after the object is created:

    function createKinsmen(arrivalTypeVar:int)
    {
        totalKinsmen++;
        totalKinsmenAlive++;
        var newKinsmen = new kinsmen(arrivalTypeVar, "kinsmen" + totalKinsmen);
        listPanel.kinsmenDivider.addChild(newKinsmen);
    }