Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 使用AS3在特定时间调用多个与类链接的函数_Performance_Actionscript 3 - Fatal编程技术网

Performance 使用AS3在特定时间调用多个与类链接的函数

Performance 使用AS3在特定时间调用多个与类链接的函数,performance,actionscript-3,Performance,Actionscript 3,我正在为一个游戏设计一个随机波浪系统。其想法是,每1000个点,将从大约50种可能性中选择一种运动模式。这将影响选定项目的速度、方向和图像。我设计了一种我认为可行的方法,但我不确定这是否会花费太多内存来运行 public class engine extends MovieClip { private var countK:Number = 0; private var newWave:Boolean = true; public function engine()

我正在为一个游戏设计一个随机波浪系统。其想法是,每1000个点,将从大约50种可能性中选择一种运动模式。这将影响选定项目的速度、方向和图像。我设计了一种我认为可行的方法,但我不确定这是否会花费太多内存来运行

public class engine extends MovieClip {

    private var countK:Number = 0;
    private var newWave:Boolean = true;

    public function engine() {
        stage.addEventListener(Event.ENTER_FRAME, update);
    }

    private function update():void {
        checkCount();
        checkNew();
    }

    private function checkCount():void {
        if (count => 1000) {
            newWave=true;
            count = 0;
        }
    }

    private function checkNew():void {
        if(newWave) {
            randomNumber();
            newWave=false
        }
    }
以上是我的快速想法,即每1000个点生成一个随机数。积分可以以任何方式添加(只需在“分数”中添加20,同时在“计数”中添加20)。在checkNew中我可以使用一个随机数函数,我不会再使用另一个函数,它只是为了可读性

                            var newEnemy:mEnemy =new mEnemy();
            stage.addChild(newEnemy);
            EnemyArray.push(newEnemy);
            trace(EnemyArray.length);
上面是一些可以向stage添加mEnemy实例的代码。现在我开始放松了,我如何将随机数转化为改变mEnemy行为的可行方法

在mEnemy类中有50个函数,并且在添加child之前,我做了一些类似new敌手的事情,这明智吗?如果是这样,我可以通过让它选择函数而不编写一大堆If语句来保存代码吗

而不是

if (randomN==1) {
newEnemy.WAVEfunction1();
}
if (randomN==2) {
newEnemy.WAVEfunction2();
}
....
我能做什么

newEnemy.WAVEfunction[randomN]();
这也是假设在敌人内部使用功能是最好的想法。将行为改为包含在发动机类中是否更好

正如你所看到的,我不是程序员。我对这种想法很陌生,我不想制造一个会破坏游戏性能的错误(更不用说养成坏习惯了!)


如果您有时间阅读此问题,谢谢!如果你能容忍我的无知,那就更谢谢你了

如果波函数只是创建一个特定类型的敌人,那么制作一个包含每种类型细节的阵列可能更有意义,如下所示:(我当然在猜测你的敌人是如何工作的)

然后更改mEnemy()以根据您提供的详细信息进行设置:

public function mEnemy(details:Object) {
    mySpeed = details.speed;
    ...
这样,您就可以编写
新菜单(敌方类型[randomN])

或者,如果您确实需要有许多单独的波函数,您可以使用访问对象的属性,例如按名称访问
newbenefy
(或
this
以引用当前对象):

因此,您可以通过以下方式运行波函数:

newEnemy["WAVEfunction" + String(randomN)]();

这是一个2年前的问题,已经不太现实了,但我还是在这里试试自己,因为我刚刚报名

据我所知,你打算在这里为每种敌人编写所有50种行为方法,这当然不好

首先,您可以添加“行为”实体。因此,每个敌人现在都有一个行为属性

接下来,您必须创建一个单独的行为类或接口,它将有50个子类(行为1…行为50),每个子类实现自己的run()方法。请注意,通过这种方式,您可以添加或删除行为,而无需触摸其他任何东西。基本实现如下所示:

public class Behaviour() {
    public function run(e:Enemy):void {
       e.y += 10;
    }
}
public class BehaviourFactory {
   public static getBehaviour(n:int):Behaviour {
     switch(n) {
        case 1: return new Behaviour1();
        case 2: return new Behaviour2();
        // etc.
     }
   }
}
所以你看,敌人并不是在做什么。正是这种行为对传递给敌人的敌人产生了影响

接下来,您需要一种机制来从给定的随机数中获得适当的子类

您需要的是一个工厂——一个基于输入参数返回不同类型行为的静态类。大概是这样的:

public class Behaviour() {
    public function run(e:Enemy):void {
       e.y += 10;
    }
}
public class BehaviourFactory {
   public static getBehaviour(n:int):Behaviour {
     switch(n) {
        case 1: return new Behaviour1();
        case 2: return new Behaviour2();
        // etc.
     }
   }
}
您也可以使用类定义,而不是在一个开关中有50个选项:

var c:Class = getDefinitionByName('Behaviour' + your_random_number) as Class;
return new c;
(在进一步的实现中,它可以被缓存、存储在阵列中等)拥有工厂后,您只需执行以下操作:

var b:Behaviour = BehaviourFactory.getBehaviour(your_random_number);
接下来,您可以使用不同的方法,具体取决于行为的变化。例如,如果敌人天生具有特定的当前行为,并且在敌人的生命周期内不会发生变化,则您可以将其中一个行为子类指定给敌人的行为属性:

public class Enemy {
    public var behaviour:Behaviour;
    public function Enemy(b:Behaviour) {
        this.behaviour = b;
    }
}

var e:Enemy = new Enemy(BehaviourFactory.getBehaviour(random_number));
e.behaviour.run(e);
当然,此属性也可以动态更改,以便下次运行时敌人的行为会有所不同

如果行为对所有敌人都是全局的,并且同时对所有敌人都进行了更改,则您不需要在敌人对象中拥有属性。您只需拥有一个全局行为对象,并向其传递一个敌人实例:

var e:Enemy = enemy_list[i];
current_behaviour.run(e);
它将根据当前选择的行为处理每个活跃的敌人

最后,还有一种更有趣的方法来实现行为。假设您有几种行为类型,它们没有任何共同之处。比如说,敌人可以爬行、飞行、射击和毒害。假设您正在尝试实现所有可能的组合:Flying,FlyingShooting,flyingtoxing,flyingshootingtoxing,等等。您必须为这些组合中的每一个创建一个行为子类,尽管它们有非常常见的基本部分

还有另一种方法,叫做装饰图案。您只需为每个质量编写一个方法。当您需要质量组合时,只需创建具有第一个质量的对象,并将其包装到具有第二个质量的对象中,然后将其包装到具有第三个质量的对象中,等等。因此,您的基本行为类需要添加一个:

public class Behaviour {
    private var parent_bhv: Behaviour;

    public function Behaviour(bhv:Behaviour = null) {
        if (bhv) this.parent_bhv = bhv;
    }

    public function run(e:Enemy):void {
       e.y += 10; // do what we need to do
       if (this.parent_bhv) this.parent_bhv.run(e); // pass to a next bhv.
    }
}
让我们创建数字1、3和15的复合行为:

var decorated_behaviour:Behaviour = BehaviourFactory.getDecoratedBehaviour([1, 3, 15]);
我们还将添加相应的行为工厂方法:

public class BehaviourFactory {
    public static function getDecoratedBehaviour(bhv_list:Array):Behaviour {
       var b:Behaviour = null;
       for (var i:int = 0; i < bhv_list.length; i++) {
          var c:Class = getDefinitionByName('Behaviour' + bhv_list[i]) as Class;
          b = new c(b);
       }
       return b;
    }
}
公共类行为工厂{
公共静态函数GetDecoratedBehavior(bhv_列表:数组):行为{
变量b:行为=零;
对于(变量i:int=0;i

现在,您无需对所有可能的组合进行编码即可完成所有设置

你知道你的波浪会做什么吗?你能把数字传给波形发生器吗?另外,你应该使用switch语句和,以及组合checkCount和checkNew函数