ОШИБКА: "попытка проиндексировать глобальное" я "(нулевое значение) - PullRequest
1 голос
/ 14 июля 2020

Я очень медленно прорабатываю игровой трек cs50, и я застрял на Mario3. В видео он просто говорит о коде, но я хотел записать его в свой собственный, который я пишу вместе с видео. У меня тот же код, что и у него, но я продолжаю получать эту ошибку и не могу понять, почему. Я опубликую приведенный ниже код, но, насколько я могу судить, я уже назначил self.mapWidth = 30, поэтому я не знаю, почему он продолжает говорить, что это нулевое значение.

Вот ошибка Код ошибки

Вот карта. lua код


require 'Util'
Map = Class{}

TILE_BRICK = 1
TILE_EMPTY = 4

--cloud tiles
CLOUD_LEFT = 6
CLOUD_RIGHT = 7

SCROLL_SPEED = 62

function Map:init()
    self.spritesheet = love.graphics.newImage('graphics/spritesheet.png')
    self.tileWidth = 16
    self.tileHeight = 16
    self.mapWidth = 30
    self.mapHeight = 28
    self.tiles = {}

    self.camX = 0
    self.camY = 0

    self.mapWidthPixels = self.mapWidth * self.tileWidth
    self.mapHeightPixels = self.mapHeight * self.tileHeight

    self.tileSprites = generateQuads(self.spritesheet, self.tileWidth, self.tileHeight)

    --fill map with empty tiles--
    for y = 1, self.mapHeight do
        for x = 1, self.mapWidth do
            self:setTile(x, y, TILE_EMPTY)
        end
    end

    for y =self.mapHeight / 2, self.mapHeight do
        for x = 1, self.mapWidth do
            self:setTile(x, y, TILE_BRICK)
        end
    end

end

function Map:setTile(x, y, tile)
    self.tiles[(y - 1) * self.mapWidth + x] = tile
end

function Map:getTile(x, y)
    return self.tiles[(y -1) * self.mapWidth + x]
end

local x = 1
while x < self.mapWidth do
    if math.random(20) == 1 then
        local cloudStart = math.random(self.mapHeight / 2 -6)

        self.setTile(x, cloudStart, CLOUD_LEFT)
        self:setTile(x + 1, cloudStart, CLOUD_RIGHT)
    end
end


function Map:update(dt)
    if love.keyboard.isDown('w') then
        self.camY = math.max(0, math.floor(self.camY - SCROLL_SPEED * dt))
    elseif love.keyboard.isDown('s') then
        self.camY = math.min(self.mapHeightPixels - VIRTUAL_HEIGHT, math.floor(self.camY + SCROLL_SPEED * dt))
    elseif love.keyboard.isDown('a') then
        self.camX = math.max(0, math.floor(self.camX - SCROLL_SPEED *dt))
    elseif love.keyboard.isDown('d') then
        self.camX = math.min(self.mapWidthPixels - VIRTUAL_WIDTH, math.floor(self.camX + SCROLL_SPEED * dt))
    end
end

function Map:render()
    for y = 1, self.mapHeight do
        for x = 1, self.mapWidth do
            love.graphics.draw(self.spritesheet, self.tileSprites[self:getTile(x, y)],
                (x - 1) * self.tileWidth, (y - 1) * self.tileHeight)
        end
    end
end

и, если вам это нужно, вот мой основной. lua код

WINDOW_WIDTH = 1200
WINDOW_HEIGHT = 720

VIRTUAL_WIDTH = 432
VIRTUAL_HEIGHT = 243

Class = require 'class'
push = require 'push'

require 'Util'

require 'Map'

function love.load()
   
   map = Map()
    
   love.graphics.setDefaultFilter('nearest', 'nearest')

    push:setupScreen(VIRTUAL_WIDTH,VIRTUAL_HEIGHT,WINDOW_WIDTH,WINDOW_HEIGHT, {
        fullscreen = false,
        resizable = false,
        vsync = true
    })

end

function love.update(dt)
    map:update(dt)

    if love.keyboard.isDown('escape') then
        love.event.quit()
    end

end

function love.draw()
    push:apply('start')

    love.graphics.translate(math.floor(-map.camX),math.floor(-map.camY))

    love.graphics.clear(108/255, 140/255, 1, 1)
    map:render()

    push:apply('end')
end

Заранее благодарим за любую помощь.

1 Ответ

2 голосов
/ 15 июля 2020

function Map:SomeFunction() end синтаксис c сахар для Map["SomeFunction"] = function(self) end

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

Вне такой функции self равно nil.

Тем не менее, вы индексируете self несколько раз в этом, пока l oop, где self равно нулю.

local x = 1
while x < self.mapWidth do
    if math.random(20) == 1 then
        local cloudStart = math.random(self.mapHeight / 2 -6)

        self.setTile(x, cloudStart, CLOUD_LEFT)
        self:setTile(x + 1, cloudStart, CLOUD_RIGHT)
    end
end

, что является бесконечным l oop кстати

...