2012-01-22 3 views
2

Так что я просто изменил свою функцию обновления игры, чтобы обновлять все движения в зависимости от разницы между фактическим 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 пиксель выше), он не всегда проваливается.

+0

Вы делаете это неправильно. изменить LOD объектов, которые сталкиваются и не возиться со временем. – fazo

+1

@fazo О чем ты говоришь? Почти все игровые циклы настраиваются на время. Это основа независимой от частоты кадров анимации –

+0

LOD = Уровень детализации? Это просто 2D-игра HTML5: http://elias-schuett.de/canvas/iwbtg/ –

ответ

1

Im на моем телефоне прямо сейчас, поэтому я не могу проверить ваш образец. Поэтому, если я правильно читаю данные о обнаружении конфликтов, вы обновляете позицию игроков, а затем проверяете наличие столкновения. Это, если частота кадров достаточно низкая или объект движется достаточно быстро, означает, что объект может «пройти фазу» прямо через барьер. Быть полностью на одной стороне от него перед обновлением фрейма и полностью находиться на противоположной стороне от него после обновления фрейма.

Существует несколько способов решения этой проблемы, наиболее прямым является не только проверка, где объект теперь, но и там, где он был, пока он перемещался. Внедрите алгоритм обнаружения столкновений, который обнаруживает все зоны, которые игрок или объект должен пройти, чтобы получить от a до b и основывать свое столкновение на этом.

Также проверьте gamedev.stackexchange.com. Обычно это хорошее место, чтобы задавать игровые вопросы.

+0

Я действительно только перемещаю объект, если его текущая позиция не сталкивается ни с чем. Если он столкнется с следующей проверкой, позиция будет исправлена. Вероятно, вы правы, что объект проходит через барьер, когда игра обновляется быстрее. Ваши идеи были примерно на мой взгляд, просто хотели убедиться, что я выбираю лучший способ. Я попытаюсь реализовать алгоритм сейчас, спасибо! –

+1

Одним из способов решения проблемы является обеспечение минимального шага физического времени. Если вы хотите применить физическое моделирование на 60 Гц, а вы - на 20 кадров в секунду, то три раза вы будете наносить физическую нагрузку в один кадр на 1/3 из 20 кадров в секунду. Конечно, эта дополнительная работа, выполняемая обновлением физики, может еще более снизить частоту кадров, это называется проблемой «колодца диспута». Обычно вы можете зажимать количество дополнительных кадров до примерно 3, поэтому ваши частоты кадров не будут значительно уменьшаться дополнительными шагами. –

Смежные вопросы