Corona SDK变量贯穿不同的场景

时间:2014-01-04 14:18:39

标签: corona

我想知道如何在不同的场景中管理日冕中的变量。 在我的游戏得分变量是在每个场景我想知道的是如何连续添加每个场景的得分,因为每次场景改变时得分自动变为零。

8 个答案:

答案 0 :(得分:2)

您可以使用单独的文件。例如:

mydata.lua

用表格:

local M = {}
return M

- 然后在你的game.lua中你可以简单地要求它:

local mydata = require( "mydata" )

并使用例如得分:

mydata.score = 0

在你的highscore.lua或其他任何你可以称之为简单的pzy:

local mydata = require( "mydata" )

现在您可以使用mydata.score已保存的值

答案 1 :(得分:1)

我希望不再使用场景。您可以尝试非常有效且高效的作曲家。

http://docs.coronalabs.com/api/library/composer/index.html

它有两个函数setVariable()和getVariable()。使用这些功能,您可以将乐谱从一个场景传递到另一个场景。

由于使用全局变量可能会导致内存泄漏,因此最好不要使用全局变量

答案 2 :(得分:1)

使用监听器和自定义事件的解决方案

如果在分数初始化或更改之前加载了需要知道分数的所有场景,则可以使用监听器功能来完成。如果由分数更改导致的任何给定场景的更改都很小(例如,只有TextObject中显示的值发生更改),此方法会使每个场景的视图保持最新,并允许您在不停顿的情况下切换场景更新显示。

在每个scene:create()中,需要响应得分变化的对象被赋予一个侦听器函数,该函数在运行时接收到自定义事件(在此示例中名为“scoreChange”)时调用,并且必要时变化:

function scene:create( event )

    ...

    local score = display.newText( "0", 0, 0, native.systemFont )

    function score:scoreChange( event )
        self.text = tostring( event.score )
        return false --To allow the event to propogate to other EventListeners
    end
    Runtime:addEventListener( "scoreChange", score )

    self.score = score    -- lets us retrieve this object easily

    ...

end

每当分数发生变化时,将使用新分数值调度自定义事件“scoreChange”。例如:

local function adjustScore( deltaScore )

    local score = tonumber( scene.score.text )  -- TextObject with score easily retrieved
    score = score + deltaScore

    local event = {
        name = "scoreChange",
        score = score
    }
    Runtime:dispatchEvent( event )

end

运行时捕获此事件,并在已为其注册的所有表侦听器上调用方法scoreChange()

要使这种方法起作用,必须先加载具有这些侦听器的场景,然后才能使用户输入/操作影响分数(需要调用scene:create()函数来设置侦听器),例如。

composer.loadScene( "scene1" )
composer.loadScene( "scene2" )
...
composer.gotoScene( "scene1" )

答案 3 :(得分:0)

只需在任何类中创建全局变量(最好main.lua):

  _G.myGlobalScoreVal = 100; 

然后您可以从任何场景中访问它

 print("My Score is:".._G.myGlobalScoreVal) -- print the pre-setted value (here 100)

保持编码.........................:)

答案 4 :(得分:0)

更容易在Main.Lua中创建全局变量,然后您可以在整个项目中使用该变量。在声明它时不使用'local'来初始化全局变量。

答案 5 :(得分:0)

使用“_G”。在每个变量之前并在所有屏幕上使用。

例如: 在class1.lua中,将对象声明为:

_G.object1 = 8000

并在另一个类class2.lua中使用它:

print("class1 global variable name : " .. _G.object1)

它将打印其值。 _G。使变量成为全局变量。

或者您可以在main.lua中声明变量并在所有屏幕中使用它。

例如: 如果我们将main.lua中的状态栏隐藏为:

display.setStatusBar( display.HiddenStatusBar )

状态栏将隐藏在所有屏幕中。

答案 6 :(得分:0)

使用“_G”在main.lua文件中声明您的变量。在变量之前

答案 7 :(得分:0)

避免混淆:

使用_G.只是为了跟踪全局内容而不是局部内容,如果您删除_G.,它仍将放置在全局表中。

真正的区别是您是否在变量/表之前使用local。