【问题标题】:How to handle collisions detection with multiple instances of one movieclip?如何处理一个影片剪辑的多个实例的碰撞检测?
【发布时间】:2010-04-27 18:47:44
【问题描述】:

我正在使用 Adob​​e Flash CS4。 语言是动作脚本 3

在我的图书馆里,我有 2 件物品:

  • 播放器

玩家对象已经在移动他时正常运行。 现在,当我将多个墙壁对象放入舞台(墙壁 = 32x32 像素)时,我想防止玩家在走进墙壁时移动。

我尝试为所有墙壁赋予相同的实例名称,并仅检查与该对象的碰撞,但当我这样做时,碰撞仅适用于其中一堵墙壁。

我可以为墙的所有实例提供不同的碰撞脚本,但这很耗时,是否有另一种方法可以将墙全局定义为对玩家来说是实体的?

提前致谢!

【问题讨论】:

  • 你的游戏是基于磁贴的吗?

标签: flash actionscript-3 collision-detection


【解决方案1】:

最好的办法是将所有墙壁实例放在一个父影片剪辑中,并检查播放器实例是否与它发生冲突。

或者您可以遍历所有墙实例并单独检查。对您来说可能听起来很浪费,但这样您就可以为您的碰撞检测例程添加一些优化。例如,如果玩家在屏幕的右侧,为什么要检查与左墙的碰撞。

或者您可以使用数学来检查冲突并避免使用 Flash 的内置例程。听起来可能需要更多的工作,但看到它有多么有缺陷(受帧速率等限制),我会这样做——当然,如果游戏动态允许的话。

【讨论】:

  • 您的第一个解决方案不起作用,对 Sprite 的命中测试不是按像素而是边界框,因此您最终会在最大边界包含所有子影片剪辑的框上进行命中测试。因此,它几乎总是会返回 true。但是,您可以将动画剪辑光栅化为位图,然后检查像素相对于播放器坐标的 alpha 值。
【解决方案2】:

请记住,任何影片剪辑都是影片剪辑类的实例。通过为所有实例赋予相同的名称,您可以有效地做到这一点:

var myClip:MovieClip = new MovieClip();
myClip = new MovieClip();

myClip <-- will always refer to the later movieclip since thats what it is now referenced to.

要解决您的问题,您很可能会创建一个包含集合(很可能是数组)的类。您将对每个 MovieClip 的引用添加到此数组中(只需将 MovieClip 推入即可)。然后,您将拥有一个函数,该函数在每一帧或每次角色移动时都被调用,该函数循环通过该数组检查墙壁是否撞到玩家,如果它确实返回 true,则表示这已经发生,如果没有,则返回 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多