Так что я просто изменил свою функцию обновления игры, чтобы обновлять все движения в зависимости от разницы между фактическим FPS и фиксированной игрой FPS.2D-игра: обнаружение столкновения сбой, если FPS ниже 20
Например, я установил игру в фиксированный 60
FPS. Если фактический FPS является 20
рассчитать разницу так:
((20 * 100)/60)/100
, который привел бы к 0.333
Таким образом, разница в 1
игры цикла будет 1 - 0.333 = 0.677
Таким образом, все движения игра не будет обновляться на основе нормальный игровой цикл:
x += speedX * 1
но ширина повышенного значения: x += speedX * 1.677
Так что теперь моя игра работает на с той же скоростью в каждой системе, с меньшим количеством изображений, но это не проблема.
Я не совсем уверен, что это приведет к сбою обнаружения collisoin, но я думаю, что, поскольку скорость игры увеличивается, чтобы соответствовать текущему fps, обнаружение столкновения больше не может отслеживать все события, потому что позиции пропускаются , Он будет проверять только на столкновение вокруг игрока.
Как мне решить эту проблему?
Edit:
Вот пример обнаружения столкновения:
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.
Вот полная игра: [удален]
Edit: Проблема на самом деле где-то еще, так как дно не равно нулю. Когда я положил игрока на bottom - (this.height + 1)
вместо bottom - this.height
(на 1 пиксель выше), он не всегда проваливается.
Вы делаете это неправильно. изменить LOD объектов, которые сталкиваются и не возиться со временем. – fazo
@fazo О чем ты говоришь? Почти все игровые циклы настраиваются на время. Это основа независимой от частоты кадров анимации –
LOD = Уровень детализации? Это просто 2D-игра HTML5: http://elias-schuett.de/canvas/iwbtg/ –