Lua 级别页面Corona SDK

Lua 级别页面Corona SDK,lua,coronasdk,corona-storyboard,Lua,Coronasdk,Corona Storyboard,我正在尝试在我的应用程序中实现一个级别样式页面。我正在做一个降临节日历风格的应用程序,其中有一个类似于级别选择页面的日历页面,用户在其中选择一天,它会将您重定向到显示圣诞节消息的页面 我用我在这里找到的例子得到了一个类似的页面; 然而,当我在我的应用程序中实现这一点时,当我选择可打开的日期/级别时,一旦图像完成,图像不会转换为已完成的图像(绿色复选框),并且当图像应可用时,它旁边的日期/级别仍然被锁定 我的代码可以在下面找到,帮助将是巨大的。谢谢 主要 菜单与场景 级别01 尝试注释remov

我正在尝试在我的应用程序中实现一个级别样式页面。我正在做一个降临节日历风格的应用程序,其中有一个类似于级别选择页面的日历页面,用户在其中选择一天,它会将您重定向到显示圣诞节消息的页面

我用我在这里找到的例子得到了一个类似的页面;

然而,当我在我的应用程序中实现这一点时,当我选择可打开的日期/级别时,一旦图像完成,图像不会转换为已完成的图像(绿色复选框),并且当图像应可用时,它旁边的日期/级别仍然被锁定

我的代码可以在下面找到,帮助将是巨大的。谢谢

主要

菜单与场景

级别01


尝试注释removeAll调用,您不太可能需要它们:清除和删除卸载场景主要是为了节省内存,因此清除和删除功能应仅用于很少重新访问但包含大量对象的场景。对于经常访问的所有其他场景,或者没有太多对象的场景,它们不是必需的,并且可能会导致您可能遇到的细微错误

请注意,storyboard.purgeOnScreenChange不存在,您可能希望使用storyboard.purgeOnScreenChange。但是输入错误意味着设置仍然是错误的,因此这不是您遇到的问题的一部分。但是如果你修正了错误,也要在main.lua中注释掉那一行,否则会有同样的效果


因此,请注释掉与情节提要场景清除和移除功能有关的任何行,如果您觉得由于默认Corona行为不充分而确实需要它们,请在一个地方重新引入并测试场景之间的切换

请注意,Corona已经转到Composer来管理场景,而不是故事板。这就是说,您的级别仍然被锁定,因为绘制级别和设置侦听器的代码位于CreateSecene函数中,而在您的情况下,该函数只被调用一次,因为如果您的场景尚未完全破坏,Corona将不会调用CreateSecene

来自场景文档:在Composer中创建也适用于情节提要:

请注意,仅当场景为 视图不存在-也就是说,第一次调用 场景已加载。然而,作曲家试图将这一场景留在记忆中 假设您稍后会重新访问它,那么如果场景仍处于 内存,场景:创建将不被调用

所以,即使您正在修改全局级别表,当您回到calendar_场景时,CreateSecene也不会再次被调用。您有3种选择:

您可以将绘图/设置侦听器代码移动到willEnterScene 函数,返回后将再次调用该函数 calendar_场景,这次更新了值,但这不是一个好主意-记住删除exitScene中的显示对象、空侦听器等

根据需要使用storyboard.purgeOnSceneChange而不是purgeOnScreenChange 斯科利注意到了,并将其设置为真,这样场景就会变得真实 离开时将被销毁,这意味着将调用CreateSecene 同样,当您从“级别选择”返回时,会更好,但同样,理解相应的场景内存管理和代码比使用快捷方式更重要,尽管有时这些方法也有有效的用途

将您的代码转换为Composer API,同时,它可能 一个好主意。然后绘制您的关卡选择,并在从特定关卡返回时根据需要进行更新


您的缩进都是乱七八糟的,很难看到代码的结构。请注意SO上的格式:用空格替换所有制表符,并确保代码按应有的方式对齐。对不起,我非常了解SO和编程本身!。我将尝试将其编辑为更可读的格式。谢谢你的建议。@kanedk90你要从main.lua进入calendar_场景吗?如果是这样,请在你的帖子中加入main.lua…@Melquiades我将从我的菜单场景转到日历场景。我刚刚把菜单和主菜单添加到上面的文件中。
require "CiderDebugger";
-- Add a global background
local background = display.newImage("xmasbg.jpg",160, 240,300,480)

local function removeFlake(target)
        target:removeSelf()
        target = nil
end

local function spawnSnowFlake()
        local flake = display.newImage("snowflake.png")
        --group:insert(flake)
        flake.x = math.random(display.contentWidth)
        flake.y = -2
        local wind = math.random(80) - 40
        transition.to(flake,{time=math.random(3000) + 3000, y = display.contentHeight + 2, x = flake.x + wind, onComplete=removeFlake})
        --group:insert(flake)
end

local function makeSnow(event)
      if math.random(10) == 1 then -- adjust speed here by making the random number higher or lower
            spawnSnowFlake()
      end
      return true
end

Runtime:addEventListener("enterFrame",makeSnow)

-- Initialize our global variables
--local globals = require( "globals" )

-- main.lua
local storyboard = require( "storyboard" )
storyboard.purgeOnScreenChange = true
storyboard.gotoScene( "menu_scene" )
local storyboard = require( "storyboard" )

local scene = storyboard.newScene()
local hohoho = audio.loadSound("xmas.wav")

-- Clear previous scene
storyboard.removeAll()

-- local forward references should go here --
local function buttonHit(event)
    audio.play(hohoho)
    storyboard.gotoScene(event.target.goto, {effect = "slideRight"})

end

---------------------------------------------------------------------------------
-- BEGINNING OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------


-- Called when the scene's view does not exist:
function scene:createScene( event )
  local group = self.view

--local background = display.newImage("xmasbg.jpg",160, 240,300,480)
--group:insert(background)
local hohoho = audio.loadSound("xmas.wav")
--group:insert(hohoho)
local bgMusic = audio.loadSound("bgmusic.wav")
--group:insert(bgMusic)
local calendarButton = display.newImage("calendarButton.png", 160, 170)
group:insert(calendarButton)
calendarButton:addEventListener("tap", buttonHit)
calendarButton.goto = "calendar_scene"

local creditsButton = display.newImage("creditsButton.png", 160, 250)
group:insert(creditsButton)
creditsButton:addEventListener("tap", buttonHit)
creditsButton.goto = "credits_scene"

local sound = display.newImage("speaker117.png", 290, 495)
group:insert(sound)

local backgroundMusicChannel = audio.play( bgMusic, { channel=1, loops=-1, fadein=5000 } )

--Until Xmas Text
local xmasText = display.newText("Until Christmas", 0, 0, native.systemFontBold, 30)
xmasText: setTextColor( 0, 0,.75)
xmasText.x, xmasText.y = 160, 80
group:insert(xmasText)


--The number of days remaining
local dayText = display.newText( "", 0, 0, native.systemFontBold, 30 )
dayText:setTextColor( 0, 0, .75)
dayText.x, dayText.y = 55, 45
group:insert(dayText)

--The number of hours remaining
local hourText = display.newText( "", 0, 0, native.systemFontBold, 30 )
hourText:setTextColor( 0, 0, .75)
hourText.x, hourText.y = 160, 45
group:insert(hourText)

--The number of minutes remaining
local minutesText = display.newText( "", 0, 0, native.systemFontBold, 30 )
minutesText:setTextColor( 0, 0, .75)
minutesText.x, minutesText.y = 255, 45
group:insert(minutesText)

-- Create labels to indicate what the numbers mean
local dayLabel = display.newText( "Days", 0, 0, native.systemFont, 30 )
dayLabel:setTextColor( 0, 0, .75 )
dayLabel.x = 60; dayLabel.y = 5
group:insert(dayLabel)

local hourLabel = display.newText( "Hours", 0, 0, native.systemFont, 30)
hourLabel:setTextColor( 0, 0, .75 )
hourLabel.x = 160; hourLabel.y = 5
group:insert(hourLabel)

local minuteLabel = display.newText( "Mins", 0, 0, native.systemFont, 30 )
minuteLabel:setTextColor( 0, 0, .75 )
minuteLabel.x = 260; minuteLabel.y = 5
group:insert(minuteLabel)

--Function to update the countdown clock
local function updateTime()
local time = os.date("*t")

local daysLeft = 358 - time.yday
if (daysLeft < 10) then
daysLeft = "0" .. daysLeft
end
dayText.text = daysLeft

local hoursLeft = 23 - time.hour
if (hoursLeft < 10) then
hoursLeft = "0" .. hoursLeft
end
hourText.text = hoursLeft

local minutesLeft = 60 - time.min
if (minutesLeft < 10) then
minutesLeft = "0" .. minutesLeft
end
minutesText.text = minutesLeft


end

--Update the time once immediately to display the correct time
updateTime()

-- Update the clock once per second
local clockTimer = timer.performWithDelay( 1000, updateTime, -1 )

--[[function calendarButton:tap(event)
    audio.play(hohoho)
    calendarButton:removeSelf()
    display.newImage("pushedCalendarButton.png", 160, 170)
end--]]

--[[function creditsButton:tap(event)
    storyboard.gotoScene("credits_scene")
    audio.play(hohoho)
    creditsButton:removeSelf()
    --display.newImage("pushedCreditsButton.png", 160, 250)
end]]--

function sound: tap(event)
    --[[if(self.status == "playing") then
        sound:removeSelf()
        display.newImage("mute.png", 290, 495)
        audio.pause()
        self.status = "paused"

    elseif(self.status == "paused") then
        display.newImage("speaker117.png", 290, 495)
        audio.play()
        --self.status = "paused"



    end--]]


    sound:removeSelf()
    display.newImage("mute.png", 290, 495)
    audio.stop()
end



--[[local function removeFlake(target)
        target:removeSelf()
        target = nil
end

local function spawnSnowFlake()
        local flake = display.newImage("snowflake.png")
        --group:insert(flake)
        flake.x = math.random(display.contentWidth)
        flake.y = -2
        local wind = math.random(80) - 40
        transition.to(flake,{time=math.random(3000) + 3000, y = display.contentHeight + 2, x = flake.x + wind, onComplete=removeFlake})
        --group:insert(flake)
end

local function makeSnow(event)
      if math.random(10) == 1 then -- adjust speed here by making the random number higher or lower
            spawnSnowFlake()
      end
      return true
end



Runtime:addEventListener("enterFrame",makeSnow)--]]
calendarButton:addEventListener("tap", calendarButton)
--creditsButton:addEventListener("tap", creditsButton)
sound:addEventListener("tap", sound)

end


-- Called BEFORE scene has moved onscreen:
function scene:willEnterScene( event )
  local group = self.view

end


-- Called immediately after scene has moved onscreen:
function scene:enterScene( event )
  local group = self.view

end


-- Called when scene is about to move offscreen:
function scene:exitScene( event )
  local group = self.view

end


-- Called AFTER scene has finished moving offscreen:
function scene:didExitScene( event )
  local group = self.view

end


-- Called prior to the removal of scene's "view" (display view)
function scene:destroyScene( event )
  local group = self.view

end


-- Called if/when overlay scene is displayed via storyboard.showOverlay()
function scene:overlayBegan( event )
  local group = self.view
  local overlay_name = event.sceneName  -- name of the overlay scene

end


-- Called if/when overlay scene is hidden/removed via storyboard.hideOverlay()
function scene:overlayEnded( event )
  local group = self.view
  local overlay_name = event.sceneName  -- name of the overlay scene

end

---------------------------------------------------------------------------------
-- END OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------

-- "createScene" event is dispatched if scene's view does not exist
scene:addEventListener( "createScene", scene )

-- "willEnterScene" event is dispatched before scene transition begins
scene:addEventListener( "willEnterScene", scene )

-- "enterScene" event is dispatched whenever scene transition has finished
scene:addEventListener( "enterScene", scene )

-- "exitScene" event is dispatched before next scene's transition begins
scene:addEventListener( "exitScene", scene )

-- "didExitScene" event is dispatched after scene has finished transitioning out
scene:addEventListener( "didExitScene", scene )

-- "destroyScene" event is dispatched before view is unloaded, which can be
-- automatically unloaded in low memory situations, or explicitly via a call to
-- storyboard.purgeScene() or storyboard.removeScene().
scene:addEventListener( "destroyScene", scene )

-- "overlayBegan" event is dispatched when an overlay scene is shown
scene:addEventListener( "overlayBegan", scene )

-- "overlayEnded" event is dispatched when an overlay scene is hidden/removed
scene:addEventListener( "overlayEnded", scene )

---------------------------------------------------------------------------------

return scene
local storyboard = require( "storyboard" )
local scene = storyboard.newScene()
local hohoho = audio.loadSound("xmas.wav")

-- Clear previous scene
storyboard.removeAll()

-- local forward references should go here --

levels = 
{   
1, 2, 2, 2 ,2,  --1 means level is open to  be played (level.png)
2, 2, 2, 2, 2,  --2 means level is locked (locked.png)
2, 2, 2, 2, 2,  --3 means level is completed (greenchecked.png)
2, 2, 2, 2, 2,
2, 2, 2, 2, 2,
}

images ={
    { getFile = "gift.png", types = "play"},
    { getFile = "lock.png", types = "locked"},
    { getFile = "greenchecked.png", types = "done"}
}

local function buttonHit(event)
    storyboard.gotoScene ( event.target.destination, {effect = "slideLeft"} )
        audio.play(hohoho)
    print( event.target.destination)
        return true
end
---------------------------------------------------------------------------------
-- BEGINNING OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------


-- Called when the scene's view does not exist:
function scene:createScene( event )
  local group = self.view

    local levelIndex = 0
            for i=0,4 do
               for j=1,5 do

                    tablePlace =   i*5 + j  
                    levelIndex = levelIndex + 1
                    local imagesId = levels[levelIndex] 
                    levelImg = display.newImageRect (images[imagesId].getFile , 50, 50 )
                    levelImg.x = -22 + (j*62)
                    levelImg.y  = 130+ (i*70)
                    levelImg.anchorY = .8
                    group:insert(levelImg)

                    local levelText = display.newText(tablePlace,0,0,native.systemFont,28)
                    levelText.x = -22 + (j*62)
                    levelText.y = 125+ (i*70)
                    group:insert(levelText)

                    levelImg.destination = "level0"..tostring(tablePlace)

                    if images[imagesId].types ~= "locked" then
                    levelImg:addEventListener("tap", buttonHit)
                    end
                end
            end

    local heading = display.newText("Christmas Countdown", 0, 0, native.systemFontBold, 31)
        heading: setTextColor( .75, 0, 0)
        heading.x, heading.y = 160, 35
        group:insert(heading)

        local backButton = display.newImage("backButton.png", 43, 495)
        group:insert(backButton)
        backButton:addEventListener("tap", buttonHit)
        backButton.destination = "menu_scene"
end


-- Called BEFORE scene has moved onscreen:
function scene:willEnterScene( event )
  local group = self.view

end


-- Called immediately after scene has moved onscreen:
function scene:enterScene( event )
  local group = self.view

end


-- Called when scene is about to move offscreen:
function scene:exitScene( event )
  local group = self.view

end


-- Called AFTER scene has finished moving offscreen:
function scene:didExitScene( event )
  local group = self.view

end


-- Called prior to the removal of scene's "view" (display view)
function scene:destroyScene( event )
  local group = self.view

end


-- Called if/when overlay scene is displayed via storyboard.showOverlay()
function scene:overlayBegan( event )
  local group = self.view
  local overlay_name = event.sceneName  -- name of the overlay scene

end


-- Called if/when overlay scene is hidden/removed via storyboard.hideOverlay()
function scene:overlayEnded( event )
  local group = self.view
  local overlay_name = event.sceneName  -- name of the overlay scene

end

---------------------------------------------------------------------------------
-- END OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------

-- "createScene" event is dispatched if scene's view does not exist
scene:addEventListener( "createScene", scene )

-- "willEnterScene" event is dispatched before scene transition begins
scene:addEventListener( "willEnterScene", scene )

-- "enterScene" event is dispatched whenever scene transition has finished
scene:addEventListener( "enterScene", scene )

-- "exitScene" event is dispatched before next scene's transition begins
scene:addEventListener( "exitScene", scene )

-- "didExitScene" event is dispatched after scene has finished transitioning out
scene:addEventListener( "didExitScene", scene )

-- "destroyScene" event is dispatched before view is unloaded, which can be
-- automatically unloaded in low memory situations, or explicitly via a call to
-- storyboard.purgeScene() or storyboard.removeScene().
scene:addEventListener( "destroyScene", scene )

-- "overlayBegan" event is dispatched when an overlay scene is shown
scene:addEventListener( "overlayBegan", scene )

-- "overlayEnded" event is dispatched when an overlay scene is hidden/removed
scene:addEventListener( "overlayEnded", scene )

---------------------------------------------------------------------------------

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

local widget = require ("widget")
local calendar_scenefile = require ("calendar_scene")


-- local forward references should go here --

local completegameBtn


local function buttonHit(event)
    storyboard.gotoScene (  event.target.destination, {effect = "slideLeft"} )
    return true
end


-- Called when the scene's view does not exist:
function scene:createScene( event )
    local group = self.view

    local title = display.newText( "Level 1", 0, 0, "Helvetica", 38 )
    title.x = 160
    title.y = display.screenOriginY + 40
    group:insert(title)

    local backBtn = display.newText(  "Back", 0, 0, "Helvetica", 25 )
    backBtn.x = display.screenOriginX + 50
    backBtn.y = display.contentHeight - 30 
    backBtn.destination = "calendar_scene" 
    backBtn:addEventListener("tap", buttonHit)
    group:insert(backBtn)
end


-- Called immediately after scene has moved onscreen:
function scene:enterScene( event )
    local group = self.view

        local function btnClicked (event)
    --levelProgress = levelProgress + 1
    levels[1] = 3
    levels[2] = 1
    completegameBtn.destination = "calendar_scene" 
    completegameBtn:addEventListener("tap", buttonHit)
    end

    completegameBtn = widget.newButton { label = "Complete game", onRelease=btnClicked}
    completegameBtn.x = 160
    completegameBtn.y = 240
    group:insert (completegameBtn)
end

-- Called when scene is about to move offscreen:
function scene:exitScene( event )
    local group = self.view

    -- INSERT code here (e.g. stop timers, remove listeners, unload sounds, etc.)
    -- Remove listeners attached to the Runtime, timers, transitions, audio tracks

end

-- Called prior to the removal of scene's "view" (display group)
function scene:destroyScene( event )
    local group = self.view

    -- INSERT code here (e.g. remove listeners, widgets, save state, etc.)
    -- Remove listeners attached to the Runtime, timers, transitions, audio tracks

end



---------------------------------------------------------------------------------
-- END OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------

-- "createScene" event is dispatched if scene's view does not exist
scene:addEventListener( "createScene", scene )

-- "enterScene" event is dispatched whenever scene transition has finished
scene:addEventListener( "enterScene", scene )

-- "exitScene" event is dispatched before next scene's transition begins
scene:addEventListener( "exitScene", scene )

-- "destroyScene" event is dispatched before view is unloaded, which can be
-- automatically unloaded in low memory situations, or explicitly via a call to
-- storyboard.purgeScene() or storyboard.removeScene().
scene:addEventListener( "destroyScene", scene )


---------------------------------------------------------------------------------

return scene