попытаться проиндексировать локальное «я» с помощью 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? Я пробовал разные вещи. Я почти уверен, что я, к которому он пытается получить доступ, является первым аргументом, то есть mytable.myfunction (self, myarg). Любые идеи, чтобы исправить эту ссылку на нулевое значение. На самом деле ошибка произошла во второй строке внутри функции Start (в то время как self.Ready делает).


person Psyfun    schedule 29.01.2013    source источник


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

person Mud    schedule 29.01.2013
comment
@EgorSkriptunoff Ага, я это имел в виду. Спасибо, что указали на мою ошибку. - person Mud; 29.01.2013
comment
Это имеет смысл, поскольку все примеры, которые я видел, в которых используется MOAICoroutine, объявляют функцию встроенной. Будет ли функция Start по-прежнему иметь доступ к другим функциям и членам, хранящимся в таблице экземпляра? Просто хочу убедиться, что инкапсуляция класса, которую я использую, не вызовет проблем с доступом к элементам таблицы. Я не хочу лишать функцию Start, если она не может обновить таблицу. Я предполагаю, что это то, для чего нужна ссылка на себя, чтобы поддерживать ссылку на исходную таблицу. - person Psyfun; 29.01.2013
comment
Да, это действительно решило проблему. Я знал, как функции ведут себя внутри таблицы, но не знал, как MOAICoroutine ожидает эту функцию. Фактически, оба метода работали с использованием либо точечной записи, либо двоеточия. Большое спасибо за помощь. Отличное объяснение. - person Psyfun; 29.01.2013
comment
Будет ли функция Start по-прежнему иметь доступ к другим функциям и членам, хранящимся в таблице экземпляра? Конечно, потому что вы передаете им стол. - person Mud; 29.01.2013