windigo
windigo

Reputation: 35

Updating and displaying a variable in AS3

I have been following an AS3 tutorial for an avoider game, the trouble is the tutorial is for CS5 and I am using Flash Develop. I am completely stuck trying to update and display the score. I have read through several posts on SO and elsewhere and still can't seem to fix it.

Here is the Score class that I call to display the score and it contains the function that updates the "score" value.

package  
{
import flash.display.Sprite;
import flash.events.TextEvent;
import flash.text.TextField
import flash.text.TextFormat


public class Score extends Sprite
{
    public var scoreDisplay:String;
    public var currentValue:int;

    public function Score() 
    {
        updateDisplay()
    }

    public function updateDisplay():void
    {
        scoreDisplay = currentValue.toString();

        var format:TextFormat = new TextFormat();
            format.size = 25;
            format.font = "Verdana"

        var myText:TextField = new TextField();
            myText.defaultTextFormat = format;
            myText.text = scoreDisplay;
            myText.background = true;
            myText.autoSize
            myText.width = 50;
            myText.height = 35;

        addChild(myText)
            myText.x = 340
            myText.y = 10
            myText.mouseEnabled = false
    }

    public function addToValue( amountToAdd:Number ):void
    {
        trace("addToValue")
        trace(currentValue)
        currentValue = currentValue + amountToAdd;
        trace(currentValue + "   1")

    }
}
}

and here is the Game class I am running to increase the "score" per tick.

package  
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.Timer;

import Score;

public class Game extends Sprite
{
    public var army:Array;
    public var gameTimer:Timer;
    public var player:Player;
    public var background:Sprite;

    public function Game() 
    {           
        army = new Array();
        var newenemy:Enemy = new Enemy(100, -15);
        army.push(newenemy);
        addChild(newenemy);

        player = new Player();
        addChild(player);
        player.x = mouseX;
        player.y = mouseY;

        gameTimer = new Timer(20);
        gameTimer.addEventListener(TimerEvent.TIMER, move);
        gameTimer.addEventListener(TimerEvent.TIMER, onTick);
        gameTimer.start();
    }

    private function move(timerEvent:TimerEvent):void
    {

        player.x = mouseX;
        player.y = mouseY;

        for each (var enemy:Enemy in army)
        {
            enemy.moveDownABit();

            if (player.hitTestObject(enemy))
            {
                gameTimer.stop();

                dispatchEvent( new AvatarEvent( AvatarEvent.DEAD));

            }
        }
    }

    public function onTick(e:Event):void
    {
        if (Math.random() < .1)
        {
            var randomX:Number = Math.random() * 400;
            var newEnemy:Enemy = new Enemy(randomX, -15);
            army.push(newEnemy);
            addChild(newEnemy);

            var instanceScore:Score = new Score();
            instanceScore.addToValue(10)
        }
    }   
}

}

My trace function outputs "addToValue, 0, 10 1" and repeats that, never changing the 'curentValue' variable past 0. I can tell that the 'amountToAdd' is functioning properly but have no idea why 'currentValue' is always reset to 0.

questions on SO that I viewed; Display dynamic variable on next key frame AS3 Avoider Game Tutorial: Score not working

Upvotes: 0

Views: 245

Answers (1)

Andrey Popov
Andrey Popov

Reputation: 7510

The problem is this:

var instanceScore:Score = new Score();

This means that every time there is a tick, you create new score. When you create new score, it starts from 0. You update it to 10, and on the next tick, you ignore the old value of 10 by creating a whole new class. The new class has a value of 0, as it never has it's value increased before. Then you increase it again.. and a new tick starts (looping)

What you need to do is to instantiate score instance ONLY ONCE and save it as a class member variable. Then you can call increase to it.

Upvotes: 2

Related Questions