Corona: ScoreText записывает новую партитуру поверх старой

Мой код записывает счет (окончательный счет) поверх старого (без его удаления). Поэтому, когда он снова подсчитывает, мы можем увидеть старый счет (последний, который был у игрока), написанный на обратной стороне счетчика. (и когда он показывает новый рекорд, мы также можем видеть старый на обратной стороне)

local physics = require "physics"
physics.start()

--physics.setContinuous( false ) 

local storyboard = require "storyboard"
local scene = storyboard.newScene()

display.setDefault( "anchorX", 0 )
display.setDefault( "anchorY", 0 )


--local mydata = require( "mydata" )
--mydata.score = 0
    score = 0

function scene:createScene(event)

local screenGroup = self.view

sky = display.newImage("bg.jpg")
sky.x = 820; sky.y = 0. sky.rotation = 90 
screenGroup:insert(sky)

mountain1 = display.newImage("montagne2.png")
mountain1.x = -200; mountain1.y = 600
mountain1.speed = 0.5
screenGroup:insert(mountain1)
end

local scoreNumber = display.newText(score, 400, 0, nil, 50)
    scoreNumber.xScale = 1.2
    scoreNumber.yScale = 1.2

    if scoreNumber then 
    scoreNumber:removeSelf()
    end

local function updateScore()
    score = score + 1
    scoreNumber.text = score
    --mydata.score = mydata.score + 1

end

    scoreTimer = timer.performWithDelay(100, updateScore, -1)



local scoreText = display.newText("score:", 0, 0, nil, 50)
    scoreText.xScale = 1.2
    scoreText.yScale = 1.2
    screenGroup:insert( scoreNumber)




end

function scene:exitScene(event)


    Runtime:removeEventListener("touch", touchScreen)
    Runtime:removeEventListener("enterFrame", mountain1)
    Runtime:removeEventListener("enterFrame", mountain2)
    Runtime:removeEventListener("enterFrame", mountain3)
    Runtime:removeEventListener("enterFrame", mountain4)
    Runtime:removeEventListener("enterFrame", missile1)
    Runtime:removeEventListener("enterFrame", obst1)
    Runtime:removeEventListener("enterFrame", obst2)
    Runtime:removeEventListener("enterFrame", obst3)
    Runtime:removeEventListener("enterFrame", obst4)
    Runtime:removeEventListener("enterFrame", obst5)
    Runtime:removeEventListener("enterFrame", obst6)
    Runtime:removeEventListener("collision", onCollision)
    timer.cancel(scoreTimer)
     timer.cancel(memTimer)

end

function scene:destroyScene(event)

end

scene:addEventListener("createScene", scene)
scene:addEventListener("enterScene", scene)
scene:addEventListener("exitScene", scene)
scene:addEventListener("destroyScene", scene)

return scene

person Saad Chemlal    schedule 08.06.2015    source источник
comment
ваш код не ясен.   -  person AndroidUser    schedule 11.06.2015
comment
Тоже есть вопрос?   -  person Rob Miracle    schedule 23.06.2015
comment
@RobMiracle (у меня были некоторые проблемы с подключением), да, вопрос здесь в том, что: как я могу запретить коду записывать новый счет поверх старого? после окончания игры даже мой счетчик очков начинается с последнего. Мне кажется, что после окончания игры сохраненный текст счета каким-то образом сохраняется под новым.   -  person Saad Chemlal    schedule 24.06.2015
comment
Используете ли вы менеджер сцен, такой как Composer или Storyboard? Можете ли вы обновить свой пост с большим количеством кода?   -  person Rob Miracle    schedule 25.06.2015


Ответы (1)


Я не уверен на 100%, что мы видим достаточно кода или, что более важно, правильный код, но происходит несколько вещей.

local scoreNumber = display.newText(score, 400, 0, nil, 50)
scoreNumber.xScale = 1.2
scoreNumber.yScale = 1.2

if scoreNumber then 
     scoreNumber:removeSelf()
end

В этом блоке кода вы создаете scoreNumber и сразу же удаляете его. Вы также никогда не добавляете его в группу просмотра сцены: screenGroup:insert(scoreNumber)

local function updateScore()
    score = score + 1
    scoreNumber.text = score
    --mydata.score = mydata.score + 1
 end
 scoreTimer = timer.performWithDelay(100, updateScore, -1)

Это, скорее всего, приведет к сбою вашего приложения, поскольку каждые 100 миллисекунд (1/10 секунды) вы вызываете updateScore, который пытается сослаться на scoreNumber, который вы удалили прямо над ним.

local scoreText = display.newText("score:", 0, 0, nil, 50)
scoreText.xScale = 1.2
scoreText.yScale = 1.2

Теперь вы создали scoreText, но я никогда не видел, чтобы вы вставляли его в screenGroup, и я не видел, чтобы вы когда-либо обновляли его значение.

У вас много других дел. Я не вижу, где вы устанавливаете точки привязки по умолчанию (если вы вообще это делаете), а если нет, то экранные объекты центрируются по своим значениям X и Y. Таким образом, scoreNumber в течение короткого времени отрисовки будет центрирован на 400 пикселей слева и на 0 пикселей сверху. Это помещает по крайней мере верхнюю половину текста за пределы экрана. Затем вы увеличиваете его по какой-то причине. Почему бы просто не использовать более крупный шрифт? 50 * 1,2 = 60. Затем scoreText рисуется как 0, 0, что не только убирает верхнюю половину экрана, но и левую половину экрана.

Помните, что если вы хотите, чтобы Storyboard управлял вашими экранными объектами, они должны быть вставлены в screenGroup для вас, и вам не нужно удалять их самостоятельно.

person Rob Miracle    schedule 26.06.2015
comment
Привет, я только что вернул свой жесткий диск, он был украден. Теперь я начинаю свой проект, извините за задержку. - person Saad Chemlal; 22.04.2016
comment
Я добавил счет в свою группу экранов, теперь проблема в том, что счет идет после того, как игрок проигрывает, а не просто зависает, чтобы игрок мог увидеть свой окончательный счет (я обновил свой код выше) - person Saad Chemlal; 22.04.2016