【发布时间】:2014-01-04 14:18:39
【问题描述】:
我想知道如何在不同场景中管理电晕中的变量。 在我的游戏中,分数变量在每个场景中我想知道的是如何连续添加每个场景的分数,因为每次场景更改时分数都会自动变为零。
【问题讨论】:
-
不要像许多人建议的那样使用全局变量。 user2653067 提供了很好的答案。您还可以创建将为您管理传递变量的对象。
标签: coronasdk
我想知道如何在不同场景中管理电晕中的变量。 在我的游戏中,分数变量在每个场景中我想知道的是如何连续添加每个场景的分数,因为每次场景更改时分数都会自动变为零。
【问题讨论】:
标签: coronasdk
您可以使用单独的文件。示例:
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保存的值
【讨论】:
我希望不再使用场景。您可以尝试非常有效和高效的作曲家。
http://docs.coronalabs.com/api/library/composer/index.html
它有两个函数 setVariable() 和 getVariable()。使用这些功能,您可以将您的乐谱从一个场景传递到另一个场景。
由于使用全局变量可能会导致内存泄漏,最好不要使用全局变量
【讨论】:
如果需要知道分数的所有场景都在分数初始化或改变之前加载,这可以通过监听函数来完成。如果任何给定场景因分数变化而发生的变化很小(例如,只有 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" )
【讨论】:
只需在您的任何类中创建全局变量(main.lua 更可取):
_G.myGlobalScoreVal = 100;
然后您可以从任何场景访问它
print("My Score is:".._G.myGlobalScoreVal) -- print the pre-setted value (here 100)
继续编码............ :)
【讨论】:
更容易在 Main.Lua 中创建一个全局变量,然后您可以在整个项目中使用该变量。当你声明全局变量而不使用'local'时初始化它。
【讨论】:
使用“_G”。在每个变量之前并在所有屏幕上使用。
例如: 在 class1.lua 中将对象声明为:
_G.object1 = 8000
并在另一个类 class2.lua 中使用它:
print("class1 global variable name : " .. _G.object1)
它将打印它的值。 _G。使变量成为全局变量。
或者您可以在 main.lua 中声明变量并在所有屏幕中使用它。
例如: 如果我们在 main.lua 中隐藏状态栏为:
display.setStatusBar( display.HiddenStatusBar )
状态栏将隐藏在所有屏幕中。
【讨论】:
使用“_G”在main.lua 文件中声明您的变量。变量之前
【讨论】:
只是为了避免混淆:
_G. 的使用只是为了跟踪什么是全局的而不是本地的,如果你删除了_G.,它仍然会放在全局表中。
真正的区别在于是否在变量/表之前使用 local。
【讨论】: