2012-05-08 3 views
0

タイトルと同じように、私はAS3/Flashを初めて使い、ゲームの作り方を学びます。 私はGary Rosenzweigの "Flash Game University"(本とiTunesポッドキャストの両方)のチュートリアルに従っています。 私が使用しているコードはすべて上記のチュートリアルに由来していますが、私はそれらを作成しませんでした。私が問題を解決するために何をやろうとしたのかを簡単に説明しましょう。基本的に、私はチュートリアルコードを正確に使用していました(動きのために "catcher.x = mouseX"を使用しました)。マウスの代わりに左右の矢印キーを使ってプレイヤー(「キャッチャー」)を動かしてみたいと思っていましたが、マウスを置くと、動きが不安定になり、左右にスムーズに移動するのではなく、プレイヤーは左右にジャンプし、画面から飛び降りるまで速度を一定に保ちますが、どうしてこのようなことが起こるのかわかりません。AS3に新しく、プレーヤーを正しく動かすことができません

まず

は、私は私の矢印のコードベースの動きが間違っていたと思ったので、私はコピーして貼り付け、それを別のファイルにテストするために、それがうまく働いたので、私はいくつかの理由のためにゲームの残りの部分を作るコードをことを把握します仕事は何とかそれを壊していた。

私は別の場所にコードを移動しようとしましたが、問題を解決しませんでした(実際には、悪化させることがよくありました)。

私は自分のコードの書式設定に関して何か不足していると思います(残念なことに、私が見つけたチュートリアルのいずれも、AS3の適切なスタイルをカバーしていないため、以前のコーディング経験はありません。不愉快に乱雑/未編成)。最後の注意として

、私はこれまでかなり新しい私codeI'mの乱雑ために、事前に謝罪し、物事を把握しようとしています。

ご協力いただきありがとうございます。

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イベントハンドラをコンストラクタに追加します。

は自分moveObjects 機能でmoveCatcherを呼び出し、複数のENTER_FRAMEイベントハンドラを使用しないでください。

あなたは、私はそれを編集し、あなたの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

関連する問題