Попытаться проиндексировать локальное "я" с помощью 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 функция - это функция, это функция, она не "испорчена" каким-либо образом, будучи сохраненной в таблице, так что третья сторона со ссылкой на функцию может знать, что вы хотите, чтобы она вызывалась как метод в какой-то конкретный экземпляр класса.

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