在 DirectX 中让子弹与敌人相撞
Making a bullet collide with an enemy in DirectX
我正在尝试为学校做一个项目,但我真的很难让我的子弹完美地击中敌人的物体。到目前为止,它们偶尔会在敌人身上的随机位置发生碰撞,但这只在某些时候有效,这令人沮丧!
这是我目前拥有的:
for (int i = 0; i < 200; i++){ // 200 is number of bullets I use
for (int k = 0; k < game.enemiesVec.size(); k++){
if ((((bullets[i].pos.x + 0.15f) >(game.enemiesVec[k].x))) && ((bullets[k].pos.x - 0.15f) < (game.enemiesVec[k].x)) &&
(((bullets[i].pos.y) < (game.enemiesVec[k].y -0.15f)) && ((bullets[k].pos.y) > (game.enemiesVec[k].y +0.15f)))){
//do stuff
game.enemiesVec[k].x = 5;
}
}
}
老实说,我一无所知,我知道我需要以某种方式获取物体的半径,以便它有更大的碰撞区域,但我不知道!
希望有人能帮忙!
增加敌人的大小可能会在某些情况下解决问题,但不能完全避免问题。您的子弹可能每帧移动到其位置 "jumps"。现在您正在测试每一帧它们在敌人面前的当前位置,但这种方法忽略了帧之间的移动。因此,如果您将半径增加到大于子弹在一帧中可以移动的最大距离的大小,则可以避免这种情况,但这会导致敌人变胖并且仍然存在边缘情况,例如子弹只会击中边界矩形的一个小角。一个真正的解决方案是针对边界矩形而不是单个点来测试一条线。这条线将包括运动的开始和结束。如果这条线与矩形相撞,则子弹击中了其路径上的敌人。我画了一张小图来说明情况:
通过 line-rectangle 交点测试,您还可以去除敌人 body 中的随机交点,因为您可以计算入口点。
我正在尝试为学校做一个项目,但我真的很难让我的子弹完美地击中敌人的物体。到目前为止,它们偶尔会在敌人身上的随机位置发生碰撞,但这只在某些时候有效,这令人沮丧!
这是我目前拥有的:
for (int i = 0; i < 200; i++){ // 200 is number of bullets I use
for (int k = 0; k < game.enemiesVec.size(); k++){
if ((((bullets[i].pos.x + 0.15f) >(game.enemiesVec[k].x))) && ((bullets[k].pos.x - 0.15f) < (game.enemiesVec[k].x)) &&
(((bullets[i].pos.y) < (game.enemiesVec[k].y -0.15f)) && ((bullets[k].pos.y) > (game.enemiesVec[k].y +0.15f)))){
//do stuff
game.enemiesVec[k].x = 5;
}
}
}
老实说,我一无所知,我知道我需要以某种方式获取物体的半径,以便它有更大的碰撞区域,但我不知道!
希望有人能帮忙!
增加敌人的大小可能会在某些情况下解决问题,但不能完全避免问题。您的子弹可能每帧移动到其位置 "jumps"。现在您正在测试每一帧它们在敌人面前的当前位置,但这种方法忽略了帧之间的移动。因此,如果您将半径增加到大于子弹在一帧中可以移动的最大距离的大小,则可以避免这种情况,但这会导致敌人变胖并且仍然存在边缘情况,例如子弹只会击中边界矩形的一个小角。一个真正的解决方案是针对边界矩形而不是单个点来测试一条线。这条线将包括运动的开始和结束。如果这条线与矩形相撞,则子弹击中了其路径上的敌人。我画了一张小图来说明情况:
通过 line-rectangle 交点测试,您还可以去除敌人 body 中的随机交点,因为您可以计算入口点。