ActionScript 3中的游戏逻辑和游戏循环

时间:2011-10-22 21:07:19

标签: actionscript-3

我正在使用flash actionscript 3制作射击游戏,并对逻辑流程以及如何巧妙地使用OOP概念提出一些疑问。

主要有3个班级:

  1. 主类:初始化屏幕上的对象。
  2. 敌人等级:用于移动屏幕上的敌人。
  3. Bullet Class:用于拍摄。
  4. 我想要做的是找出敌人是否被子弹击中并做了必须做的事情......

    我现在正在做的是我有一个ENTER_FRAME事件,我在其中检查每个敌方单位(保存在数组中)的碰撞检测与创建的项目符号实例,如果它发生碰撞,则执行所有必要的操作。主要类..在过程中堵塞Main类..

    这是正确的技术吗?或者有更好的解决方案吗?

2 个答案:

答案 0 :(得分:4)

尝试考虑更多OOP,负责任的每个对象是什么?

我们有能够击中的敌人:

class Enemy : extends NPC implements IHittable {
    . . .

    function update(delta) {
        // move, shoot, etc.
    }

    function handleHit(bullet) {
        // die
    }
}

一个可击中的对象:

interface IHittable {
    function handleHit(bullet);
}

子弹应该移动并击中东西:

class Bullet : {
    function update(delta) {
        // update position
    }

    function checkHits(world:World) {
        for each(var hittable:IHittable in world.objects) { // might want to cluster objects by location if you're handling lots of objects / bullets)
            if (isColidingWith(hittable))
                o.handleHit(bullet);
        }
    }
}

然后我们拥有一切内在的世界:

class World {
    var npcs: Array ...
    var bullets: Array ...
    var hittables: Array ...

    function update(delta) {
        foreach(var c:NPC in npcs)
            c.update(delta);

        foreach(var b:Bullet in bullets) {
            b.update(delta);
            b.checkCollisions(world);
        }
    }
}

你的主循环很简单:

var lastTime:int;

function onEnterFrame(...) {
    var now:int = getTimer(); // FlashPlayer utility function to get the time since start (in ms)

    world.update(now - lastTime);
    lastTime = now;
}

其他几点说明:

  • 尝试根据delta时间进行所有计算,否则游戏的速度会因帧率而异。

  • 当一个角色死亡时会发生什么?子弹消失了?好吧,你可以通过以下几种方式做到:

    • 点击一个事件,例如EnemyDied并将其从世界中删除
    • 实现具有(CanDie属性)的接口get dead():Boolean,并在每次更新时使用它来清理世界。
    • 但是不要编写代码来删除Enemy类中的敌人,因为那样你将使用应该由World处理的代码来污染类,这将很难保持以后。

很抱歉答案很长,但我无法自拔:)

答案 1 :(得分:0)

是否堵塞了Main类的问题,或者发现什么子弹击中了什么敌人的问题?如果它是子弹,你需要描述子弹行为 - 它可以击中多个敌人,它移动的速度有多快(当使用“enterFrame”测试时,子弹将首先出现在敌人面前,并且,第二帧,它会出现在敌人身后?)。可以将敌人简化为一些基本的几何形状,如圆形或矩形,还是你需要像素完美的精度?最后,你计划在任何时候有多少子弹和多少敌人?如果你要拥有数百个显示对象,那么每个子弹有一个显示对象可能太昂贵了,然后将它们绘制成单个形状/位图数据会更有意义。

如果问题是Main类太长,这里有几种可能性。

  1. nobrainer回答这个问题 - 使用继承来简单地将部分代码放在单独的文件中。不是最好的方式,但很多人都这样做。
  2. 如果你做了第一个,那么你就会意识到你在超类和子类中放入了某些函数组 - 这将帮助你将“阻塞”类拆分成几个具有更特殊特殊性的较小独立部分。 / LI>
  3. 在你完成第二个之后,你可能会发现在将大类拆分成较小的类之间存在某种依赖性,所以你可以尝试按某种模式生成那些较小的类。
  4. 然后你编写了阻塞的代码,这些代码概括了你刚刚分裂的那些部分。
  5. 上面基本上是从更具体的代码到更通用的代码的循环。在完善最后一步的过程中,您将再次编写一些具体的代码。这将使你进入第1步。泡沫,冲洗,重复:)事实上,你不想写OO代码,或程序代码或当天时尚告诉你要做的任何事情。你想写出好的代码:)你可以通过从更通用到更具体的再到更通用的方式来实现它,直到它完美无缺:P

    可能不是最好的答案,但你必须承认,你没有提供太多信息来给你更准确的答案。