現在、私は 2D プラットフォーマーを設計しており、コードが次のような衝突検出を実装しています。
if (keys['W']){ checkCollision(vector of bounded boxes, direction; }
if (keys['A']){ checkCollision(vector of bounded boxes, direction; }
等...
checkCollision(vector, direction){
for(each boundary box){
if (dir == 'UP'){
if (AABB collision check){hit = true;}
else{hit = false;}
walk(velocity, direction);
}
else if (dir == 'RIGHT'){
if (AABB collision check){hit = true;}
else{hit = false;}
walk(velocity, direction);
}
}
}
等...
walk(velocity, direction){
if (dir == 'UP'){
if (hit){ y -= 2; }
else{ y += velocity; }
}
else if (dir == 'RIGHT'){
if (hit){ x -= 2; }
else{ x -= velocity; }
}
等...
すべてうまく機能しているように見えますが、水平方向のオブジェクトと衝突する場合、右キーを押したまま上キーを押すと、関数はオブジェクトがまだ衝突していることを認識し、オブジェクトが中にある場合に適用されるのと同じ力を適用します-ゲームがジャンプして上に衝突したため、ゲーム内オブジェクトは上向きの力がなくても押し下げられます。
X と Y の衝突に個別のブール値を実装しようとしましたが、これは結果に影響しませんでした。
私が見つけた唯一の修正は、キーを処理するときに if の代わりに else if を使用することです。ただし、これは非常に直線的な動きになり、オブジェクトは斜めに動くことができません。
助言がありますか?