2013-05-04 1 views
3

Я пытаюсь сделать небольшую игру только для удовольствия, когда у меня есть проблемы с конфликтами.обнаружение коллизий между моим игроком и блоком из 2d-массива

У меня есть игрок, нарисованный на холсте, и некоторые блоки (16 x 16 пикселей), нарисованные на другом холсте.

Но у меня есть проблема с обнаружением горизонтальных столкновений.

...

Моя проблема сводится к следующему:

Мой игрок использует х у координаты, которые хранятся в виде:

var p_x; var p_y; 

этих значений игроки слева внизу координаты в пикселях.

Но мои блоки в 2D-массив под названием:

var g_levelarray; 

И каждый блок 16 х 16 точек так, например, если я делаю:

g_levelarray[3][2] = 1; 

означает, что блок будет нарисован на холсте слева: 48px и холст нижней 32px

...

Но тогда у меня есть мой код, чтобы проверить, если блок существует (в соответствии с игроком), где х и у является playercoordinates

function blockexists(x, y) { 
    var xpos = parseInt(x/g_blocksize); 
    var ypos = parseInt(y/g_blocksize); 


    $("#checkedblock").html("checked block: " + xpos + " " + ypos); 


    if (g_levelarray[xpos][ypos] != undefined) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

но что проверка имеет некоторые ошибки из-за того, что она округляет число так, когда я ударил блок от половины до вершины (как как показано на рисунке ниже), он позволяет игроку войти внутрь блока.

the error i have http://userhome.org/test/error.png

я также попытался Math.round вместо ParseInt, но это только делает проблему на игроков посередине.

Так как я могу написать этот код правильно, чтобы мой плеер не попал в блок?

ТНХ заранее

+0

Если 'g_levelarray [xpos] [ypos]' представляет строку, то что входит в метод 'indexOf()' n ваш код? –

+0

Я думаю, что сначала не понял вас, но да, я понимаю. Индекс кода неверен. Он должен быть indexOf ('t') == -1. Лол. Но все же не проблема, хотя :) но я только что удалил это на данный момент. – JohnMalkowich

+0

'return g_levelarray [xpos] [ypos]! = Undefined' будет чище. – Shikiryu

ответ

1

Вместо того, чтобы просто используя parseInt и round попробуйте использовать диапазон.

Возьмите нижнюю границу (Math.floor) и верхнюю границу Math.ceil и проверьте, существует ли блок в этом диапазоне, проверив эти значения в массиве.

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

  • Нет связанных вопросов^_^