I want to know How to display a virtual high score. I've been trying to figure how to do that with the Ghost-vs-Monster example but had failure. I want to know the simplest way of displaying a virtual while your playing a game. Here is what adding score looks like.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | local scoreText local score = 0 scoreText = display.newText(score, 0, 0, "HelveticaNeue", 35) scoreText:setTextColor(255, 255, 255) scoreText.x = 160 scoreText.y = 30 --This would the score adding up randomly local function onCollision(event) if event.phase == "began" and event.other.name == "ball2" then display.remove(event.other) event.other = nil score = score + math.random( 100 ) scoreText.text = score end end Red.preCollision = onLocalPreCollision Red:addEventListener("collision", onCollision) |
logic is like that:
you score points, they add up to variable "score"
on game exit\game over you call function like that:
if score > highscore then
highscore = score
end
and highscore is your variable that you write to file at game over and load at start of the level\game
you can use one of the many saving modules for that purpose
@darkconsoles I'm little confuse on how to display the high score on the game over scene
just like any other text
use .text variable like that:
local function game_over()
if score> highscore then
highscore = score
end
local highscoreText = display.newText("HighScore: ",0,0,nil,30)
highscoreText.text = "HighScore: ".. highscore -- or just "score" variable
end
@darkconsoles I keep on getting an error every time when the scene changes to gameover. The error says
attempt to compare nil with number
I put the function on a timer. Every time the timer is 0 it changes scene and I end up getting an error. I know for sure I'm doing something wrong.
ok, you want to download ice library, you can find it here:
https://github.com/GrahamRanson/Ice
i played with it for the first time and managed to get working high score system, its not pretty, but whatever if it works))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | require( "ice" ) local scores = ice:loadBox( "scores" ) local high = scores:retrieve("best") print(high) local gameOver = false local physics = require("physics") physics.start() physics.setGravity(0,5) local ballGroup = display.newGroup() local score = 0 local score_txt =display.newText("Score: ",0,0,nil,30) score_txt.x = 100; score_txt.y = 50 score_txt:setTextColor(255,0,0) score_txt.text = "Score: ".. score local function spawn_ball() if gameOver == false then local ball = display.newCircle(ballGroup,0,0,30) ball.x = math.random(50,300) ball.y = -50 physics.addBody(ball, {radius = 30}) ball.name = "ball" end end timer.performWithDelay(500, spawn_ball, 0) local basket = display.newRect(0,0,50,70) basket.x = display.contentWidth/2 basket.y = display.contentHeight - 80 physics.addBody(basket, "static") local function drag(event) if event.phase == "began" then event.target.isFocus = true elseif event.phase == "moved" and event.target.isFocus then event.target.x = event.x event.target.y = event.y end return true end basket:addEventListener("touch", drag) local function show_highScore() gameOver = not gameOver scores:storeIfHigher( "best", score ) scores:save() local highText = display.newText("", 0,0,nil,30) highText.x = display.contentWidth/2 highText.y = display.contentHeight/2 if score > high then highText.text = "HighScore: ".. scores:retrieve("best") else highText.text = "NO NEW HIGH SCORE!" end end local function show_text() local text = display.newText("+1", 0,0, nil, 30) score = score + 1 if score > scores:retrieve("best") then print("new high score") end score_txt.text = "Score: ".. score text.alpha = 1 text.x = basket.x text.y = basket.y - 100 transition.to(text, {time=1000,y = text.y - 50, alpha = 1, onComplete = function() display.remove(text) end}) end local function onCollision(event) if event.phase == "began" and event.other.name == "ball" then display.remove(event.other) show_text() end end basket:addEventListener("collision", onCollision) timer.performWithDelay(20000, show_highScore, 1) <lua> |
Here is my drawScores() function from OmniBlaster.
This was my first Corona project, so apologies on the quality of the code, but it works. For my project, I tracked 10 high scores for the player, the name they entered and their rank. Scores are kept in 3 tables (though now I would probably do it in one table) and are saved to separate score files using json.encode/json decode el I used a library out of the common code called "score.lua" to deal with the saving and loading of the scores. Today I would just use json.encode/decode with my own tables to track high scores.
This code only draws the 3 tables out.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | local function drawScores() local rank local rankText local ranks={} local names = {} local scores = {} local iPad = 0 if system.getInfo("model") == "iPad" then iPad = 40 end local msgHeader1 = display.newText("Rank", 50, 170, "Courier-Bold", 16) msgHeader1.x = 50 + iPad local msgHeader2 = display.newText("Player Name", 100, 170, "Courier-Bold", 16) msgHeader2.x = 135 + iPad local msgHeader3 = display.newText(string.format("%8s","Score"), 240, 170, "Courier-Bold", 16) msgHeader3.x = 240 + iPad scr.highScores:insert(msgHeader1) scr.highScores:insert(msgHeader2) scr.highScores:insert(msgHeader3) for i=1, scList:Count() do rank = scList:GetRank(i) if rank == 0 then rankText = "---" else if rank > award.maxRank then rank = award.maxRank end rankText = award.pilotRanks[rank] end ranks[i] = display.newText(rankText, 50 + iPad, 170 + i * 18, "Courier", 16) names[i] = display.newText(scList:GetName(i), 110 + iPad, 170 + i * 18, "Courier", 16) scores[i] = display.newText(string.format("%8d", scList:GetPoints(i)), 240 + iPad, 170 + i * 18, "Courier", 16) if i == scoreIndex then ranks[i]:setTextColor(255, 255, 255) names[i]:setTextColor(255, 255, 255) scores[i]:setTextColor(255, 255, 255) else ranks[i]:setTextColor(255,192,0) names[i]:setTextColor(255,192,0) scores[i]:setTextColor(255,192,0) end scr.highScores:insert(ranks[i]) scr.highScores:insert(names[i]) scr.highScores:insert(scores[i]) end end |
@darkconsole thanks for your help I was able to get it working on my game and also I like the sample you did. Very sorry for not appreciating that's my fault. I appreciate your help a lot very thank you. :)