关卡页面电晕软件开发工具包



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

我使用我在这里找到的示例得到了一个类似的页面;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

calendar_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

等级01

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

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

请注意,storyboard.purgeOnScreenChange不存在,您可能打算storyboard.purgeOnSceneChange .但是拼写错误意味着设置保持错误,因此它不是您遇到的问题的一部分。但是,如果您修复了拼写错误,也要注释掉该行main.lua否则它将具有相同的效果。

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

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

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

请注意,仅当场景的 视图不存在 — 也就是说,它将在第一次被称为 场景已加载。但是,作曲家试图将场景保留在内存中 假设您稍后会重新访问它,因此如果场景保留在 内存,场景:创建()不会被调用。

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

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

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

  3. 将代码迁移到 Composer API,同时,它可能是了解场景管理是个好主意。然后绘制您的级别选择,并在从特定级别返回时根据需要进行更新。

最新更新