C 检查2D矢量是否遇到了障碍
C++ check if 2d vector hit an obstacle
我正在为在线游戏构建服务器端(!!),我需要检查子弹是否击中目标。
客户端向我发送了射击的位置和角度,我知道所有敌人的坐标和大小。我如何计算子弹发射后是否击中敌人?敌人的尺寸不同,子弹为1px大小。
例如,我的播放器射击角度为45度,0坐标为45度,而敌人的敌人为200、200坐标,宽度为10宽,高15。我该如何计算子弹击中敌人?
更新:游戏是从顶部(例如Crimsonland)的2D Dhooter。弹丸的启动速度降低了。
您应该瞥一眼一个点的力量。它将使您知道线和点之间的最小距离。因此,如果距离低于目标宽度,则是命中!
最简单的方法是检查子弹是否在敌人的矩形内。如果是的话,请处置子弹和敌人。
基本上:
while(game.is_on()){
for(enemy = enemyCollection.begin(); enemy != enemyCollection.end(); ++enemy){
if(enemy.contains(bullet)){
enemy.dead();
bullet.hit();
}
}
如果您需要检查线路相交矩形是否相交,则基于跨产品应用方向测试 - 如果所有矩形顶点的跨产品符号相同,则不会相交。
线L0-L1,点P
Orientation = Cross(P - L0, L1 - L0)
(您可以使用COS(FI)和SIN(FI)而不是L1-L0组件)
如果您需要获得交叉点,请使用一些算法进行剪裁 - 例如,Liang -Barsky One。
它看起来并不那么容易。为了获得完整的解决方案,您需要沿着旅行路径挤出物体。然后,您会反对反对交叉测试。
这很困难,因为通过任意路径对任意形状的挤出很难。因此,作弊更容易。子弹没有区域,所以它们只是线段。确保步长足够低,以使线段相对较短。然后以相对较短的线条再次制作船只矩形。现在,这是线索交叉测试的短线。您可以使用Planes -Weep算法快速执行这些操作。关于飞机扫球的好处是,您还可以通过返回可能的交叉点而不是实际的交叉点来将其扩展到曲线或形状。
一旦您在子弹和船舶的碰撞矩形之间有一个相交后,您可能需要运行时间步长以检查命中实际上是发生的,而不是狭窄的错过。您还可以确定命中是在此时的前面,左,右还是背面。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 编译包含字符串的代码时遇到问题
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- 在检查传递函数标识符时是否获得模板参数时遇到问题
- 是否可以创建一个字符串数组,如果是的话,为什么我会遇到此错误:错误:预期表达式
- C 检查2D矢量是否遇到了障碍
- 在文件中遇到指定单词后,是否有读取数据的方法
- 在使用 imread 函数读取 jpg 文件时,是否有任何可能的理由在 opencv 中遇到一些困难
- 在模板参数中是否禁止 SFINAE,还是我遇到了叮当错误
- 如果我不关心返回值,我是否会遇到性能问题
- 当一个线程遇到异常时,是否可以冻结所有线程
- 我在确定数字是否为质数的代码时遇到问题
- 我遇到了复制构造函数错误,但不知道我对此错误的想法是否正确
- shared_ptrs是否会遇到由于引用计数器原子递增/递减而导致的缓存丢失?
- 如何发现路径是否遇到某个父路径