0

我正在为游戏开发一个随机波系统。这个想法是,每 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);

上面是一些可以在舞台上添加一个 mEnemy 实例的代码。现在我开始放松它了,我怎样才能将随机数转换为改变 mEnemy 行为的可行方法?

在 menemy 类中有 50 个函数是否明智,就在我 addChild 之前,我做了类似 newEnemy.WAVEfuncton1(); ? 如果是这种情况,我可以通过让它选择函数而不编写一大堆 if 语句来保存代码吗?

代替;

if (randomN==1) {
newEnemy.WAVEfunction1();
}
if (randomN==2) {
newEnemy.WAVEfunction2();
}
....

我可不可以做;

newEnemy.WAVEfunction[randomN]();

这也是假设在敌人内部使用函数是最好的主意。将行为放在引擎类中会更好吗?

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

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

4

2 回答 2

0

如果波函数只是创建某种类型的单个敌人,那么使用每个类型的详细信息制作一个数组可能更有意义:(我猜你的敌人是如何工作的)

private const ENEMY_TYPES:Array = [
    {speed:1, direction:90, image:1},
    {speed:2, direction:45, image:2}
    ]

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

public function mEnemy(details:Object) {
    mySpeed = details.speed;
    ...

这样,你就可以写new mEnemy(ENEMY_TYPES[randomN]);

或者,如果您确实需要许多单独的波函数,您可以使用[ ] 数组访问运算符来访问对象的属性,例如newEnemy按名称(或this引用当前对象):

var exampleProperty:String = "Hello.";
this["exampleProperty"];

所以你可以通过编写来运行你的波函数:

newEnemy["WAVEfunction" + String(randomN)]();
于 2013-01-17T17:04:48.317 回答
0

一个有 2 年历史的问题,而且已经相当不实际,但让我在这里尝试一下,因为我刚刚注册。

据我了解,您在这里打算做的是为每种 Enemy 编写所有 50 种行为方法,这当然不好。

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

接下来,您必须创建一个单独的 Behavior 类或接口,它将有 50 个子类 (Behaviour1...Behaviour50),每个子类都实现自己的 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.
     }
   }
}

您还可以使用类定义,而不是在 switch 中有 50 个选项:

var c:Class = getDefinitionByName('Behaviour' + your_random_number) as Class;
return new c;

(在进一步的实现中,它可以被缓存,存储在数组中等。)拥有工厂后,您只需执行以下操作:

var b:Behaviour = BehaviourFactory.getBehaviour(your_random_number);

接下来,您可以根据行为变化的确切程度使用不同的方法。例如,如果敌人出生时具有特定的当前行为,并且在敌人的生命周期内没有改变,则可以将 Behavior 子类之一分配给 Enemy 的 behavior 属性:

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);

当然,这个属性也可以动态改变,所以下次运行时敌人的行为会有所不同。

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

var e:Enemy = enemy_list[i];
current_behaviour.run(e);

它将根据当前选择的行为处理每个活跃的敌人。

最后,还有更有趣的方式来实现行为。假设您有几种没有共同点的行为类型。比如说,敌人可以是爬行的、飞行的、射击的和有毒的。因此,假设您正在尝试实现所有可能的组合:Flying、FlyingShooting、FlyingPoisonous、FlyingShootingPoisonous 等。尽管它们具有非常常见的基本部分,但您必须为每个组合创建一个 Behavior 子类。

还有另一种方法,称为装饰器模式。您只需为每个单一质量编写一个方法。每当您需要质量组合时,您只需创建具有第一质量的对象并将其包装到具有第二质量的对象中并将其包装到具有第三质量的对象中等等。因此您的基本 Behavior 类需要添加一个:

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]);

让我们也添加相应的 BehaviourFactory 方法:

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;
    }
}

现在您已经准备就绪,无需编写所有可能的组合!

于 2015-01-31T15:05:00.730 回答