2014-01-12 5 views
0

저는 코로나와 루아를 처음 접합니다. 그래서 메인 화면에서 메인 파일로 이동하면 정상적으로 작동합니다. 그런 다음 다른 창고에서 그 창고로 돌아가고 싶습니다. 아무 일도 일어나지 않습니다. (하지만 "승리"는 내 창문을 내뿜고 있습니다.)LUA/Corona sdk : storyboard.gotoScene() not working

승리 기능 : 내가 전화 했어

function win() 
    print("win!"); 
    storyboard.gotoScene("MSCREEN.mscreen"); 
end 

기능 :

function scene:enterFrame(inEvent) 
    --some other stuff 
    if (ball.x>display.contentWidth and failFlag==false) then 
    win(); 
    end 

end 

내 주요 sceen :

local scene = storyboard.newScene(); 
local bg; 
local text; 

function scene:createScene(inEvent) 
    bg = display.newImage("MSCREEN/bg.png"); 
    bg.x = display.contentWidth/2; 
    bg.y = display.contentHeight/2; 

    text=display.newText("Touch!", 0,0, fontName, 70); 
    text.x =display.contentWidth/2 ; 
    text.y =display.contentHeight/2 +230; 

    self.view:insert(bg); 
    self.view:insert(text); 
end 

function scene:enterFrame(inEvent) 
tekstBujany(text); 
end 

function scene:touch(inEvent) 
    if inEvent.phase == "ended" then 
     storyboard.gotoScene("JUMP.GJump");  
    end 
end 

function scene:destroyScene(inEvent) 
bg:removeSelf(); 
bg=nil; 

text:removeSelf(); 
text=nil; 
end -- End destroyScene(). 

scene:addEventListener("createScene", scene); 
scene:addEventListener("destroyScene", scene); 
Runtime:addEventListener("enterFrame", scene); 
Runtime:addEventListener("touch",scene); 

return scene; 

해결 그래서

,691 추가
storyboard.purgeOnSceneChange = true; 

트릭을했는데 이유가 확실하지 않습니다.

답변

1

"enterFrame"이벤트는 런타임 개체의 모든 프레임에서 생성되므로 약 30-60 회/초입니다. 가능한 경우 모든 프레임에서 win()이 호출됩니다. storyboard.purgeOnSceneChange = false이면 win() 호출의 상수 스트림과 동일한 장면으로의 전환 지속 스트림으로 이어지는 각 장면에 대해 enterFrame이 호출됩니다. "MSCREEN.mscreen"(이것은 좋을 수 없다). OTOH storyboard.purgeOnSceneChange = true로 설정하면 win()을 호출하는 enterFrame이있는 이전 장면이 제거되므로 win()은 한 번만 호출됩니다.

결론적으로 storyboard.purgeOnSceneChange = true로 설정하면 작동하지만 거기에있는 논리에 문제가 있다고 생각합니다. 모든 프레임에서 장면 전환을 호출해서는 안됩니다. 당신이 승리를 선언 할 몇 가지 조건을 모니터링하는 경우, 당신은 승리 (의를 enterFrame 콜백을 제거) 또는 조건이 한 번만 호출 승리() 후 거짓 확인해야합니다 중 하나

function scene:enterFrame(inEvent) 
    if (ball.x > display.contentWidth and failFlag == false) then 
    win(); 
    Runtime:removeEventListener("enterFrame", scene); 
    end 
end 

이 보이는 가드 변수 이 :

local winCalled = false 

function win() 
    winCalled = true 
    ... 
end 

function scene:enterFrame(inEvent) 
    if (ball.x > display.contentWidth and failFlag == false) then 
    win(); 
    end 
end 
+0

고맙습니다. goToScene에 대한 첫 번째 호출 이후에 입력 프레임이 중지되었다고 확신했습니다. 그리고 나는 그것을 이해할 수 있기 때문에 storyboard.purgeOnSceneChange = true를 유지하는 것이 좋은 생각이라고 생각합니다 (저는 많은 마음을 가지고 있습니다). – Yeris

+0

@yeris 귀하의 솔루션이 작동하지만 사용하는 설정의 행운의 부작용으로 인해보다 견고한 솔루션을 찾고자 할 때 다른 옵션을 제공하기를 원합니다. 당신이 속임수 가방에 추가하는 것이 유용하다고 생각하길 바랍니다. – Schollii

+0

예, 전 논리를 바꾸 었습니다. storyboard.purgeOnSceneChange = true를 유지하는 것이 좋은 생각인지 알고 싶습니다. – Yeris

2

win() 함수를주의 깊게 살펴 보면 많은 시간이 걸리는 것처럼 보입니다. 다른 변수를 설정하고 메소드에서 변경하십시오.

function win() 
    isNotWin = false -- so this method doesn't get called a lot of times. 
    print("win!") 
    storyboard.gotoScene("MSCREEN.mscreen") 
end 

function scene:enterFrame(inEvent) 
    --some other stuff 
    if (ball.x>display.contentWidth and failFlag==false and isNotWin == true) then 
     win(); 
    end 

end 
+0

천천히 코로나에 대한 이해를 얻고 있습니다. 하지만 천천히;] – Yeris

+0

@yeris 사람들에게 감사하는 방법은 그들의 대답을 upvote하는 것입니다 :) – Schollii

+0

그래,하지만 투표 할 당신에게 낮은 담당자가있다 – Yeris