如何从类AS3调用函数

时间:2012-07-24 01:40:55

标签: actionscript-3

我正在学习成为一名游戏设计师,现在我的Flash游戏遇到了一些问题。

该游戏有一个Counter Class,其分数类可以扩展Counter。它将被添加到我的PlayScreenA类的舞台上。

计时器以数字开头,每24帧减少一次。但是在我的英雄级别中,我可以拿起一些硬币,而硬币会增加我的分数上的时间。

问题是:我如何在Hero Class中说出在Counter Class中执行addToValue函数?

代码: 在PlayScreenA类中创建我的分数:

    private var myTime:Score = new Score();
    private function create_time (){

        myTime.x = 800;
        myTime.y = 50;          
        addChild(myTime);
    }

柜台类:

package 
{
import flash.display.MovieClip;
public class Counter extends MovieClip
{
    public var currentValue:Number;

    public function Counter()
    {
        reset();
    }

    public function addToValue( amountToAdd:Number ):void
    {
        currentValue = currentValue + amountToAdd;
        updateDisplay();
    }

    public function subToValue( amountToSub:Number ):void
    {
        currentValue = currentValue - amountToSub;
        updateDisplay();
    }

    public function reset():void
    {
        currentValue = 20;
        updateDisplay();
    }

    public function updateDisplay():void
    {

    }
}
}

分数等级:

package 
{
import flash.text.TextField;
import flash.events.Event;
public class Score extends Counter
{
    protected var _timeCounter:int;     

    public function Score()
    {
        super();
        addEventListener(Event.ENTER_FRAME, onUpdate);
    }
    override public function updateDisplay():void
    {
        super.updateDisplay();
        scoreDisplay.text = currentValue.toString();
    }
    protected function onUpdate(e:Event):void
    {
        _timeCounter++;
        trace(currentValue);

        if (_timeCounter == 24)
        {
            this.subToValue( 1 );
            _timeCounter = 0;
        }           
    }
}
}

我需要调用函数的Hero Class:

for(var i:int; i<collisionList.length;i++)
        {
            var $collision:platform_tile = collisionList[i];

            if($hasCollided = hitbox.hitTestObject($collision.hitBox) && $collision.alpha<0.8 && $collision.alpha>0.6)
            {
                $collision.alpha=0;
                $collision.visible = false;
                //Here is where I want to call my subToValue                                        function!
                break;
            }

2 个答案:

答案 0 :(得分:1)

由于addToValuesubToValue是实例方法,您应该为英雄对象中的计数器对象提供引用(实例变量),然后调用其addToValue或{{1方法。

subToValue

你应该在你的英雄对象中启动它,或者通过getter / setter指定一个预先存在的计数器对象。然后你可以打电话:

var theCounter:Counter;

答案 1 :(得分:0)

我假设您正在尝试访问最初在PlayerScreenA类中创建的Score类的对象...

如果是这种情况,那么你要么派生两个类之间的关系来传递这个对象,要么你可以保持一个静态类来跟踪全局级别的函数......

public class AppRefrences
{
    public static var addToValueFunc:Function;    
}

在玩家A级中,

    private var myTime:Score = new Score();
    private function create_time (){

        myTime.x = 800;
        myTime.y = 50;          
        addChild(myTime);

        // This is where you set the function
        Apprefrences.addToValueFunc = myTime.addToValue;
    }

在英雄课堂上,

for(var i:int; i<collisionList.length;i++)
        {
            var $collision:platform_tile = collisionList[i];

            if($hasCollided = hitbox.hitTestObject($collision.hitBox) && $collision.alpha<0.8 && $collision.alpha>0.6)
            {
                $collision.alpha=0;
                $collision.visible = false;

                // This is where you call the function
                if(AppRefrences.addToValueFunc != null) 
                AppRefrences.addToValueFunc(0); 

                break;
            }

尝试使用getter&amp; setters控制静态变量的更新。为了清楚起见,我没有把它包括在内。