【问题标题】:Corona SDK variable throughout different scenes不同场景中的 Corona SDK 变量
【发布时间】:2014-01-04 14:18:39
【问题描述】:

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

【问题讨论】:

  • 不要像许多人建议的那样使用全局变量。 user2653067 提供了很好的答案。您还可以创建将为您管理传递变量的对象。

标签: coronasdk


【解决方案1】:

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

mydata.lua

有一张桌子:

local M = {}
return M

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

local mydata = require( "mydata" )

并使用例如分数:

mydata.score = 0

在你的 highscore.lua 或任何你可以称之为 easy pzy 的地方:

local mydata = require( "mydata" )

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      如果需要知道分数的所有场景都在分数初始化或改变之前加载,这可以通过监听函数来完成。如果任何给定场景因分数变化而发生的变化很小(例如,只有 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" )
      

      【讨论】:

        【解决方案4】:

        只需在您的任何类中创建全局变量(main.lua 更可取):

          _G.myGlobalScoreVal = 100; 
        

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

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

        继续编码............ :)

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            _G.object1 = 8000
            

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

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

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

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

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

            display.setStatusBar( display.HiddenStatusBar )
            

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

                只是为了避免混淆:

                _G. 的使用只是为了跟踪什么是全局的而不是本地的,如果你删除了_G.,它仍然会放在全局表中。

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-04-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-12-19
                  • 2023-03-03
                  • 2015-11-16
                  • 1970-01-01
                  • 2013-07-20
                  相关资源
                  最近更新 更多