2013-07-07 5 views
4

자이로 스코프를 사용하여 게임을 만들려고하고 있는데 아주 이상한 문제가 있습니다. 나는이 다음과 같은 두 가지 장면의enterScene 이벤트가 발생하지 않았습니다.

enter image description here

enter image description here

첫 장면에서 볼이 두 번째 장면으로 이동 문이 충돌 할 때 내가 원하는. 공이 천천히 움직여 문과 충돌하면 모든 장면이 정상적으로 작동하고 다음 장면이 정상적으로 시작되지만 첫 번째 장면의 공이 매우 빠르게 움직여 큰 힘으로 문과 충돌하면 다음 장면이 시작되어 마치 입력 이벤트가 트리거되지 않습니다. 어떤 아이디어?

내 코드 :

장면 l :

--------------------------------------------------------------------------------- 
-- 
-- scene1.lua 
-- 
--------------------------------------------------------------------------------- 

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

system.setIdleTimer(false) 

local physics = require "physics" 
local physicsData = (require "myphysics").physicsData(1.0) 
--------------------------------------------------------------------------------- 
-- BEGINNING OF IMPLEMENTATION 
--------------------------------------------------------------------------------- 
local displayTime,background,ball,maze,maze2,borders,exitscn 
local startTime=0 
local levelTime = 20 

local function onGyroscopeDataReceived(event) 
    local deltaRadiansX = event.xRotation * event.deltaTime 
    local deltaDegreesX = deltaRadiansX * (180/math.pi) 
    local deltaRadiansY = event.yRotation * event.deltaTime 
    local deltaDegreesY = deltaRadiansY * (180/math.pi) 
    ball:applyForce(-deltaDegreesX*6, -deltaDegreesY*6, ball.x, ball.y) 
end 



function nextScene() 
    storyboard.gotoScene("loadscene2") 
end 

local function onCollision(event) 
    if (event.phase == "ended") then 
     if(event.object1.name=="exitscn" or event.object2.name=="exitscn") then 
      timer.performWithDelay (500, nextScene) 
     end 
    end 

end 

local function gameOver() 
    storyboard.gotoScene("menu", "fade", 300) 
end 

local function checkTime(event) 
    local now = os.time() 
    displayTime.text = levelTime - (now - startTime) 
    if (levelTime - (now - startTime)==0) then 
    gameOver() 
    end 
end 





-- Called when the scene's view does not exist: 
function scene:createScene(event) 
    local screenGroup = self.view 
    physics.start(); 
    physics.setGravity(0,0) 

    displayTime = display.newText(levelTime, 0, 0, "Helvetica", 20) 
    displayTime.isVisible=false 

    background=display.newImage("bcklevel1.png") 
    background.x=display.contentCenterX 
    background.y=display.contentCenterY 

    ball=display.newImage("ball1.png") 
    ball.x=30 
    ball.y=display.contentCenterY 
    ball.name="ball" 

    maze=display.newImage("maze1.png") 
    maze.x=display.contentCenterX 
    maze.y=display.contentCenterY 
    maze.name="maze" 

    maze2=display.newImage("maze1.png") 
    maze2.x=display.contentCenterX 
    maze2.y=display.contentCenterY 
    maze2.name="maze2" 

    borders=display.newImage("borders.png") 
    borders.x=display.contentCenterX 
    borders.y=display.contentCenterY 
    borders.name="borders" 
    borders.alpha=0.1 

    exitscn=display.newImage("exit.png") 
    exitscn.x=display.contentWidth-30 
    exitscn.y=display.contentCenterY 
    exitscn.name="exitscn" 

    physics.addBody (ball, "dynamic",physicsData:get("ball")) 
    physics.addBody (maze, "static",physicsData:get("mazelevel1_1")) 
    physics.addBody (maze2, "static",physicsData:get("mazelevel1_2")) 
    physics.addBody (borders, "static",physicsData:get("borders")) 
    physics.addBody (exitscn, "dynamic",physicsData:get("exitscn")) 

    --ball:addEventListener ("touch", nextScene) 
    Runtime:addEventListener("enterFrame", checkTime) 
    Runtime:addEventListener("gyroscope", onGyroscopeDataReceived) 
    Runtime:addEventListener("collision", onCollision) 

    screenGroup:insert(background) 
    screenGroup:insert(displayTime) 
    screenGroup:insert(ball) 
    screenGroup:insert(maze) 
    screenGroup:insert(maze2) 
    screenGroup:insert(borders) 
    screenGroup:insert(exitscn) 


    print("\n1: createScene event") 
end 




-- Called immediately after scene has moved onscreen: 
function scene:enterScene(event) 

    print("1: enterScene event") 
    physics.start() 

    startTime = os.time() 
    displayTime.isVisible=true 

end 


-- Called when scene is about to move offscreen: 
function scene:exitScene(event) 

    print("1: exitScene event") 
    physics.stop() 


    Runtime:removeEventListener("enterFrame", checkTime) 
    Runtime:removeEventListener("gyroscope", onGyroscopeDataReceived) 
    Runtime:removeEventListener("collision", onCollision) 

end 


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

    print("((destroying scene 1's view))") 
    package.loaded[physics] = nil 
    physics = nil 
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 

Scene2 : 두 번째 파일에서

--------------------------------------------------------------------------------- 
-- 
-- scene2.lua 
-- 
--------------------------------------------------------------------------------- 

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

system.setIdleTimer(false) 

local physics = require "physics" 
local physicsData = (require "myphysics").physicsData(1.0) 
--------------------------------------------------------------------------------- 
-- BEGINNING OF IMPLEMENTATION 
--------------------------------------------------------------------------------- 
local displayTime,background,ball,maze,maze2,borders,exitscn 
local startTime=0 
local levelTime = 20 

local function onGyroscopeDataReceived(event) 
    local deltaRadiansX = event.xRotation * event.deltaTime 
    local deltaDegreesX = deltaRadiansX * (180/math.pi) 
    local deltaRadiansY = event.yRotation * event.deltaTime 
    local deltaDegreesY = deltaRadiansY * (180/math.pi) 
    ball:applyForce(-deltaDegreesX*6, -deltaDegreesY*6, ball.x, ball.y) 
end 

function nextScene() 
    storyboard.gotoScene("menu", "fade", 1000) 
end 

local function onCollision(event) 
    if (event.phase == "ended") then 
     if(event.object1.name=="exitscn" or event.object2.name=="exitscn") then 
      timer.performWithDelay (500, nextScene) 
     end 
    end 

end 

local function gameOver() 
    storyboard.gotoScene("menu", "fade", 300) 
end 

local function checkTime(event) 
    local now = os.time() 
    displayTime.text = levelTime - (now - startTime) 
    if (levelTime - (now - startTime)==0) then 
    gameOver() 
    end 
end 





-- Called when the scene's view does not exist: 
function scene:createScene(event) 
    local screenGroup = self.view 
    physics.start(); 
    physics.setGravity(0,0) 

    displayTime = display.newText(startTime, 0, 0, "Helvetica", 20) 
    displayTime.isVisible=false 

    background=display.newImage("bcklevel1.png") 
    background.x=display.contentCenterX 
    background.y=display.contentCenterY 

    ball=display.newImage("ball1.png") 
    ball.x=30 
    ball.y=display.contentCenterY 
    ball.name="ball" 

    maze=display.newImage("maze2.png") 
    maze.x=display.contentCenterX 
    maze.y=display.contentCenterY 
    maze.name="maze" 

    maze2=display.newImage("maze2.png") 
    maze2.x=display.contentCenterX 
    maze2.y=display.contentCenterY 
    maze2.name="maze2" 

    borders=display.newImage("borders.png") 
    borders.x=display.contentCenterX 
    borders.y=display.contentCenterY 
    borders.name="borders" 
    borders.alpha=0.1 

    exitscn=display.newImage("exit.png") 
    exitscn.x=display.contentWidth-30 
    exitscn.y=display.contentCenterY 
    exitscn.name="exitscn" 

    physics.addBody (ball, "dynamic",physicsData:get("ball")) 
    physics.addBody (maze, "static",physicsData:get("mazelevel2_1")) 
    physics.addBody (maze2, "static",physicsData:get("mazelevel2_2")) 
    physics.addBody (borders, "static",physicsData:get("borders")) 
    physics.addBody (exitscn, "dynamic",physicsData:get("exitscn")) 

    --ball:addEventListener ("touch", nextScene) 
    Runtime:addEventListener("enterFrame", checkTime) 
    Runtime:addEventListener("gyroscope", onGyroscopeDataReceived) 
    Runtime:addEventListener("collision", onCollision) 

    screenGroup:insert(background) 
    screenGroup:insert(displayTime) 
    screenGroup:insert(ball) 
    screenGroup:insert(maze) 
    screenGroup:insert(maze2) 
    screenGroup:insert(borders) 
    screenGroup:insert(exitscn) 


    print("\n1: createScene event") 
end 




-- Called immediately after scene has moved onscreen: 
function scene:enterScene(event) 

    print("1: enterScene event") 
    physics.start() 
    startTime = os.time() 
    displayTime.isVisible=true 

end 


-- Called when scene is about to move offscreen: 
function scene:exitScene(event) 

    print("1: exitScene event") 
    physics.stop() 

    Runtime:removeEventListener("enterFrame", checkTime) 
    Runtime:removeEventListener("gyroscope", onGyroscopeDataReceived) 
    Runtime:removeEventListener("collision", onCollision) 

end 


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

    print("((destroying scene 2's view))") 
    package.loaded[physics] = nil 
    physics = nil 
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 
+0

대답은 주석으로 의미되었다. 그러나이 필드에 게시하는 것은 너무 길었습니다. – Eyeball

+1

나는 귀하의 경우에 충돌 감지없이 해결책을 얻을 수 있다고 생각합니다. 특정 작은 간격으로 타이머가 트리거되면 'if (ball.x> = door.x)'를 확인하십시오. 네가 원하면 이걸로 도움이 될거야.:) –

+0

nextScene() 함수가 두 번 이상 호출되는 중입니까? 함수 내에서 인쇄 메시지를 사용해보십시오. 한번만 실행하면됩니다. –

답변

0

, 난

function nextScene() 
    storyboard.gotoScene("menu", "fade", 1000) 
end 

local function onCollision(event) 
    if (event.phase == "ended") then 
     if(event.object1.name=="exitscn" or event.object2.name=="exitscn") then 
      timer.performWithDelay (500, nextScene) 
     end 
    end 

end 
에 대한 무시 무시한 무언가가 내기

먼저 500ms 지연하고 추가로 1000ms 지연하면 다음 장면으로 전환됩니다. 어쩌면 당신은 이것을 알고 있지만 첫 번째 파일에서와 같은 방식으로이 전환을 처리하지 않을 것입니다.

0

코드가 적절하다고 생각합니다. 스토리 보드 장면에 대한 입력 장면 및 메모리 재로드의 그룹화 문제가 있습니다. 나는 당신이 장면을 만드는 전체 코드를 작성 생각

  1. 이 스토리 보드 장면에 대해 한 번 시간을 호출합니다 : 아래의 솔루션을 시도해보세요. enterScene에 재사용 가능한 코드를 구현해야하며 scene 개체를 입력 할 때는 local group = self.view를 사용해야합니다.

  2. 현재 스토리 보드의 장면을 종료하거나 볼과의 DOOR 충돌시 현재 스토리 보드 장면의 메모리를 새로 고치거나 해제해야합니다.

0

nextScene을 호출하기 위해 지연되는 동안 collision 이벤트가 두 번 이상 트리거되는 것이 문제라고 생각합니다. 이 같은 일을

시도 :

local hasNextSceneEventHappened = false 

local function onCollision(event) 
    if (event.phase == "ended") then 
     -- Ignore the call if we have already collided for next level 
     if(event.object1.name=="exitscn" or event.object2.name=="exitscn") then 
      if (hasNextSceneEventHappened == true) then return end 
      hasNextSceneEventHappened = true 
      timer.performWithDelay (500, nextScene) 
     end 
    end 
end 

이 코드는 당신이 goToScene() 함수 스팸 메일을 해달라고 보장하고 바람직하지 않은 행동을 얻을 것이다. 그것이 효과가 있기를 바랍니다.

0

didGo과 같은 플래그를 사용합니다. 는 false에 파일 본체에이 플래그를 초기화하기와 같은 것을 쓰기 :

-- body of your file: 
local didGo = false 

-- when you want to go to another scene 
if (not didGo) then 
didGo = true 
storyboard.gotoScene... 
end 
관련 문제