Попытаться проиндексировать локальное "я" с помощью MOAICoroutine в Lua
Я только начинаю с MOAI и пытаюсь создать традиционный игровой цикл с использованием MOAICoroutine. Проблема в том, что когда я передаю ей функцию, которая является частью "класса", созданного с использованием 30log, он возвращает ошибку. Кажется, продолжает работать, но я хотел бы исправить ошибку. Я предполагаю, что MOAICoroutine вызывает функцию, используя точечную запись, а не синтаксический сахарный метод с двоеточием. Вот код:
class = require "30log.30log"
GameSystem = class ()
function GameSystem:__init(Name, Title)
self.Name = Name
self.Title = Title
self.Ready = false
end
function GameSystem:Run()
if self:Init() then
self.Thread = MOAICoroutine.new ()
self.Thread:run(self.Start)
--self:Start()
return true
else
print("Init failed.")
return false
end
end
function GameSystem:Init()
print("Initializing Game System")
if not self:InitTimer() then return false end
if not self:InitWindow(640,480) then return false end
if not self:InitViewport() then return false end
if not self:InitGraphics() then return false end
if not self:InitSound() then return false end
if not self:InitInput() then return false end
self.Ready = true
return true
end
function GameSystem:Start()
print("Starting Game System")
while self.Ready do
self:UpdateTimer()
self:UpdateGraphics()
self:UpdateSound()
self:UpdateInput()
coroutine.yield()
end
end
function GameSystem:InitTimer()
return true
end
function GameSystem:InitWindow(width, height)
print("Initializing Window")
return true
end
function GameSystem:InitViewport()
print("Initializing Viewport")
return true
end
function GameSystem:InitGraphics()
print("Initializing Graphics")
return true
end
function GameSystem:InitSound()
print("Initializing Sound")
return true
end
function GameSystem:InitInput()
print("Initializing Input")
return true
end
function GameSystem:UpdateTimer()
--print("Updating Timer")
return true
end
function GameSystem:UpdateGraphics()
--print("Updating Graphics")
return true
end
function GameSystem:UpdateSound()
--print("Updating Sound")
return true
end
function GameSystem:UpdateInput()
--print("Updating Input")
return true
end
Код класса 30log вызывает эту проблему? Я пробовал разные вещи. Я почти уверен, что self, к которому он пытается получить доступ, является первым аргументом, т.е. mytable.myfunction(self, myarg). Любые идеи, чтобы исправить эту нулевую ссылку. Ошибка фактически произошла во второй строке внутри функции Start (в то время как self.Ready делает).
1 ответ
function GameSystem:Run() if self:Init() then self.Thread = MOAICoroutine.new () self.Thread:run(self.Start)
Я предполагаю, что MOAICoroutine вызывает функцию, используя точечную запись, а не синтаксический сахарный метод с двоеточием.
Как это будет вызывать функцию, используя точечное представление (или двоеточие)? Что будет на левой стороне периода или толстой кишки? Вы не передали ему объект, только функцию. Тот факт, что вызывающая сторона хранила эту функцию в таблице, ему совершенно неизвестен. Он просто получает функцию и вызывает ее.
Если вы хотите, чтобы ваша сопрограмма начиналась с вызова метода, сделайте это в функции, которую вы передаете в coroutine.start:
self.Thread = MOAICoroutine.new ()
self.Thread:run(function() self:Start() end)
Дело в том, что:
function GameSystem:Start()
end
Точно эквивалентно:
function GameSystem.Start(self)
end
Точно эквивалентно:
GameSystem.Start = function(self)
end
Эквивалентно:
function Foobar(self)
end
GameSystem.Start = Foobar
Если я позвоню:
print(Foobar)
print(GameSystem.Start)
print(someGameSystemInstance.Start)
print
получает то же значение. В Lua функция - это функция, это функция, она не "испорчена" каким-либо образом, будучи сохраненной в таблице, так что третья сторона со ссылкой на функцию может знать, что вы хотите, чтобы она вызывалась как метод в какой-то конкретный экземпляр класса.