我正在做一個簡單的2D遊戲(鳥瞰圖)。我有射彈,它們是圓圈。圍繞遊戲關卡存在障礙,這些都是矩形(軸對齊)。我希望彈丸在碰撞時能夠從障礙物上彈開。我不知道如何在我的遊戲循環中實現這一點。猜測它會是這樣的:遊戲循環中的碰撞檢測?
void gameLoop() {
Projectile p = ..;
p.updateLocation(p.getVelocity(), p.getDirection());
Barrier intersected = p.intersects(barriers);
if (intersected != null) {
// We hit a barrier after moving on this time tick.
// Figure out where our reflected location off the
// barrier should be now.
Point ptNew = intersected.reflect(p.getLastPoint(), p.getVelocity(),
p.getDirection());
// Our new location after getting bounced off the barrier.
ptNew.setLocation(ptNew);
}
}
所以當我們移動彈丸,我們可以檢查,如果我們相交(或完全內)的障礙之一。如果是這樣,做一個計算,找出我們的反射位置應該離開我們的起點和速度/方向的障礙。
感謝
----------更新------------------------
小更具體一點 - 考慮到Erik的評論,我確實需要確保彈丸正常彈跳,如果它們的速度恰好如此之快,我們就不能讓它們通過障礙,它們會在單個遊戲循環迭代中順利完成。在這種情況下,我想我需要測試一個起點,速度,方向,對所有障礙(可能反覆),直到不再有可能的速度交點。例如:
void gameLoop() {
Projectile p = ...;
Barrier barrier = moveProjectile(p, barriers);
while (barrier != null && p.stillHasVelocityThisFrame()) {
barrier = moveProjectile(p, barriers);
}
// at this point, the projectile is done moving/bouncing around.
}
void moveProjectile(Projectile projectile,
List<Barrier> barriers)
{
for (Barrier barrier : barriers) {
// tbd
Barrier intersected = test2dVectorAgainstRectangle(
projectile.getPosition(),
projectile.get2dVector());
// the above would test the projectile's vector
// to see if it intersects any barrier, reflect
// off of it if necessary, modify the projectile's
// position, and reduce the available distance it
// can still travel for this frame.
if (intersected) {
return intersected;
}
}
// no intersections.
return null;
}
是的,這已經變得棘手。
感謝
其中的這部分,你需要幫助的?碰撞本身還是反射?或者兩者兼得? – MGZero
嗯,我不知道該怎麼做(代碼示例或鏈接會很棒),但是如果這是如何完成的話,更多的是尋找一般性的yes/no。 – user291701
這是一個非常開放的問題 – Erik