Обнаружение столкновения плитки

Итак, я немного поработал над этой игрой. Однако за последний день я не смог понять, как работает обнаружение столкновений.

Масштаб по умолчанию равен 2.

Размер плеера 41*64*.

Мой проигрыватель находится в центре экрана по осям x и y.

Поскольку игрок находится в центре, движется мир, эти переменные — worldx и worldy. Игрок всегда остается в центре экрана.

Моя карта тайлов хранится в массиве и основана на цвете пикселя изображения. Если пиксель белый на карте [x][y], значение устанавливается равным 0, иначе оно устанавливается в блок. Это означает, что блок не отображается.

for x = 0, w-1 do --scans the image and builds the map array
   amap[x] = {}
   for y = 0, h-1 do
      local r, g, b, a = source:getPixel(x, y)
      if r == 255 and g == 255 and b == 255 then
         block = 0
      end
      if r == 255 and g == 100 and b == 0 then
         block = 1
      end
      if r == 130 and g == 125 and b == 0 then
         block = 2
      end
      if r == 76 and g == 76 and b == 76 then
         block = 3
      end
      if r == 255 and g == 0 and b == 255 then
         --this is the spawn pixel yet to build
      end
      amap[x][y] = block
   end
end --end function

функция, рисующая карту

for x = 0, w-1 do --draws the map
   for y = 0, h-1 do
      if amap[x][y] ~= 0 then
         love.graphics.drawq(ImgBlocks, Blocks[amap[x][y]], 32*x*(3/bscale) + worldx, 32*y*(3/bscale) + worldy + jy, 0 , 3/bscale, 3/bscale)
      end
      if amap[x][y] == 4 then  
      end
   end
end --end function

Функция должна возвращать истину или ложь в зависимости от того, произошло ли столкновение между игроком и блоком.


person NateAGeek    schedule 01.05.2012    source источник


Ответы (2)


Ваши плитки 32x32, верно? (из вызова drawq) Я бы порекомендовал вам создать функцию, которая проверяет, находится ли точка в сплошной плитке:

function pointCollisionTest(x, y)
    -- find which tile the point is in
    local tx, ty = math.floor(x / 32), math.floor(y / 32)
    -- check the tile
    if map[tx][ty] == solid then
        return true
    else
        return false
    end
end

Вам придется изменить логику if map[x][y] == solid в зависимости от того, как вы определяете сплошные плитки, но в остальном этот код должен работать.

Если у вас есть точечное столкновение, вы можете заставить игрока столкнуться, проверяя каждый угол его хитбокса (который вы должны легко определить) против этой функции всякий раз, когда игрок движется. Есть несколько способов сделать это; Я использую относительно простой метод вычисления новой позиции игрока, ее проверки, а затем полной отмены перемещения, если проверка столкновений возвращает true. Тем не менее, вы должны проверить/отменить компоненты движения x и y отдельно, чтобы игрок мог двигаться вдоль стен, а не придерживаться их.

person nkorth    schedule 19.05.2012

Вы просите базовое обнаружение 2D-столкновений?

Упрощенная формула: если (playerx > blockminx) и (playery ‹ blockmaxx) и (playery > blockminy) и (playery ‹ blockmaxy), то столкновение

person Gerhard Powell    schedule 01.05.2012