2014-10-08 106 views
2

内调用一个Lua函数我有一个创建一个场景和场景功能中它创建一个甲板对象和一个名为wonGame(),办理入住手续时看到比赛赢功能的主要LUA文件。从一个对象实例

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()函数?例如,假设我有一个在甲板类称为校验条件函数

function checkCondition(e) 
    if(somethingTrue) 
     wonGame() --this should be the function in Main file 
    end 
end 
+3

你总是忘了'self'参数。另外,不应该'wonGame'成为'Deck'的成员? – Deduplicator 2014-10-08 14:14:01

+0

我的头痛苦思考这是如何设计的。什么是场景和甲板?正在玩的游戏是什么?他们如何相互关联?截至目前,函数wonGame在创建函数被调用后会超出范围。 – Moop 2014-10-08 19:02:57

+0

我相信他所拥有的是正确的。 wonGame不应该在Deck中实现。甲板应该可能只是我假设的牌的一个集合,并且不会知道它所在的游戏。 – Henry 2014-10-09 16:51:56

回答

0

你总是可以尝试和实施委托:Wikipedia

基本上这意味着你在一个连回'甲板'有一个属性现场'。当你创建你的卡,你会设置类似

Deck.SceneDelegate = self 

然后在甲板,你可以只调用

SceneDelegate.wonGame() 
0

你需要两样东西:

  1. 甲板的设计必须调用用户-defined回调
  2. 您必须在回调注册到甲板实例

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

function Deck:doSomething() 
    ... 
    -- if some condition is verified, and the onWonGame callback has been defined, call it: 
    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()。如果您希望所有实例使用相同的回调,则必须在类中定义回调而不是实例。