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

Actionscript 3 ActionScript 3中的游戏逻辑和游戏循环,actionscript-3,Actionscript 3,我正在用flash actionscript 3制作一个射击游戏,对逻辑流程和如何巧妙地使用OOPs概念有一些疑问 主要有三类: 主类:初始化屏幕上的对象。 敌人职业:在屏幕上移动敌人。 子弹等级:射击用。 我想做的是找出敌人是否被子弹击中,然后做一些必须做的事情 我现在正在做的是,我有一个ENTER_FRAME事件,在该事件中,我检查保存在创建了bullet实例的数组中的每个敌方单位的碰撞检测,如果它发生碰撞,则在主类中执行所有必要的操作。。正在进程中阻塞主类 这是正确的技术吗?还是有更好的解

我正在用flash actionscript 3制作一个射击游戏,对逻辑流程和如何巧妙地使用OOPs概念有一些疑问

主要有三类:

主类:初始化屏幕上的对象。 敌人职业:在屏幕上移动敌人。 子弹等级:射击用。 我想做的是找出敌人是否被子弹击中,然后做一些必须做的事情

我现在正在做的是,我有一个ENTER_FRAME事件,在该事件中,我检查保存在创建了bullet实例的数组中的每个敌方单位的碰撞检测,如果它发生碰撞,则在主类中执行所有必要的操作。。正在进程中阻塞主类


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

试着多想想,面向对象,每个对象负责什么

我们有可以打击的敌人:

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;
}
其他一些注意事项:

尝试根据时间增量进行所有计算,否则游戏的速度将随帧而异

当角色死亡时会发生什么?子弹消失了?好吧,你可以用几种方法:

激发一个事件,比如Enemydired,并将其从世界上移除 实现一个具有get dead:Boolean属性的接口CanDie,并使用它在每次更新时清理世界。 但是不要编写代码来移除敌人类中的敌人,因为这样你会用世界应该处理的代码来污染这个类,而且以后很难维护。
很抱歉回答得太长,但我还是忍不住说:

试着多想想,面向对象,每个对象都有什么责任

我们有可以打击的敌人:

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;
}
其他一些注意事项:

尝试根据时间增量进行所有计算,否则游戏的速度将随帧而异

当角色死亡时会发生什么?子弹消失了?好吧,你可以用几种方法:

激发一个事件,比如Enemydired,并将其从世界上移除 实现一个具有get dead:Boolean属性的接口CanDie,并使用它在每次更新时清理世界。 但是不要编写代码来移除敌人类中的敌人,因为这样你会用世界应该处理的代码来污染这个类,而且以后很难维护。
很抱歉回答得太长,但我还是忍不住问自己:

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

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

这个问题的一个简单答案是使用继承将部分代码放在单独的文件中。这不是最好的方法,但很多人都这样做。 如果你做了第一个,那么你会意识到有一些特定的函数组被放入了超类和子类中——这将帮助你把阻塞的类分割成几个更小的独立的部分,这些部分具有更特殊的专门化。 在完成第二步之后,您可能会发现如何将大型类拆分为小型类之间存在某种依赖关系,因此您可以尝试通过某种模式生成这些小型类。 然后编写阻塞的代码,将您刚刚尝试拆分的部分概括起来。 以上基本上是从更具体的代码到更通用的代码的循环。在完善最后一步的过程中,您将再次编写一些具体的代码。这将使您进入第1步。起泡、冲洗、重复:事实上,您不想编写OO代码、过程代码或任何当今流行的要求您去做的事情。您希望编写好的代码:您可以通过从更通用的代码迁移到更具体的代码,再返回到更通用的代码,直到代码变得完美:P

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

阻碍了t 他主课的问题,还是找出什么子弹击中什么敌人的问题?如果是子弹,您需要描述子弹的行为-它能击中多个敌人吗?它移动的速度有多快?使用enterFrame进行测试时,子弹可能首先出现在敌人前面,然后在第二帧出现在敌人后面?。可以简化为一些基本的几何形状,如圆形或矩形,或者您需要像素的完美精度?最后,你计划在任何时候拥有多少子弹和多少敌人?如果每个项目符号有数百个显示对象,那么每个项目符号都有一个显示对象的成本可能太高,然后将它们绘制成单个形状/位图数据可能更有意义

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

这个问题的一个简单答案是使用继承将部分代码放在单独的文件中。这不是最好的方法,但很多人都这样做。 如果你做了第一个,那么你会意识到有一些特定的函数组被放入了超类和子类中——这将帮助你把阻塞的类分割成几个更小的独立的部分,这些部分具有更特殊的专门化。 在完成第二步之后,您可能会发现如何将大型类拆分为小型类之间存在某种依赖关系,因此您可以尝试通过某种模式生成这些小型类。 然后编写阻塞的代码,将您刚刚尝试拆分的部分概括起来。 以上基本上是从更具体的代码到更通用的代码的循环。在完善最后一步的过程中,您将再次编写一些具体的代码。这将使您进入第1步。起泡、冲洗、重复:事实上,您不想编写OO代码、过程代码或任何当今流行的要求您去做的事情。您希望编写好的代码:您可以通过从更通用的代码迁移到更具体的代码,再返回到更通用的代码,直到代码变得完美:P


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

嘿,谢谢您的精彩回复D真的很有帮助你能再给我解释一些事情吗。。。什么是接口实现?第二,我有点困惑。。假设我的子弹实例创建时,世界上有9个敌人实例,当子弹移动时,又创建了一个敌人实例。。那么我的Bullet实例将如何检查它与所有敌人实例的碰撞呢?你应该只有一个敌人列表,每次你创建一个新的敌人时,将它添加到该位置,每次你检查并线时,在该列表中循环。在我的示例中,这将是World.npcs列表。npc=非玩家角色:p.An接口是通过一些通用功能处理不同类型对象的一种方式。想想你的电视和吸尘器,它们都可以实现一个叫做CanTurnOn的接口。试着多读一些,这是非常基本和重要的东西。嘿,谢谢你的精彩回复D真的很有帮助你能再给我解释一些事情吗。。。什么是接口实现?第二,我有点困惑。。假设我的子弹实例创建时,世界上有9个敌人实例,当子弹移动时,又创建了一个敌人实例。。那么我的Bullet实例将如何检查它与所有敌人实例的碰撞呢?你应该只有一个敌人列表,每次你创建一个新的敌人时,将它添加到该位置,每次你检查并线时,在该列表中循环。在我的示例中,这将是World.npcs列表。npc=非玩家角色:p.An接口是通过一些通用功能处理不同类型对象的一种方式。想想你的电视和吸尘器,它们都可以实现一个叫做CanTurnOn的接口。试着多读一些,这是非常基本和重要的东西。