[英]Issues with collision detection is JavaScript
基本上,我想做的是在不使用圖塊的情況下創建一個小的平台游戲,因此我必須手動做很多事情。 我做得很好,減去了過去導致我遇到問題的碰撞檢測。 當前的問題是某些平台對象(您將看到)拒絕正常工作,而其他平台對象則沒有問題。
我之前大部分工作都是在此工作,而只是在我增加了摩擦力和重力之后,它才開始占用大量時間。
handle_all_collisions: function(player) {
if (player.position.x < 0) {
player.position.x = 0;
} else if (player.position.x + player.bounds.x > canvas.width) {
player.position.x = canvas.width - player.bounds.x;
}
if (player.position.y < 0) {
player.position.y = 0;
} else if (player.position.y + player.bounds.y > canvas.height) {
global.world.ground = true;
player.position.y = canvas.height - player.bounds.y;
} else {
for (var i = 0; i < positions.length; i++) {
if (collisions.is_colliding(player, obstacles[i])) {
global.world.ground = true;
} else {
global.world.ground = false;
}
}
}
for (var i = 0; i < positions.length; i++) {
if (collisions.is_colliding(player, obstacles[i])) {
collisions.resolve_collision(player, obstacles[i]);
} else {
player.collided.up = false;
player.collided.down = false;
player.collided.left = false;
player.collided.right = false;
}
}
}
這樣可以處理所有沖突,以便以后可以使用某些信息。 您會注意到我那里有一個global.world.ground = true/false
,用於更改玩家的y位置。 如果在某些時候未將其設置為true以允許跳躍,這將不是問題。 我一直在我的repl.it上這樣做,它將更好地展示它。 另一個問題是,當您離開左側平台(麻煩制造者)時,您最終消失在地板上,我認為這是由錯誤的檢測引起的。
我的最終目標是將碰撞檢測固定在接近完美的水平,因為它無需預測接下來幾幀中的位置就可以得到。 我真的不想更改我的對象創建技術,因為我希望使它盡可能短。 感謝您抽出寶貴的時間閱讀此內容。
您最大的問題是這種情況:
for (var i = 0; i < positions.length; i++) {
if (collisions.is_colliding(player, obstacles[i])) {
global.world.ground = true;
} else {
global.world.ground = false;
}
}
這基本上只是測試玩家是否正在與最后一個障礙物發生碰撞,因為global.world.ground
在每次迭代中都會被覆蓋。 您應該移動global.world.ground = false;
功能頂部,因為您想測試玩家是否正在與任何障礙物發生碰撞。
您的平台的行為有所不同,因為游戲僅將正確的平台(您最后添加的平台)識別為可站立的平台。 如果您跳到左側平台上,則稍后會在handle_all_collisions
函數中使用resolve_collision
函數將其handle_all_collisions
。
您錯過的第二件事是當玩家與某物體碰撞時重置其速度。 在功能resolve_collision
,只要在x軸上發生碰撞,就應該將player.velocity.x = 0
設置player.velocity.x = 0
如果在y軸上發生碰撞, player.velocity.y = 0
。 因此,當您站在左側平台上時,確實會被向上推出,但速度並沒有復位,因此在后台,玩家會累積所有重力加速度,並在一段時間后因為碰撞檢測而掉落通過平台無法應付這些速度。
當您站在地面障礙物(不是最后的障礙物)上時,幾乎是同一回事。 它也沒有被認為是地面,但是由於玩家速度的提高,他們很快就被注冊為站在畫布的真實底部。 這就是為什么您降落在地面障礙物上后不能跳一兩秒的原因。
我在您的副本的此副本中修復了這些問題: https : //repl.it/repls/AfraidNaiveQuote
仍然還有一些問題,但是我已經沒時間了,我想您也許可以自己解決這些問題。 例如,當玩家與左邊的某個東西碰撞時,它被解釋為處於地面。 因此它們可能會卡在牆上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.