如何使用其他类/文件中的函数? AS3

时间:2014-04-01 05:03:24

标签: actionscript-3 flash class scope

我一直在网上搜索,几个小时都没有运气阅读。可能是因为它是如此基本,可能是因为我对术语感到困惑。 (这里的菜鸟相当。)很快拿起一本书,但在那之前,也许有人可以为我澄清这一点。

我正在制作一个简单的RPG风格游戏。我有多个文件。 MainClass.as,Hero.as,FrontEnd.as,& Levels.as。我把他们全部公开上课。我在FrontEnd.as中有一个名为gotoMainMenu()的函数,在Hero.as中有一个名为currentHP的变量。我想创建一个检查currentHP和

的函数
if(currentHP <= 0) {gotoMainMenu()}

从我读过的内容中,我需要在我的Hero类中实例化FrontEnd.as以访问其功能......但它对我不起作用。所有文件都在同一个文件夹中。我试过这个:

var frontend:FrontEnd = new FrontEnd();
addChild(frontend);
if(currentHP <= 0) {frontend.gotoMainMenu()}

但这也不起作用。 还尝试导入课程...... 如何从其他类访问函数和变量?

1 个答案:

答案 0 :(得分:0)

你想在这里做什么,就是所谓的&#34;依赖注入&#34;

相反,要在你的英雄类中创建一个新的frontEnd实例,你想要将舞台上已经存在的frontEnd实例传入你的英雄类。

例如,你可能让你的heroclass的构造函数看起来像这样:

public function Hero (frontend:FrontEnd) {
this.frontEnd = frontEnd;
}

And then you can do 
if(currentHP < 0 ) { frontEnd.gotoMainMenu()};

如果你需要在你的类中注入3个以上的类,你应该开始考虑通过属性注入而不是构造函数。

你的课程看起来像这样:

package {
public class Hero {

    public var frontEnd:FrontEnd;
    public var levels:Levels;
    public var weapon:Weapon;

    public function Hero() {

    }

    public function fire(){
        if(weapon){
        weapon.fire();
        }
    }

    public function getHit()
    {
       if(frontEnd)
       { 
         if(currentHP < 0) { frontEnd.gotoMainMenu();}
       }
    }
    public function increaseScore() {
        if(levels){
            levels.increaseScore();
        }
    }

}
}

然后,当您实例化Hero类时,它看起来像这样:

var hero:Hero = new Hero();
hero.levels= levels;
hero.frontEnd = frontEnd;
hero.weapon = machineGun;

或者,您可以使用依赖注入框架(如RobotLegs2)为您完成此工作。 https://github.com/robotlegs/robotlegs-framework

但是,在这种情况下,这不是处理事情的正确方法。 在这种特殊情况下,你真正想要做的是派遣一个事件。

所以,你会:

import flash.events.EventDispatcher;
import flash.events.Event;
public class Hero extends EventDispatcher{


}

然后在某些函数中你会写:

if(currentHP < 0 ) {dispatchEvent(new Event(DIED));}

然后在你的英雄所在的等级中,你会做这样的事情:

addEventListener(Hero.DIED, handleDeath);

private function handleDeath(e:Event){
  frontEnd.gotoMainMenu();
}

调度事件的一大优势是,您可以让多个事情听同一事件。或者您甚至可以切换收听事件的内容。

所以你可以这样做:

if(hasRessurection)
{
  hero.addEventListener(Hero.DIE, restartLevel,false,0,true);
  town.addEventListener(Hero.DIE, increaseRessurectionCost, false,0,true)
} else {
  hero.addEventListener(Hero.DIE, gotoMainMenu,false,0,true);
}
相关问题