나는이 문제를 이미 며칠 동안 처리해 왔습니다. 나는 재치가있다! 포럼, 문서 등 어디서나 확실한 답변을 찾을 수 없습니다., removeEventListener (Event.ENTER_FRAME)가 작동하지 않습니다.
처음 실행하거나 사용자가 다음 단계로로드 할 때 문제가없는 것 같습니다. 그러나 사용자가 다른 레벨을로드하기 위해 ESC 키를 눌렀다면 ENTER FRAME 리스너가 제거되지 않고 플레이어가 실제로 빠르게 움직이는 것을 보여주는 모든 트리거가 복제되고 이전의 인스턴스화 된 ENTER FRAME 리스너입니다.
익명의 기능에 문제가 있거나 알 수없는 인스턴스가 내 removeEvent ... 명령에서 참조되고 있는지 여부를 알 수 없습니다. 최악의 행을 포기하고이 작업이 필요합니다.
여기에 코드입니다 :
function initPlay():void
{
//code here determining what display object to add to the list and assign it to the currentLevel variable (a movieclip)
if(userIsLoadingOtherLevel){
removeEnterFrameListener();
addChild(currentLevel);
}
if(userIsGointToNextLevel)
addChild(currentLevel);
currentLevel.addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(event:Event):void
{
//collision detection, parallax scrolling, etc, etc is done here.
if(allCoinsCollected)
loadNextLevel();
if(ESCKeyPressed)
ESCKeyPressHandler();
}
function loadNextLevel():void
{
removeChild(currentLevel);
newLevelToLoad++
removeEnterFrameListener();
initPlay();
}
function ESCKeyPressHandler():void
{
removeChild(currentLevel);
initPlay();
}
function removeEnterFrameListener();
{
currentLevel.removeEventListener(Event.ENTER_FRAME,onEnterFrame)
trace("currentLevel.hasEventListener(Event.ENTER_FRAME) = "+currentLevel.hasEventListener(Event.ENTER_FRAME)); //outputs TRUE if called from loadNextLevel but FALSE if called from initPlay() !!!
}
}
내가 추가 및 모든에서, 무비 클립 (루트), 또는 아무것도를 준비하지하는의 EventListener를 제거하기 위해 노력하고 결과는 항상 동일합니다.
그와 같은 프로세스를 설계하는 다른 방법이있을 수 있지만, 프로젝트가 매우 길기 때문에 (약 4000 줄의 코드) 및 ENTER FRAME 이 방법, 미쳤던, 또는, 일하지 않아야한다!!
도움을 주실 분은 미리 감사드립니다.
그것이 작동합니까 ESCKeyPressHandler 대신 loadNextLevel을 사용한다면 – Pan
나는 느낌도 가지고있다. 무슨 일이 일어나고 있는지 ENTER_FRAME 이벤트 리스너가 currentLevel 표시 객체의 모든 자식에 첨부되고 다른 레벨을 추가하기 위해이 객체를 제거하면 currentLevel Children 중 일부 또는 그와 같은 것으로 남아 있습니다. 나는 새로운 레벨을 로딩 한 후에도 여전히 플레이어가 여전히 이전에 존재했던 "보이지 않는"오브젝트와 충돌하기 때문에 이것이 일어날 수 있다고 생각합니다. –
예 팬, 괜찮습니다. ESCKeyPress 핸들러를 사용할 때만 문제가 있습니다. 그것은 단지 그것을 제거하지 않습니다! –