在场景之间使用分数 Corona SDK

Using scores between scenes Corona SDK

我有两个场景:game.lua 文件和一个 restart.lua 文件。一旦 game.lua 文件结束,它将转移到重新启动屏幕。在重新启动屏幕上,我有 'your current score:' 和 'your highscore:' 以及这些值。但是,这些值不会在每次后续重新启动后自行更新。在我重新启动应用程序之前,高分不会更新,并且在我重新启动应用程序之前,当前分数不会重置为零。

例如:i)假设我当前的最高分是 21。我玩了一次游戏并获得了新的最高分:23。我当前的分数变为 23,但我的最高分仍然是 21(直到我重新启动应用程序) .

ii)我又玩了一次(没有重新启动应用程序),得到了 5 分。重新启动屏幕仍然显示 23 作为我的当前分数。

所以基本上我玩了一次游戏,所有分数都卡住了。

在应用程序中,我使用自我模块来保存高分(因为这必须是永久的)并将我的当前分数设置为全局。

这是我的游戏场景中的代码:

    highscore = loadFile("score.txt")--the ego module loads this file for me

    score = 0--kept global to use in restart screen
    local scoreText = display.newText(score,W,0)--create text
    sceneGroup:insert(scoreText)



    local function checkForFile()
        if highscore == "empty" then
            highscore = 0--gives highscore number if file is empty
            saveFile("score.txt", highscore)--saves new highscore
        end
    end 
    checkForFile()

    local function onObjectTouch(event)
        if(event.phase == "began") then
            score = score+1--increment score on touch
            scoreText.text = score

            if score>tonumber(highscore) then
            saveFile("score.txt",score)--if new highscore, save score as            highscore
        end

            vertical = -150--set ball's velocity
            ball:setLinearVelocity(0,vertical)
            print(ball.x .. " " .. event.x)
        end
    end

    Runtime:addEventListener("touch", onObjectTouch)

这是我重启场景中的代码

------------高分文本----------------

myscore = loadFile("score.txt")--load highscore file

local highscoretext = display.newText( "Your high score:"..myscore, 0, 0, native.systemFontBold, 20 )
highscoretext:setFillColor(1.00, .502, .165)
--center the title
highscoretext.x, highscoretext.y = display.contentWidth/2, 200
--insert into scenegroup
sceneGroup:insert( highscoretext )  



--------------yourscore----------------
local yourscoretext = display.newText( "Your score:"..score, 0, 0, native.systemFontBold, 20 )
yourscoretext:setFillColor(1.00, .502, .165)
--center the title
yourscoretext.x, yourscoretext.y = display.contentWidth/2, 230
--insert into scenegroup
sceneGroup:insert( yourscoretext ) 

您的代码似乎有点混乱,因为您使用的是 scorehighscoremyscore,但让我们尝试解决此问题。我将简要介绍这三种方法,但我们只会尝试其中的两种方法:

    1. 全局得分和高分变量
    1. Game.lua 文件
    1. 在场景之间传递参数

1。全局分数和高分变量

这是你现在正在使用的方法,如果你不需要,我不建议使用全局变量,所以让我们跳过这个方法,看看其他两个。


2。 Game.lua 文件

在此方法中,我们将使用指定的 game.lua 文件来存储所有数据。请阅读来自 Corona 的博客 post,了解 Modular 类 如何在 Lua 中工作: https://coronalabs.com/blog/2011/09/29/tutorial-modular-classes-in-corona/

我们将在此示例中使用元表,但我们将创建一个 game.lua 文件,我们可以从任何其他 lua 或场景调用在我们的 Corona 项目中归档。这将使我们能够将 Score 和 High Score 保存在一个地方,并且能够非常轻松地保存和加载 High Score。那么让我们创建 game.lua 文件:

local game = {}

-- File path to the score file 
local score_file_path = system.pathForFile( "score.txt", system.DocumentsDirectory )
local current_score = 0
local high_score = 0

-----------------------------
-- PRIVATE FUNCTIONS
-----------------------------
local function setHighScore()
    if current_score > high_score then
        high_score = current_score
    end
end

local function saveHighScore()
    -- Open the file handle
    local file, errorString = io.open( score_file_path, "w" )

    if not file then
        -- Error occurred; output the cause
        print( "File error: " .. errorString )
    else
        -- Write data to file
        file:write( high_score )
        -- Close the file handle
        io.close( file )
        print("High score saved!")
    end

    file = nil
end

local function loadHighScore()
    -- Open the file handle
    local file, errorString = io.open( score_file_path, "r" )

    if not file then
        -- Error occurred; output the cause
        print( "File error: " .. errorString )
    else
        -- Read data from file
        local contents = file:read( "*a" )
        -- Set game.high_score as the content of the file
        high_score = tonumber( contents )
        print( "Loaded High Score: ", high_score )
        -- Close the file handle
        io.close( file )
    end

    file = nil
end

-----------------------------
-- PUBLIC FUNCTIONS
-----------------------------
function game.new()
end

-- *** NOTE ***
-- save() and load() doesn't check if the file exists!
function game.save()
    saveHighScore()
end

function game.load()
    loadHighScore()
end

function game.setScore( val )
    current_score = val
    setHighScore()
end

function game.addToScore( val )
    current_score = current_score + val 
    print("Current score", current_score)
    setHighScore()
end

function game.returnScore()
    return current_score
end

function game.returnHighScore()
    return high_score
end

return game

在你的场景文件中调用 game.lua 像这样(在场景的顶部):

local game = require( "game" )

并且您可以在需要时像这样调用不同的游戏方法:

game.load()
print("Current Score: ", game.returnScore())
print("High Score: ", game.returnHighScore())
game.setScore( game.returnHighScore() + 5 )
game.save()

上面的代码片段:

  • 从文件中加载高分
  • 打印当前比分
  • 打印最高分
  • 将当前分数设置为当前最高分数 + 5
  • 将高分保存回文件

因为我们将当前分数设置为高分 + 5,所以当我们重新启动 Corona 模拟器时,我们将看到该变化。


3。场景之间传递参数

当你使用composer.gotoScene切换场景时,你也可以添加这样的参数:

local options =
{
    effect = "fade",
    time = 400,
    params =
    {
        score = 125
    }
}

composer.gotoScene( "my_scene", options )

并在被调用的场景中像这样访问它们:

function scene:create( event )
    local sceneGroup = self.view
    print("scene:create(): Score: ", event.params.score )
end


-- "scene:show()"
function scene:show( event )
    local sceneGroup = self.view
    local phase = event.phase

    print("scene:show(): Score: ", event.params.score )
end

关于此方法的文档:https://coronalabs.com/blog/2012/04/27/scene-overlays-and-parameter-passing/