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



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

我正在制作一个简单的RPG风格的游戏。我有多个文件。MainClass.as、Hero.as、FrontEnd.as 和 Levels.as。 我把它们都安排在公共课上。我在 FrontEnd.as 中有一个名为gotoMainMenu()的函数,在 Hero.as 中有一个名为currentHP的变量。我想做一个检查当前HP和

if(currentHP <= 0) {gotoMainMenu()}

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

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

但这也行不通。还尝试导入类...如何访问另一个类的函数和变量?

你在这里要做的,是所谓的"依赖注入"

相反,在英雄类中创建一个新的前端实例,您希望将舞台上存在的 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);
}

最新更新