访问变量本身而不是变量的值

时间:2015-01-08 21:39:24

标签: actionscript-3 variables

我最近遇到的一个问题是尝试间接更改变量。

e.g。

 var health:int = 100;
 var currentVar = health; //I want currentVar to equal "health"

 var currentVar -= 50; // I want to subtract 50 from health;
 trace(health) // 100

之后我可以将生命值设置为等于currentVar,但在某些情况下这是不可能的。 我怎样才能理解我不希望当前的var等于健康等于什么,健康本身呢?

1 个答案:

答案 0 :(得分:0)

您无法在As3中创建基本类型的引用(或指针)。 它们总是按价值传递。

但是你可以用对象做到这一点。 在您的情况下,无论如何,面向对象的方法可能更好。 谁的健康呢?谁的法术力是什么? 可能有一点既有法术力又有健康(可能还有许多其他属性)

因此无论试图修改不同属性的函数是什么,都应该接收整个对象。 您可以(应该)定义一个包含所有具有相应setter和getter函数的属性的类。 比接受该类作为参数。 在该函数中,您可以决定要修改的属性。

以下是一个例子:

package 
{
    import flash.display.AVM1Movie;
    import flash.display.Sprite;

    public class FlashTest extends Sprite
    {
        public function FlashTest() 
        {
            var hero:Hero = new Hero();

            trace(hero.health, hero.mana);
            dealDamage(hero);

            trace(hero.health, hero.mana);
            absorbEnergy(hero);

            trace(hero.health, hero.mana);
            doRandomThing(hero);
        }

        private function dealDamage(hero:Hero):void
        {
            hero.health -= 5;
        }

        private function absorbEnergy(hero:Hero):void
        {
            hero.mana -= 5;
        }

        private function doRandomThing(hero:Hero):void
        {
            if (Math.random() >= 0.5)
            {
                hero.health -= 15;
            }
            else
            {
                hero.mana -= 15;
            }
        }
    }
}

internal class Hero
{
    private var _health:uint = 100;
    private var _mana:uint = 100;

    public function set health(value:uint):void
    {
        _health = Math.max(0, value);

        if(_health == 0)
        {
            trace("I'm dead");
        }
    }

    public function get health():uint
    {
        return _health;
    }

    public function set mana(value:uint):void
    {
        _mana = Math.max(0, value);

        if(_mana == 0)
        {
            trace("No more magic");
        }
    }

    public function get mana():uint
    {
        return _mana;
    }
}