Articles of 碰撞检测

防止小型快速物体的隧道效应

我正在和朋友做一个基本的射击游戏,我遇到了一个问题。 我有点知道解决scheme,但我不能实施它。 这是我用XNA / MonoGame制作的第一款游戏,我也不太喜欢c#。 所以我的问题是子弹和敌人之间的碰撞检测。 有时候子弹穿过敌人,有时候会打到。 问题似乎在我的碰撞检测代码,因为它只检测我的数组列表中的一个项目。 这个( 扫描testing )可能是某人建议的解决scheme,但对我来说看起来太复杂了。 这可能是如此简单的修复,但就像我说我只是不知道如何做到这一点。 我会发布我的代码,并希望有人可以帮助。 谢谢! 这是我的主要类别,它应该消除死亡的敌人: foreach (enemy enem in enemies) { enem.Update(graphics.GraphicsDevice); } LoadEnemies(); foreach (bullet bull in bullets) { bull.Update(); } //WSAD movement if (Keyboard.GetState().IsKeyDown(Keys.D)) { charRect.X += 6; } if (Keyboard.GetState().IsKeyDown(Keys.A)) { charRect.X -= 6; } if (Keyboard.GetState().IsKeyDown(Keys.W)) { charRect.Y -= 6; } […]

如何使用Slick2D使用tile属性检测和处理冲突?

我试图在Slick2D基础上设置一个基于地图的碰撞检测。 我目前在地图上有两个图层,一个背景图层和一个碰撞图层。 碰撞层有一个“阻塞”属性的瓦片,画在玩家不能走的区域上。 我已经浏览了Slick文档,但不明白如何读取tile属性并将其用作碰撞检测的标志。 我的“移动”播放器的方法有些不同,可能会影响碰撞的处理方式。 玩家总是停留在同一个地点,而不是更新玩家在窗口上的位置,更新地图渲染的x和y。 我正在通过限制播放器的移动来处理与对象的碰撞,当它的hitbox与对象的hitbox相交时。 例如,玩家击中对象右侧的代码如下所示: if(Player.bounds.intersects(object.bounds)&&(Player.x<=(object.x+object.width+0.5))&&Player.isMovingLeft){ isInCollision=true; level.moveMapRight(); } else if(Player.bounds.intersects(object.bounds)&&(Player.x<=(object.x+object.width+0.5))&&Player.isMovingRight){ isInCollision=true; level.moveMapRight(); } else if(Player.bounds.intersects(object.bounds)&&(Player.x<=(object.x+object.width+0.5))&&Player.isMovingUp){ isInCollision=true; level.moveMapRight(); } else if(Player.bounds.intersects(object.bounds)&&(Player.x<=(object.x+object.width+0.5))&&Player.isMovingDown){ isInCollision=true; level.moveMapRight(); } 并在关卡的更新代码中: if(!Player.isInCollision) Player.manageMovementInput(map, i); 但是,这种方法仍然有一些错误。 例如,当从右侧击中对象时,玩家将向上和向左移动,通过对象剪切并卡在其hitbox内。 如果有更有效的方式来处理这个,任何意见将不胜感激。

如何通过在岩石地形山上行走的精灵来实现碰撞检测?

我正在使用SDL,并且为精灵animation的每个帧设置了碰撞矩形。 然而,最近我偶然碰到了在不规则弯曲或岩石地形的山坡上坡上的人物碰撞问题 – 在这种情况下碰撞的好方法是什么? 每像素? 加载倾斜点并进行玩家线碰撞检查? 我应该一般使用边界矩形还是使用圆形碰撞检测?

为跳跃机械添加宽容

我在平台游戏中为我的玩家写了一些跳码。 目前它有一些基本的逻辑,说如果他在地面上,玩家可以跳。 伪代码看起来像这样: ### Input Handling ### if(jumpButtonPressed){ if(onGround){ jump } } ### Player Update Loop ### onGround = false movePlayer resolveCollisions if(player collided with ground){ onGround = true } 这对于基本的静态瓷砖等级来说工作得很好,但是当玩家站在下降的平台上,或者在向下的斜坡上移动时,变得很难跳跃。 这样做的原因(在下降平台的情况下)就是平台已经从那个框架的下面移动了,所以那个时候他实际上并没有碰到地面,所以跳跃的条件不是实现。 有没有一种通用的方法来增加一些宽大的跳跃机制,这样玩家就可以跳起来,即使他们没有技术上的那种精确的框架? 这似乎应该是一个相当普遍的问题,但我似乎无法find任何类似的问题stackexchange或谷歌。

碰撞检测代码结构与倾斜的瓷砖

我正在制作一个基于2D瓦片的游戏,我需要帮助进行碰撞检测。 这个问题不是关于在斜坡上给定水平位置的玩家的垂直位置,而是代码的结构。 这里是我的碰撞检测的伪代码: void Player::handleTileCollisions() { int left = //find tile that's left of player int right = //find tile that's right of player int top = //find tile that's above player int bottom = //find tile that's below player for(int x = left; x <= right; x++) { for(int y = top; y <= […]

检测到碰撞时创建滞后

我对gamedev相当陌生,遇到了碰撞检测系统的问题。 碰撞基本上是这样的: for (int x = 0; x < playerprojectiles.Count; x++) { for (int i = 0; i < enemyships.Count; i++) { Vector2 projectilepos = new Vector2(playerprojectiles[x].position.X, playerprojectiles[x].position.Y); Vector2 enemypos = new Vector2(enemyships[i].position.X, enemyships[i].position.Y); Console.WriteLine("I=" + i + " , " + "x=" + x); if (Vector2.Distance(enemypos, projectilepos) < 20) { playerprojectiles.RemoveAt(x); x–; break; } […]

实现平滑的2D平滑的墙面滑动的碰撞检测和处理

我使用SFML 2.1作为graphics和我的游戏结构遵循SFML书相当紧密(SceneGraph实施等)我的世界主要由字符(约1-400,左右移动)和瓷砖(3600,固定),我会检查每次碰撞一些动作 在最坏的情况下,大概有400个字符左右移动,约3600个贴图,每个帧有4000个可能的碰撞实体和800个碰撞检查调用(独立的X和Y移动) – > 3.2M碰撞检查。 几乎我所有的实体都有16×16像素的大小,我一直在考虑实现四叉树或者更简单的网格来进行碰撞检测,这会使得碰撞检查的次数有所下降。 我的意思是http://conkerjo.wordpress.com/2009/06/13/spatial-hashing-implementation-for-fast-2d-collisions/ 但是我不知道如何实现简单的网格。 所有的帮助是欢迎的。 还有很多更好的方法来强化这一点。 实体更新步骤。 我分别做X / Y轴移动。 因为我想在对角碰撞时滑过实体。 水平移动实体 检查并处理碰撞 垂直移动实体 检查并处理碰撞 对所有实体重复1-4 。 void Entity::updateCurrent(sf::Time dt, CommandQueue& commands) { setPreviousPosition(getPosition()); move(sf::Vector2f(mVelocity.x, 0) * dt.asSeconds()); handleCollision(); setPreviousPosition(getPosition()); move(sf::Vector2f(0, mVelocity.y) * dt.asSeconds()); handleCollision(); } 在我尝试同时处理X和Y两个动作之前,我遇到了以下问题: 碰撞后我不知道是否应该重置X或Y的位置。 碰撞处理。 我只会在实体移动时处理碰撞(目前只有角色实体,后来的弹丸和一些特殊的瓷砖) 如果实体是瓦 – >什么也不做 如果实体是人物 – >检查与人物和瓷砖的碰撞,并在发生碰撞时重置移动 。 void Entity::handleCollision() { […]

形状碰撞检查

我想检查一个形状,不管有没有一个点。 该形状用一个浮点vector数组描述。 vector按时钟方向添加。 第一个我可以很容易的检查,第二个也可以,但是第三个更难。 我如何计算这个? 如何在math命名这个类别,以便我可以谷歌?

如何防止精灵以一定的角度移动,导致碰撞

我有两个可以以任何角度移动的小精灵。 精灵是矩形的。 我为这两个精灵创建了边界框。 每当精灵旋转时,这些框就会旋转。 他们总是围绕精灵,只有精灵。 (完全适合)。 我已经成功地实现了两个边界框的碰撞检测。 我通过检查box1是否包含box2的任何顶点以及相反的方法来做到这一点。 (我知道这种方式并不完美,因为两个矩形可以相互交叉,而不需要彼此的顶点,但是为了我的需要,这已经足够了)。 所以现在我知道两个精灵的相撞时间。 但是当两个精灵发生碰撞时,我遇到了一个问题。 当这些精灵碰撞时,我想阻止它们相互重叠(超过几个像素)。 换句话说,在碰撞时,我想让精灵只能朝着不会深入其他精灵的方向移动。 正如我所说,每个精灵都可以任意角度自由移动(游戏是为两个玩家,每个控制一个精灵)。 编辑:以不同的方式说话 – 两个精灵碰撞后,我需要找出精灵可以移动的角度范围,这将允许它移出碰撞 – 这是我可以防止用户移动在任何其他角度,在碰撞后的精灵。 我怎样才能做到这一点? 感谢您的帮助

OBB碰撞分辨率:长矩形抖动

我一直在研究一个物理模拟模块。 几乎一切正常,但我有一个问题,我已经在下面的video中演示。 正如你在video中看到的,如果一个物体没有角速度,那么一切正常。 但是,一旦角速度(即使只是一点点)被施加到物体上并且与地面碰撞,它就开始震动。 我检查碰撞,并使用SAT (分离轴定理)得到正常和MTD(最小平移距离)。 为了得到接触点,我检查两个多边形之间的交点。 如果有多个交点,我就可以find两个交点之间的点。 然后我使用normal,MTD和mass factor来解决重叠的对象。 为了解决这个碰撞,我使用了脉冲理论 。 你有什么想法可能会导致这种摇晃的影响? 这是否可能是由于接触点select错误造成的?