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
это приведет к ошибке.