2013-07-14 2 views
0

나는 내 첫 프리 로더가 내 게임에서 결실을 맺게하려고 노력하고있다. 나는 꽤 많은 실험을했으며 여기에 내가 찾은 것이있다.액션 스크립트 3.0 ... 프리 로더가 작동하지 않습니다 ... 프레임 0에 갇혀 있습니까?

먼저 내 파일을 시뮬레이션 할 때 파일이 나타날 때까지 빈 흰색 화면이 표시됩니다 ... 실제로는 순간적으로 사용중인 큰 이미지 ... 완전히로드됩니다. 대역폭 프로파일 러를 사용하여 진행 상황을 확인했습니다. 적정 비율로 적재 중이며 적재 비율이 증가하는 것을 볼 수 있습니다. 불행히도 내 로더가 나타나지 않고 괴상한 점은 입니다. 프레임 0에 있습니다.. 왜 내가 이걸 말하고 있는지 모르겠다.

나는 그것을 고치려고 노력했다. 내 게임의 모든 무비 클립에 첫 번째 프레임을 내보내는 상자가 선택되어 있지 않은지, 내 프리 로더를 제외하고 문제가되지 않도록해야합니다. 또한 빈 .fla 파일을 만들고 단순히 프리 로더를 가져 와서 실행했습니다. 놀랍게도, 그것은 효과가 있었다! (다시 한 번 큰 이미지를로드했습니다). 나는 아무것도 바뀌지 않았다. ... 모두 같은 이름과 물건. 나는 왜 그 사람이 일할 것이고이 사람은 그렇지 않을 것이라고 생각하지 않습니다.

나의 타임 라인은 기본적으로 다음과 같습니다. 두 개의 레이어 : 첫 번째 레이어 첫 번째 프레임 액션은 stop();이라고 말합니다. 내 preloader도 내가 말한 것처럼 첫 번째 프레임에로드해야한다고 가정합니다. 로드가 끝나면 타임 라인을 통해 프레임 3으로 이동합니다. 여기서 내 기본 게임은 프레임 3의 액션을 넣기 시작해야합니다. 두 번째 레이어 두 번째 프레임로드하려는 이미지가 포함 된 MovieClip이 있습니다. 여기

내 "ThePreloader"클래스 내 문서 클래스

package com.classes 
{ 
    import flash.display.MovieClip; 
    import flash.display.Stage; 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class DocumentClass extends MovieClip 
    { 

     private var preloader:ThePreloader; 
     public static var enemyList1:Array = new Array(); 
     // moved stickobject1 to a class variable. 
     private var stickobject1:Stickman2; 

     private var scoreHud:ScoreHud; 

     public function DocumentClass() : void 
     { 
      preloader = new ThePreloader(390, this.loaderInfo); 
      stage.addChild(preloader); 
      preloader.addEventListener("loadComplete", loadAssets); 
      preloader.addEventListener("preloaderFinished", showSponsors); 

      var bg1:background1 = new background1(); 
      stage.addChild(bg1); 

      stickobject1 = new Stickman2(stage); 
      stage.addChild(stickobject1); 

      stickobject1.x=50; 
      stickobject1.y=300; 

      //running a loop now.... so we can keep creating enemies randomly. 
      addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
      stickobject1.addEventListener("hit", stickobject1Hit, false, 0, true); 
      scoreHud = new ScoreHud(stage); //create our HUD 
      stage.addChild(scoreHud); //and display it. 

     } 

     private function loadAssets(e:Event) : void 
     { 
      this.play(); 
     } 

     private function showSponsors(e:Event) : void 
     { 
      stage.removeChild(preloader); 
      trace("show sponsors"); 
     } 

     //our loop function 
     private function loop(e:Event) : void 
     { 
      //run if condition is met. 
      if (Math.floor(Math.random() * 40) == 5) 
      { 
       //create our enemyObj1 
       var enemyObj1:Enemy1 = new Enemy1(stage, stickobject1); 

       //listen for enemyObj1 being removed from stage 
       enemyObj1.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemyObj1, false, 0, true); 
       enemyObj1.addEventListener("killed", enemy1Killed, false, 0, true); 
       enemyList1.push(enemyObj1); 

       stage.addChild(enemyObj1); 
      } 
     } 

     private function enemy1Killed(e:Event) : void 
     { 
      scoreHud.updateKills(1); //add 1 to enemy kills 
      scoreHud.updateScore(e.currentTarget.points); //add that points variable we created earlier 
     } 

     private function stickobject1Hit(e:Event) : void 
     { 
      scoreHud.updateHits(1); //add 1 to number of hits 
     } 

     private function removeEnemyObj1(e:Event) 
     { 
      enemyList1.splice(enemyList1.indexOf(e.currentTarget), 1); 
     } 


    } 

} 

이며, 여기

package com.classes 
{ 
    import flash.display.LoaderInfo; 
    import flash.display.MovieClip; 
    import flash.events.*; 

    public class ThePreloader extends MovieClip 
    { 

     private var fullWidth:Number; //the width of our mcPreloaderBar at 100% 
     public var ldrInfo:LoaderInfo; 

     public function ThePreloader(fullWidth:Number = 0, ldrInfo:LoaderInfo = null) 
     { 
      this.fullWidth = fullWidth; 
      this.ldrInfo = ldrInfo; 

      addEventListener(Event.ENTER_FRAME, checkLoad); 
     } 

     private function checkLoad (e:Event) : void 
     { 
      if (ldrInfo.bytesLoaded == ldrInfo.bytesTotal && ldrInfo.bytesTotal != 0) 
      { 
       //loading complete 
       dispatchEvent(new Event("loadComplete")); 
       phaseOut(); 
      } 

      updateLoader(ldrInfo.bytesLoaded/ldrInfo.bytesTotal); 
     } 

     private function updateLoader(num:Number) : void 
     { 
      //num is a number between 0 and 1 
      mcPreloaderBar.width = num * fullWidth; 
     } 

     private function phaseOut() : void 
     { 
      removeEventListener(Event.ENTER_FRAME, checkLoad); 
      phaseComplete(); 
     } 

     private function phaseComplete() : void 
     { 
      //go on to the next phase 
      dispatchEvent(new Event("preloaderFinished")); 
     } 


    } 

} 

대역폭 프로파일 러가 내가 프레임 0에 붙어 및 말해 왜 내 주요 혼란이다 거의 100 %로드 될 때까지. 따라서 프리 로더를 표시하지 않습니다 .... 감사합니다!

답변

0

프리 로더가 LoaderInfo's progress event을 청취해야한다고 생각합니다. 실행을 중지 했으므로 ENTER_FRAME이 호출되지 않을 것이라고 생각합니다. 또한 AFAIR, 싱글 프레임 동영상은 플레이어가 특별히 처리하며 플레이어는 주기적으로 ENTER_FRAME을 보냅니다. 아마, 그것이 응용 프로그램을 테스트 한 이유 일 것입니다.

+0

흠. 글쎄, 아직도 조금 혼란스러워. 내가 프레임 하나에 코드를 추가하여 enter_frame이 호출되도록 할 수 있다고 생각하십니까? 내가 그게 최선의 방법 tho .... 모르겠어요 어딘가에 내가() 호출 할 수있는 문서 클래스 어딘가에있다; 대신에? – spaderdabomb

+0

ENTER_FRAME은 보통 초당 fps (일반적으로 30) 회 호출됩니다. 그 이벤트가 파견되면 진행 상황을 조사하는 데 사용할 수 있습니다.하지만 당신의 경우에는 의미 상으로 진행 이벤트를 청취해야합니다. – catholicon