2011-03-07 41 views
0

所以我試圖從我的身體拍攝多顆子彈,除了我有一個奇怪的問題,只有一顆子彈出現並更新以設置新位置。 我有一個可以移動的玩家,它應該可以拍攝,我通過移動玩家和拍攝來測試此代碼。我正在一步一步地創造這個。多個影片剪輯都會轉到同一個地點;我究竟做錯了什麼?

跟蹤bulletContainer的結果正確計數,它告訴我movieclip被添加到舞臺上;我只知道它歸結爲即時遺忘的某種邏輯。

這裏是我的代碼(子彈它的自我是一個類)

UPDATE * 一切都在這個代碼工作正常,除了我前面所述的一些代碼似乎reduntned因爲我已經使出了不同的方法。

BulletGod類:

public class bulletGod extends MovieClip{ 
    //Register Variables 
     //~Global 
      var globalPath      = "http://127.0.0.1/fleshvirusv3/serverside/" 

     //~MovieCLips 
      var newBullet:bulletClass   = new bulletClass(); 

     //~Boolean 
      var loadingBulletInProgress:Number = 0; 
      var shootingWeapon:Number   = 0; 

     //~Timers 
      var fireBulletsInterval  = setInterval(fireBullets, 1); 
      var bulletFireEvent; 

     //~Arrays 
      var bulletArray:Array    = new Array(); 
      var bulletType:Array    = new Array(); 
      var bulletContainer:Array   = new Array(); 

     //~Networking 
      var netBulletRequest:URLRequest  = new URLRequest(globalPath+"bullets.php"); 
      var netBulletVariables:URLVariables = new URLVariables(); 
      var netBulletLoader:URLLoader  = new URLLoader();   

     //~Bullet Image Loader 
      var mLoader:Loader     = new Loader(); 
      var mRequest:URLRequest    = new URLRequest(); 

       public function bulletGod() { 
        //Load every bullet for every gun 

        //Compile data to be requested 
         netBulletVariables.act    = "loadBullets" 
         netBulletRequest.method   = URLRequestMethod.POST 
         netBulletRequest.data    = netBulletVariables; 
         netBulletLoader.dataFormat   = URLLoaderDataFormat.VARIABLES; 

         netBulletLoader.addEventListener(Event.COMPLETE, getBulletImages); 
         netBulletLoader.load(netBulletRequest); 

       } 

       private function getBulletImages(bulletImageData:Event){ 
        //Request every bullet URL image 

        //Set vars 
        var bulletData = bulletImageData.target.data; 

        //Load images 
        for(var i:Number = 0; i < bulletData.numBullets; i++){ 
         bulletArray.push(bulletData["id"+i.toString()]); 
         bulletType.push(bulletData["bullet"+i.toString()]); 
         //trace(bulletData["id"+i]+"-"+bulletData["bullet"+i]); 
        } 

        //All the arrays have been set start firing the image loader/replacer 
        var imageLoaderInterval = setInterval(imageReplacer, 10); 

       } 

       private function imageReplacer(){ 
        //Check to see which image needs replacing 
        if(!loadingBulletInProgress){ 
         //Begin loading the next image 
          //Search for the next "String" in the bulletType:Array, and replace it with an image 
          for(var i:Number = 0; i < bulletType.length; i++){ 
           if(getQualifiedClassName(bulletType[i]) == "String"){ 
            //Load this image 
             mRequest = new URLRequest(globalPath+"ammo/"+bulletType[i]); 
             mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadImage); 
             mLoader.load(mRequest); 

             //Stop imageReplacer() while we load image 
             loadingBulletInProgress = 1; 

             //Stop this for() loop while we load image 
             i = 999; 
           } 
          } 
        } 
       } 

       private function loadImage(BlackHole:Event){ 
        //Image has loaded; find which array slot it needs to go into 

        for(var i:Number = 0; i <= bulletType.length; i++){ 
         if(getQualifiedClassName(bulletType[i]) == "String"){ 
          //We found which array type it belongs to; now replace the text/url location with the actual image data 
          var tmpNewBullet:MovieClip = new MovieClip; 
           tmpNewBullet.addChild(mLoader); 

          //Add image to array 
           bulletType[i] = tmpNewBullet; 

          //Restart loadingBullets if there are more left 
           loadingBulletInProgress = 0; 

          //Stop for() loop 
          i = 999; 
         } 
        } 
       } 
//############################################################################################################################################### 
      private function fireBullets(){ 
       //If player is holding down mouse; Fire weapon at rate of fire. 
       if(shootingWeapon >= 1){ 
        if(bulletFireEvent == null){ 
         //Start shooting bullets 
         bulletFireEvent = setInterval(allowShooting, 500); 
        } 
       } 

       if(shootingWeapon == 0){ 
        //The user is not shooting so stop all bullets from firing 
        if(bulletFireEvent != null){ 
         //Strop firing bullets 
         clearInterval(bulletFireEvent); 
         bulletFireEvent = null 
        } 
       } 
      } 

      private function allowShooting(){ 
       //This function actually adds the bullets on screen 

       //Search for correct bullet/ammo image to attach 
        var bulletId:Number = 0; 
        for(var i:Number = 0; i < bulletArray.length; i++){ 
         if(bulletArray[i] == shootingWeapon){ 
          //Bullet found 
          bulletId = i; 

          //End For() loop 
          i = 999; 
         } 
        } 

       //Create new bullet 
         //Create Tmp Bullet 
         var tmpBulletId:MovieClip = new MovieClip 
          tmpBulletId.addChild(newBullet); 
          tmpBulletId.addChild(bulletType[bulletId]); 
         //Add To Stage 
          addChild(tmpBulletId) 
          bulletContainer.push(tmpBulletId); //Add to array of bullets 

       //Orientate this bullet from players body 
         var bulletTmpId:Number = bulletContainer.length 
          bulletTmpId--; 
          bulletContainer[bulletTmpId].x = Object(root).localSurvivor.x 
          bulletContainer[bulletTmpId].y = Object(root).localSurvivor.y 

          //addChild(bulletContainer[bulletTmpId]); 
      } 


      //_______________EXTERNAL EVENTS_______________________ 
       public function fireBullet(weaponId:Number){ 
        shootingWeapon = weaponId; 
       } 

       public function stopFireBullets(){ 
        shootingWeapon = 0; 
       } 
    } 

} 

BulletClass:

package com{ 
     import flash.display.* 
     import flash.utils.* 
     import flash.net.* 
     import flash.events.* 
    public class bulletClass extends MovieClip { 
      public var damage:Number = 0; 

     public function bulletClass() { 
      //SOME MOVEMENT CODE HERE 
     } 

     public function addAvatar(Obj:MovieClip){ 
      this.addChild(Obj); 
     } 

    } 

} 
+0

你需要告訴我們這個代碼在哪裏執行,它在文檔類中嗎?「這個」是指舞臺嗎?爲什麼要將newBullet對象添加到tmpBulletId MovieClip? – 2011-03-07 13:29:40

+0

另外,需要知道bulletClass中的內容。也許它與其他子彈類共享其子女? – Roy 2011-03-07 14:07:59

+0

感謝您的輸入!繼承人的設置..我有一個主舞臺,它將「子彈頭」課程引入主舞臺。在bulletGod中:它要求來自服務器的子彈圖像將其附加到具有ID#的相關陣列(因此子彈將與動態加載的槍匹配)。然後我有一個功能,每100ms循環,如果玩家正在拍攝它會吐出子彈(我們現在正在) – Xenland 2011-03-07 21:44:38

回答

0

至於我已經expirienced它你可以添加到特定子只有一個MovieClip對象的副本。最佳方法是使用ByteArray作爲剪輯源,並實例化新的MovieClip並將ByteArray作爲源傳遞。它與子/父關係有關,因爲DisplayObject只能有一個父對象(也可以將對象從場景中分離出來)。

+1

他實例化一個新的動畫片段,所以它不是添加相同的動畫片段。這似乎不是問題。 – Roy 2011-03-07 14:07:04

1

那麼......如果我可以這樣說,這段代碼看起來相當不對。代碼中缺少某些東西,或者此代碼永遠不會讓子彈飛行。

首先,你可以設置新的子彈的X和Y直接(取代一切後「定向從玩家身上這種子彈」與此):

tmpBulletId.x = Object(root).localSurvivor.x; 
tmpBulletId.y = Object(root).localSurvivor.y; 

或許這已經幫助,但你的代碼中有應該已經這樣做了。

但讓這些子彈飛成任何方向,你還需要添加一個事件監聽器,像這樣:

tmpBulletId.addEventListener(Event.ENTER_FRAME, moveBullet); 

function moveBullet(e:Event) { 
    var movedBullet:MovieClip = MovieClip(e.currentTarget); 
    if (movedBullet.x < 0 || movedBullet.x > movedBullet.stage.width || 
     movedBullet.y < 0 || movedBullet.y > movedBullet.stage.height) { 

     // remove move listener, because the bullet moved out of stage 
     movedBullet.removeEventListener(Event.ENTER_FRAME); 
    } 
    // remove the comment (the //) from the line that you need 
    MovieClip(e.currentTarget).x += 1; // move right 
    // MovieClip(e.currentTarget).y -= 1; // move up 
    // MovieClip(e.currentTarget).x -= 1; // move left 
    // MovieClip(e.currentTarget).y += 1; // move down 
} 

這個例子可以讓你的子彈飛向右。如果你需要它飛向另一個方向,只需用「向右移動」評論註釋掉行,並取消註釋其他行之一。

這當然是一個非常簡單的例子,但它應該讓你開始。

我希望這會有所幫助,而且我的回答並不是問題的錯誤答案。

+0

感謝您的輸入,但子彈類一旦啓動就會自我移動,我必須做的就是輸入旋轉並關閉它,但無論哪種方式,我只會張貼與理解問題相關的重要部分。 – Xenland 2011-03-07 21:43:58

+0

好吧,現在我看到你發佈你的原始代碼。好吧,好吧,我也看不到那裏的錯誤。如果您在bulletClass中創建子彈移動代碼,並且只使用「this」更新bulletClass實例的位置,那麼它應該可以工作。否則,我不知道什麼可能是錯的,因爲子彈的位置基本正確。 – Enduriel 2011-03-08 12:56:25

0

那麼我結束了第三次從零開始編寫整個代碼,並遇到類似的問題,只是爲了參考任何其他人來到一個問題,這是隨機的,因爲這一個我發現這個問題似乎沒有轉換錯誤的地方不一定會破壞任何編譯規則。只是我在調用一個動畫片段而不是它自己的類。