【问题标题】:Javascript Game Level CollisionJavascript 游戏关卡碰撞
【发布时间】:2012-04-30 04:43:30
【问题描述】:

我目前正在编写我的第一个游戏,并且正在使用 Javascript+HTML5 Canvas 进行。该游戏是一款带有 WASD 动作的自上而下的点击动作射击游戏。无论如何,昨天我完成了使用圆和四叉树实现碰撞检测以最小化比较。我把所有的子弹、玩家和敌人都扔进了四叉树。现在,一切正常,但我不确定如何处理下一步,即处理实际级别的碰撞。子弹应该被墙壁挡住,演员(玩家和敌人)应该被栅栏和墙壁挡住等等。

我是否应该定义形状来表示我关卡的墙壁,并将它们作为一种对象形式包含在四叉树中,然后使用 SAT 来评估每个元素与它可能发生碰撞的任何事物,或者是否有其他方法,例如创建一个隐藏的图像层,它勾勒出路径,然后测试每个对象的坐标以确保它不会落在黑色像素上(这表明它正在与不动的地形相撞)?

谢谢。

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    来自一个类似的问题:

    我建议阅读这篇关于幽灵运动和 碰撞检测适用于PacMan。

    那么我建议在逻辑上将你的炸弹人关卡建模为 瓷砖的集合。每个图块代表你的一个离散位置 水平,从逻辑上讲不可能永远处于“之间”瓷砖或 同时占据两块瓷砖。每个图块都可以跟踪 地形特征当前在它上面,以及它是否有效 玩家(以及敌人,可能与 如果允许敌人穿越,每个规则都有不同的规则 玩家通常无法通过的地形)。

    那么您不需要为每个对象都使用碰撞检测算法 在世界上。当敌人需要移动时,或者当 用户试图移动他们的角色,你所要做的就是检查所有 与其当前图块相邻的图块(如果您使用,则最多为 4 个或 8 个) 允许对角线移动),查看每个图块是否代表有效的移动 方向,如果方向不正确,则阻止移动。

    回答你的问题,是的,迭代世界上的每一个对象 每次位置更新都会非常低效。

    【讨论】:

    • 我不认为这对我有用,因为我希望演员能够 360 度全方位移动,与子弹和他们射击的角度一样。因此,我真的不能做任何基于图块的系统,因为你会经常需要在图块之间。
    • 你只想让你的瓷砖更小:) 大多数 SNES 游戏都是基于瓷砖的,所以你绝对可以用它做很多事情,请参阅youtube.com/watch?v=GcKJ6tYvvq0。此外,仅仅因为世界是基于图块的,并不意味着角色总是必须完全出现在一个图块上。
    • 所以基本上瓷砖是我保持玩家位置的一种方式,当玩家尝试移动到新瓷砖时,我会检查该标题是否是可移动的瓷砖。如果不是,我执行计算以允许玩家直接移动到该图块的边缘,但不是一直移动。我将图块表示为多数组,对吗?
    • 然后我可以将图块表示为 10 像素的部分。一个 35 像素的圆一次将占用至少 4 x 4 个图块,如果圆移动到用 1 表示的图块中,我继续让它移动,直到命中 30 的 x,这将是那个的边缘瓷砖。
    • 是的,这就是基本思想。您只想使您的图块大小与您需要放置在其上的最小元素的大小相同。较大的元素只会占用更多的图块。
    猜你喜欢
    • 2018-05-26
    • 2017-12-28
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多