【问题标题】:Levels page Corona SDK关卡页面 Corona SDK
【发布时间】:2014-12-29 17:41:44
【问题描述】:

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

使用我在此处找到的示例,我得到了一个类似的页面; http://www.christianpeeters.com/corona-sdk/level-selection-template-for-corona-sdk/

但是,当我在我的应用程序中实现此功能时,当我选择可打开的日期/级别时,一旦完成,图像不会转换为已完成的图像(绿色勾号),并且它旁边的日期/级别当它应该可用时仍然被锁定。

我的代码可以在下面找到,帮助会很大。谢谢!

主要

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" )

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

level01

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

【问题讨论】:

  • 你的缩进全乱了,看不清代码结构。请注意 SO 上的格式:用空格替换所有制表符并确保代码按应有的方式对齐。
  • 对不起,我非常了解 SO(以及编程本身!)。我会尝试将其编辑为更易读的格式。感谢您的建议。
  • @kanedk90 你要从 main.lua 到 calendar_scene 吗?如果是这样,请在您的帖子中包含 main.lua...
  • @Melquiades 我从 menu_scene 转到日历场景。我刚刚将 menu_scene 和 main 添加到上面的文件中。

标签: lua coronasdk corona-storyboard


【解决方案1】:

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

请注意storyboard.purgeOnScreenChange 不存在,您可能想要storyboard.purgeOnSceneChange。但是拼写错误意味着设置保持错误,因此这不是您遇到的问题的一部分。但是如果你修正了错字,也要在main.lua 中注释掉那行,否则它会产生同样的效果。

所以注释掉所有与情节提要场景清除和删除功能有关的行,如果你觉得你真的需要它们(因为默认的 Corona 行为不合适),然后在一个地方重新引入并测试之间场景。

【讨论】:

    【解决方案2】:

    请注意,Corona 已移至 Composer 来管理场景,而不是 Storyboard。话虽如此,您的关卡仍然被锁定,因为绘制您的关卡并设置侦听器的代码位于 createScene 函数中,而在您的情况下,该函数只调用一次,因为 Corona 不会调用 createScene 如果您的场景尚未完全销毁。

    来自 Composer 中的 scene:create() 文档(也适用于 Storyboard):

    请注意,scene:create() 函数仅在场景的 视图不存在——也就是说,它将在第一次调用 场景已加载。然而,Composer 试图将场景保留在内存中 假设你稍后会重新访问它,所以如果场景仍然在 内存,scene:create() 不会被调用。

    因此,即使您正在修改全局级别表,当您返回 calendar_scene 时,也不会再次调用 createScene。您有 3 个选择:

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

    2. 使用 storyboard.purgeOnSceneChange(而不是 purgeOnScreenChange,如 Schollii 注意到)并将其设置为 true,这样场景将是 离开时销毁,这意味着将调用 createScene 当您从关卡选择中回来时(更好,但同样,理解场景内存管理和相应的代码比使用捷径更重要,尽管有时这些也有有效用途)。

    3. Migrate 你的代码到 Composer API,同时,它可能是 understand scene management 是个好主意。然后绘制您的级别选择,并在从特定级别返回时根据需要进行更新。

    【讨论】:

      猜你喜欢
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2013-12-18
      • 2017-03-14
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多