当前位置: 首页 > 知识库问答 >
问题:

计算碰撞,考虑速度

丁毅庵
2023-03-14

我正在做一个平板游戏。跳跃和移动都很有效,现在我想对碰撞进行编程。我有一种想法,这将如何工作:

我不确定这个问题应该在这里还是在游戏开发网站上。

>

每一帧,我首先得到输入。动量根据按下的键增加和/或增加(例如:if(Gdx.input.isKeyPressed(keys.A)){Momentum.x-=速度;}

然后将动量乘以0.15。这是为了让它慢下来。

在此之后,我将速度乘以0.8。

然后,我把动量加到速度上,以增加速度,因为这实际上是移动玩家的原因。

然后我把速度加到球员的位置上。

为了应用重力,我将重力向量(0,-10)添加到玩家的位置。

所以我需要找到一种方法来移动玩家,但不要让它与世界上任何地方重叠。世界是由许多矩形实例组成的。玩家的身体也是矩形的一个实例。使用Box2D重写碰撞会更容易吗?我尝试的是检查播放器在移动时是否与任何矩形重叠,如果重叠,则不移动<但这似乎并没有把所有的事情都考虑进去——有时它是可行的,但有时,它在触及世界之前就停止了

TL;DR:我想让我的玩家和一个存储为矩形网格的世界发生碰撞。我该怎么做,因为我的播放器也是一个矩形。使用Box2D会更容易吗?


共有1个答案

井斌斌
2023-03-14

然而,如果你只想让一个简单的游戏继续下去,这可能有点让人不知所措。你的游戏循环是在固定的时间间隔内发生的,还是取决于帧率?也许你可以通过简单地将冲突检测分成更多的步骤来解决一部分问题。你可以做10个小更新,而不是在一次更新中全速移动,每次只移动十分之一的距离。然后你在每一步后做冲突检查,这样你就不太可能过早停止或移动薄物体。

这当然会对性能造成更大的负担,但这是一种幼稚且易于实现的解决方案方法。

编辑:只需将位置更新包装在for循环中。我不知道你的代码是如何进行冲突检查和更新的,但总体结构是这样的

for (int i = 0; i < 10; i++) {
    newPosX += deltaX * 0.1; // 1/10th of the usual update
    newPosY += deltaY * 0.1; // 1/10th of the usual update
    if (checkCollision(newPosX, newPosY))
    {
        posX = newPosX;
        posY = newPosY;
    }
    else
    {
        break; // We hit something, no more mini-updates necessary.
    }
}
 类似资料:
  • 我确实知道AABBs,但我现在只使用大约10个粒子,AABB现在不是必需的。

  • 你是否看到过车祸?是否跟什么物体相撞过?就像车的相撞一样,刚体对象也可以互相碰撞,当它们互相接触的时候,就认为发生了碰撞。当碰撞发生时,会触发一系列事件,它可以被完全忽略。 碰撞筛选 碰撞筛选允许你启用或者阻止形状之间碰撞的发生,引擎支持使用类型,组位掩码来进行碰撞筛选。 Cocos2d-x 有 32 个支持的碰撞类型,对于每个形状都可以指定其所属的类型。还可以指定有哪些类型可以与这个形状进行碰撞

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。

  • 这是我的碰撞/移动代码 这是PixelPerfectTest函数(不是我的) 编辑:这就是我如何让它工作,以防将来有人需要帮助

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect