簡體   English   中英

2D游戲:如果FPS低於20,則碰撞檢測失敗

[英]2D Game: Collision Detection fails if FPS below 20

因此,我只是更改了游戲更新功能,以根據實際FPS與固定游戲FPS之間的差異來更新Alle動作。

例如,我將游戲設置為固定的60 FPS。 如果實際的FPS為20我將按照以下方式計算差異:

((20 * 100) / 60) / 100將得出0.333因此1游戲循環的差為1 - 0.333 = 0.677

因此,不會根據正常游戲循環來更新所有游戲動作:

x += speedX * 1但寬度增加了一個值: x += speedX * 1.677

因此,現在我的游戲在每個系統上以相同的速度運行,只需要較少的圖片,但這不是問題。

我不確定這是否會導致碰撞檢測失敗,但是我猜想隨着游戲速度的提高以匹配當前的fps,碰撞檢測將無法再跟蹤所有事件,因為位置會被跳過。 它只會檢查玩家周圍是否有碰撞。

我該如何解決這個問題?

編輯:

這是沖突檢測的示例:

var xi = this._game.level.getField(this.x);
var yi = this._game.level.getField(this.y);

var left = this._game.level.levelData["col"][(xi-1) + "," + yi] ? (xi-1) * 32 : null;
var right = this._game.level.levelData["col"][(xi+1) + "," + yi] ? (xi+1) * 32 : null;
var top = this._game.level.levelData["col"][xi + "," + (yi-1)] ? (yi-1) * 32 : null;
var bottom = this._game.level.levelData["col"][xi + "," + (yi+1)] ? (yi+1) * 32 : null;

// Will hit ground ?
if (this.y + this.height >= bottom && bottom != null) {
    this.ground = true;
    if (!this.jumping) this.y = bottom - this.height;
}

// Left
if (this.x <= left + 32 && left != null) {
    this.x = left + 32;
}

// Right
if (this.x + this.width >= right && right != null) {
    this.x = right - this.width;
}

this是球員。 left/right是網格上的碰撞圖塊位置。 每個圖塊為32x32,播放器為25x25。

這是完整的游戲:[已刪除]

編輯:問題實際上是在其他地方,因為bottom不為null。 當我將播放器放在bottom - (this.height + 1)而不是bottom - this.height (高1像素)時,他不會一直掉下去。

我現在正在手機上,所以我無法檢查您的樣品。 因此,如果我正確地閱讀了您的碰撞檢測材料,則可以更新玩家位置,然后檢查碰撞。 如果幀頻足夠低或物體移動得足夠快,則意味着物體可以“穿過障礙物”。 在幀更新之前完全位於其一側,而在幀更新之后完全位於其另一側。

有兩種方法可以解決此問題,最直接的方法是不僅測試對象現在所在的位置,還測試對象在移動時的位置。 實現碰撞檢測算法,該算法檢測玩家或對象從a到b所必須經過的所有區域,並基於此進行碰撞。

還要簽出gamedev.stackexchange.com。 通常,這是一個問游戲特定問題的好地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM