Love2d Gridlocked Player Проблемы

Я новичок в Löve, так что извините за что-то не так, я уже могу сказать. Я видел учебник Gridlocked Player и хотел сделать что-то подобное, основываясь на чужой личности. Это невидимый лабиринт, который рисует плитки, когда вы касаетесь их.

local points = 0
width = love.graphics.getWidth()
height = love.graphics.getHeight()

function love.load()
    picture = love.graphics.newImage( "candy.png")
    back = love.graphics.newImage( "sky.jpg")
    cloud = love.graphics.newImage("cloud.png")
    love.mouse.setVisible(false)
    song = love.audio.newSource('elevator.mp3')
    song:setLooping(true)
    song:play()
    song:setVolume(0.1)
    anime = love.graphics.newImage("anime.png")
    music = love.audio.newSource("tick.mp3")
    music:setVolume(0.3)
    font = love.graphics.newFont("Kendal.ttf", 18)
    font1 = love.graphics.newFont("Kendal.ttf", 40)
    font2 = love.graphics.newFont("Kendal.ttf", 60)

    player = {
      grid_x = 256,
      grid_y = 256,
      act_x = 300,
      act_y = 300,
      speed = 20
    }

  map = {
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
    { 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 },
    { 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 },
    { 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1 },
    { 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
    { 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
  }

  -- Cria um array do mesmo tamanho do array de map
  seen_tiles = {}
  for yindex,column in ipairs(map) do
    seen_tiles[yindex] = {}
    for xindex,tile in ipairs(column) do
      seen_tiles[yindex][xindex] = 0
    end
  end

end

function love.update(dt)
  function testMap (x, y)
  if map[(player.grid_y / 32) + y][(player.grid_x / 32) + x] == 1 then
    -- Marca um bloco como visto assim que setá-lo para 1
    seen_tiles[(player.grid_y / 32) + y][(player.grid_x / 32) + x] = 1
    return false
  end
  return true
  end
  player.act_y = player.act_y - ((player.act_y - player.grid_y) * player.speed * dt)
  player.act_x = player.act_x - ((player.act_x - player.grid_x) * player.speed * dt)
end


function love.draw()    
  love.graphics.draw(back, 0, 0)
  love.graphics.setColor(3, 3, 3)
  love.graphics.rectangle("fill", 580, 0, width, height)
  love.graphics.setColor(255, 255, 255)
  love.graphics.rectangle("fill", player.act_x, player.act_y, 32, 32)
  love.graphics.draw(cloud, 591, 150, 0, 0.2111111)
  love.graphics.setFont(font1)
  love.graphics.print("Ghost Maze", 600, 200)
  love.graphics.setFont(font)
  love.graphics.print("Minimum movements: 12", 600, 280)
  love.graphics.print("Your movements:" .. points, 600, 300)
  love.graphics.draw( picture, love.mouse.getX() , love.mouse.getY() )
  love.graphics.draw(anime, 530, 360)

  -- Desenha os blocos se eles forem marcados como vistos
  for y=1, #seen_tiles do
        for x=1, #seen_tiles[y] do
            if seen_tiles[y][x] == 1 then
                love.graphics.setColor(120, 0, 200)
                love.graphics.rectangle("fill", x * 32, y * 32, 32, 32)
                love.graphics.setColor(255,255,255)
            end

        end
    end
end

function love.keypressed (key)
  if key == "escape" then
    love.event.quit()
  end
  if key == "up" then
    if testMap (0, -1) then
      player.grid_y = player.grid_y - 32
      points = points + 1
      love.audio.play(music)
    end
  elseif key == "down" then
    if testMap (0, 1) then
      player.grid_y = player.grid_y + 32
      points = points + 1
      love.audio.play(music)

    end
  elseif key == "left" then
    if testMap (-1, 0) then
      player.grid_x = player.grid_x - 32
      points = points + 1
      love.audio.play(music)

    end
  elseif key == "right" then
    if testMap (1, 0) then
      player.grid_x = player.grid_x + 32
      points = points + 1
      love.audio.play(music)

    end
  end
end

Моя борьба заключается в том, что как только персонаж (маленькая коробка) покидает "карту", ​​возникает эта ошибка: Ошибка.

Я хочу показать экран, который означает, что уровень завершен, когда он выходит из лабиринта, но я почти не представляю, как решить эту проблему.

2 ответа

Вопрос на линии seen_tiles[(player.grid_y / 32) + y][(player.grid_x / 32) + x] = 1

Вы пытаетесь изменить элемент массива, который не существует, потому что вы находитесь вне сетки.

Попробуйте не дать игроку сойти с сетки в первую очередь или превратить код, на который я ссылался выше, в функцию, и проверить, существует ли элемент в массиве, прежде чем что-либо делать.

При манипулировании или чтении из массива вы должны проверять каждый шаг поиска, если он существует, иначе вы получите ошибку при попытке получить доступ к тому, чего нет. Таким образом, для map[a][b] Вы проверяете, если map[a] ~= nil and map[a][b] ~= nil тогда плитка карты объявляется. Если вы попытаетесь получить доступ map[a][b] в то время как map или же map[a] не объявлено, то вы получите ошибку при попытке получить доступ к чему-то, что не существует. Это относится к созданию, чтению и изменению массивов и их содержимого.

пример:

добавить новые массивы на карту: if map[a] ~= nil then map[a][b] = {}; else map[a] = {}; map[a][b] = {}; end - здесь вы проверите, если map[a] существует первым до объявления map[a][b] и создать в случае, если это не так, как Love2d будет пытаться получить доступ map затем map[a] сначала, а затем создать [b] внутри. Если не удается найти map или же map[a]вместо создания новых массивов для вставки это приведет к ошибке.

искать значения на карте: if map[a] ~= nil then result = map[a][b]; else result = "map[a] doesnt exist so doesnt map[a][b]"; end - если вы пытаетесь искать map[a][b], Love2d попытается получить доступ map, затем [a] внутри карты, тогда будет смотреть что внутри [b], если не удается найти map или же map[a] до достижения map[a][b]вместо извлечения nil это приведет к ошибке.

Другие вопросы по тегам