2012-05-08 33 views
0

就像標題所說,我是AS3/Flash的新手,想要學習如何製作遊戲。 我一直在關注加里羅森茨維格的「Flash遊戲大學」(本書和iTunes播客)的教程。 作爲一個免責聲明,我使用的所有代碼都來自上面提到的教程,我沒有創建它們,我只是將它們拼接在一起,嘗試以不同的方式做出不同的事情。代碼,讓我簡單地解釋一下我的問題以及我試圖解決的問題。基本上,當我使用教程代碼EXACTLY(它使用「catcher.x = mouseX」進行移動)時,我的遊戲運行良好,但是我想試着讓玩家(「捕手」)用左右箭頭鍵而不是鼠標移動,但是當我插入時,移動變得不穩定,而不是順暢地左右移動,玩家會左右跳躍,不斷增加速度直到它跳出屏幕。不用說,我不知道它爲什麼這樣做。AS3的新手,無法讓玩家正常移動

起初,我認爲我的基於箭頭的移動代碼是錯誤的,所以我複製並將其粘貼到單獨的文件中進行測試,並且它工作正常,所以我認爲出於某種原因使得遊戲剩餘部分的代碼工作以某種方式打破了它。

我試着將代碼移到不同的地方,但這並沒有解決問題(事實上,它往往使情況變得更糟)。

我覺得我在格式化代碼方面缺少了一些東西(不幸的是,我發現沒有找到適合AS3的教程,並且我沒有任何先前的編碼經驗,所以我的代碼很可能令人討厭的混亂/無組織)。

作爲最後一點,我提前表示道歉,因爲我的代碼很混亂,我只是想知道這件事而已。

任何幫助非常感謝,並感謝您花時間閱讀此!

package { 
    import flash.display.*; 
    import flash.events.*; 
    import flash.utils.Timer; 
    import flash.utils.getDefinitionByName; 


    public class CatchingGame1 extends MovieClip { 
     var catcher:Catcher; 
     var nextObject:Timer; 
     var objects:Array = new Array; 
     const speed:Number = 7.0; 
     var score:int = 0; 
     var leftArrow:Boolean = false; 
     var rightArrow:Boolean = false; 

     public function CatchingGame1() { 
      catcher = new Catcher(); 
      catcher.y = 350; 
      addChild(catcher); 
      setNextObject(); 
      addEventListener(Event.ENTER_FRAME,moveObjects); 

     } 

     public function setNextObject() { 
      nextObject = new Timer(Math.random()*1000,1); 
      nextObject.addEventListener(TimerEvent.TIMER_COMPLETE,newObject); 
      nextObject.start(); 
     } 

     public function newObject(e:Event) { 
      var goodObjects:Array = ["Circle1","Circle2"]; 
      var badObjects:Array = ["Square1","Square2"]; 
      if(Math.random() < .5) { 
       var r:int = Math.floor(Math.random()*goodObjects.length); 
       var classRef:Class = getDefinitionByName(goodObjects[r]) as Class; 
       var newObject:MovieClip = new classRef(); 
       newObject.typestr = "good"; 
      } else { 
       r = Math.floor(Math.random()*badObjects.length); 
       classRef = getDefinitionByName(badObjects[r]) as Class; 
       newObject = new classRef(); 
       newObject.typestr = "bad"; 
      } 
      newObject.x = Math.random()*500; 
      addChild(newObject); 
      objects.push(newObject); 
      setNextObject(); 
     } 

     public function moveObjects(e:Event) { 
      for(var i:int=objects.length-1; i>=0;i--) { 
       objects[i].y += speed; 
       if(objects[i].y > 400) { 
        removeChild(objects[i]); 
        objects.splice(i,1); 
       } 
       if(objects[i].hitTestObject(catcher)) { 
        if(objects[i].typestr == "good") { 
         score += 5; 
        } else { 
         score -= 1; 
        } 
        if(score < 0) score = 0; 
        scoreDisplay.text = "Score: " + score; 
        removeChild(objects[i]); 
        objects.splice(i,1); 

       } 
      } 
      //this is where it starts to have problems 

      //make arrow booleans true 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp); 
     stage.addEventListener(Event.ENTER_FRAME, moveCatcher); 
      function keyPressedDown(Event:KeyboardEvent){ 
       if (Event.keyCode == 37){ 
        leftArrow = true; 
       } else if (Event.keyCode == 39){ 
        rightArrow = true; 
       } 

      } 

      function keyPressedUp(event:KeyboardEvent) { 
       if(event.keyCode == 37){ 
        leftArrow = false; 
       } else if(event.keyCode == 39){ 
        rightArrow = false; 
       } 
      } 
       function moveCatcher(event:Event) { 
        var catcherSpeed:Number = 1; 
        if(leftArrow){ 
         catcher.x -= catcherSpeed; 
        } 
        if(rightArrow){ 
         catcher.x += catcherSpeed; 
        } 
       } 



     } 

    } 
} 

回答

0

將keyUp,keyDown事件處理程序添加到您的構造函數中。

不要使用多個ENTER_FRAME事件處理程序,只需在moveObjects 函數中調用moveCatcher即可。

你好像在你的moveObjects方法的末尾有一個缺失},我編輯了它。看看是否有幫助。

package { 
import flash.display.*; 
import flash.events.*; 
import flash.utils.Timer; 
import flash.utils.getDefinitionByName; 


public class CatchingGame1 extends MovieClip { 
    var catcher:Catcher; 
    var nextObject:Timer; 
    var objects:Array = new Array; 
    const speed:Number = 7.0; 
    var score:int = 0; 
    var leftArrow:Boolean = false; 
    var rightArrow:Boolean = false; 

    public function CatchingGame1() { 
     catcher = new Catcher(); 
     catcher.y = 350; 
     addChild(catcher); 
     setNextObject(); 

     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp); 

     addEventListener(Event.ENTER_FRAME,moveObjects); 

    } 

    public function setNextObject() { 
     nextObject = new Timer(Math.random()*1000,1); 
     nextObject.addEventListener(TimerEvent.TIMER_COMPLETE,newObject); 
     nextObject.start(); 
    } 

    public function newObject(e:Event) { 
     var goodObjects:Array = ["Circle1","Circle2"]; 
     var badObjects:Array = ["Square1","Square2"]; 
     if(Math.random() < .5) { 
      var r:int = Math.floor(Math.random()*goodObjects.length); 
      var classRef:Class = getDefinitionByName(goodObjects[r]) as Class; 
      var newObject:MovieClip = new classRef(); 
      newObject.typestr = "good"; 
     } else { 
      r = Math.floor(Math.random()*badObjects.length); 
      classRef = getDefinitionByName(badObjects[r]) as Class; 
      newObject = new classRef(); 
      newObject.typestr = "bad"; 
     } 
     newObject.x = Math.random()*500; 
     addChild(newObject); 
     objects.push(newObject); 
     setNextObject(); 
    } 

    public function moveObjects(e:Event) 
    { 
     moveCatcher(null); 
     for(var i:int=objects.length-1; i>=0;i--) 
     { 
      objects[i].y += speed; 
      if(objects[i].y > 400) 
      { 
       removeChild(objects[i]); 
       objects.splice(i,1); 
      } 
      if(objects[i].hitTestObject(catcher)) 
      { 
       if(objects[i].typestr == "good") 
       { 
        score += 5; 
       } else { 
        score -= 1; 
       } 
       if(score < 0) score = 0; 
       scoreDisplay.text = "Score: " + score; 
       removeChild(objects[i]); 
       objects.splice(i,1); 

      } 
     } 
    } 

     function keyPressedDown(Event:KeyboardEvent){ 
      if (Event.keyCode == 37){ 
       leftArrow = true; 
      } else if (Event.keyCode == 39){ 
       rightArrow = true; 
      } 

     } 

     function keyPressedUp(event:KeyboardEvent) { 
      if(event.keyCode == 37){ 
       leftArrow = false; 
      } else if(event.keyCode == 39){ 
       rightArrow = false; 
      } 
     } 
      function moveCatcher(event:Event) { 
       var catcherSpeed:Number = 1; 
       if(leftArrow){ 
        catcher.x -= catcherSpeed; 
       } 
       if(rightArrow){ 
        catcher.x += catcherSpeed; 
       } 
      } 



    } 

} 
} 
+0

非常感謝! – RealNamrettel