2

我刚从 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 做)。

4

1 回答 1

3
  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 中,一个函数就是一个函数,它不会以某种方式被存储在一个表中而被“污染”,这样引用该函数的第三方就可以知道你希望它作为一个方法被调用到一些特定的'类实例。

于 2013-01-29T16:20:07.790 回答