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 クラス コードがこの問題の原因ですか? 私はいろいろなことを試しました。アクセスしようとしている自己が最初の引数、つまり mytable.myfunction(self, myarg) であると確信しています。この nil 値参照を修正するためのアイデア。実際にエラーが発生したのは、Start 関数内の 2 行目です (self.Ready do の間)。

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 に答える