从对象实例内部调用Lua函数

我有一个主 Lua 文件,它创建了一个场景函数并在场景函数中创建了一个 Deck 对象和一个名为 wonGame() 的函数以检查游戏何时获胜。

local composer = require("composer")
function scene:create(e)
     require "Deck"
     myDeck = Deck:new()

     function wonGame()
         print("You have won the game")
     end
end

我的问题是 - 我如何从 Deck 类文件中调用 wonGame() 函数?例如,假设我在 Deck 类中有一个名为 checkCondition 的函数。

function checkCondition(e)
    if(somethingTrue)
         wonGame() --this should be the function in Main file
    end
end
点赞
用户858951
用户858951

你可以尝试并实现一个委托:维基百科

基本上,这意味着你在“Deck”中有一个指向“Scene”的属性。当你创建你的“Deck”时,你会设置像这样的东西

Deck.SceneDelegate = self

然后在“Deck”中,你可以直接调用

SceneDelegate.wonGame()
2014-10-08 16:17:41
用户869951
用户869951

你需要两个东西:

  1. Deck必须被设计成调用用户定义的回调函数
  2. 你必须向Deck实例注册你的回调函数

要求1意味着,在Deck代码的某个地方,你有调用self.onWonGame的代码。我不知道Deck是如何定义的,但它可能像这样:

function Deck:doSomething()
    ...
    -- 如果满足某些条件,并且定义了onWonGame回调,则调用它:
    if self.someCondition and self.onWonGame then
         self.onWonGame()
    end
    ...
end

需求2意味着你需要一个数据成员或方法来设置回调。例如:

function Deck:setWonGameCallback(callback)
    self.onWonGame = callback
end

以上示例只允许为Deck实例定义一个回调。如果你想要多个回调,你需要将self.onWonGame设置为回调表,然后在doSomething中循环并调用每一个回调。此外,在上面的示例中,每个实例都必须调用setWonGameCallback()。如果你想让所有实例都使用相同的回调函数,你需要在类中定义回调函数,而不是实例。

2014-10-12 13:23:45