2012-02-03 9 views
0

私は卓球の試合でAIを作ろうとしていますが、AIがコントロールするパドルは、ボールを打ちようとしているときに大きく揺れます。あなたがここに完全なコードの.zipファイルを見つけることができます私のポンのAIがあまりにもジッタが多いのはなぜですか?

function calculateAI() { 
if (paddleA.AI) { 
    if (ball.x + (ball.width/2) <= ctx.canvas.width * 0.4 && ball.directionX == -1) { 
     if (ball.y + (ball.height/2) >= paddleA.y + (paddleA.height + paddleA.heightModifier * 0.75) && paddleA.y + paddleA.height + paddleA.heightModifier < ctx.canvas.height) { 
      paddleA.y += paddleA.speed + paddleA.speedModifier; 
     } 
     else if (ball.y + (ball.height/2) <= paddleA.y + (paddleA.height + paddleA.heightModifier * 0.25) && paddleA.y > 0) { 
      paddleA.y -= paddleA.speed + paddleA.speedModifier; 
     } 
    } 
    else { 
     if (paddleA.y + ((paddleA.height + paddleA.heightModifier)/2) <= (ctx.canvas.height/2) - 50 && paddleA.y + paddleA.height + paddleA.heightModifier < ctx.canvas.height) { 
      paddleA.y += paddleA.speed + paddleA.speedModifier; 
     } 
     else if (paddleA.y + ((paddleA.height + paddleA.heightModifier)/2) >= (ctx.canvas.height/2) + 50 && paddleA.y > 0) { 
      paddleA.y -= paddleA.speed + paddleA.speedModifier; 
     } 
    } 
} 
} 

:ここ

は私のコードのAIセクションで http://dl.dropbox.com/u/23225581/Pong.zip

私の質問を、私はこのようにAIを再構築できる方法でありますあまりジッタがないのですか?誰かが一般的にAIのための他の提案を持っている場合、私はそれらを聞くのが大好きです。

+0

は、HTML5で疑似ダブルバッファリングを見てください。 http://stackoverflow.com/questions/2795269/does-html5-canvas-support-double-buffering – xbonez

+1

@xbonezこれは、AIがジッ​​タをつけている理由とは無関係です。私はそれがレンダリング中にキャンバスがちらつくのではなく、パドルが速く動くことと関係していることを知っています。 –

答えて

3

私はAIがボールをよりスムーズに追いかけるようにしたいと思っています。ここではいくつかの提案があります:パドルがボールの近くにある

移動ゆっくりとき

は、AIの速度はボールが2の速度で移動している場合は8であると言う、パドルは8飛び降りるべきではありません、その後、元に戻ってください。代わりに、ボールの位置に合わせてyの位置を設定します。

はそれが本当にあなたはこれをすでに実施していること、そして私は気付かなかった

に必要がある場合にパドルだけでボールを追いかけてください。基本的に、ボールがパドルの端に当たったら、動かないでください。

私はあなたのコードこれらの事を行うためのビットを改訂しました:

function calculateAI() { 
if (paddleA.AI) { 

    //ball's x position 
    var bx = ball.x + (ball.width/2); 

    //Get half he paddle's height and its y position 
    var hD2 = (paddleA.height + paddleA.heightModifier)/2; 
    var py = paddleA.y; 

    //speed 
    var speed = paddleA.speed + paddleA.speedModifier; 

    //by is either the center of the screen or the ball's y position, 
    //depending on what the paddle wants to do. 
    var by = ctx.canvas.height/2; 
    if (bx <= ctx.canvas.width * 0.4 && ball.directionX == -1) { 
     by = ball.y + (ball.height/2) - hD2; 
    } 

    //Attempt to move toward 'by' (if I 'have' to) 
    if (by > py+hD2) { 

     //Jump to position if close enough 
     //(Commented out to retain speed) 
     /* 
     if(by - speed < py) 
      py = by; 
     else 
     */ 
      py += speed; 

    } 
    else if (by < py-hD2) { 

     //Jump to position if close enough 
     //(Commented out to retain speed) 
     /* 
     if(by + speed > py) 
      py = by; 
     else 
     */ 
      py -= speed; 
    } 

    //Border range check goes here 


    paddleA.y = py; 
} 
} 

それは不完全だが、すべてが動作するはずです。

よりピンポンAIのアイデアについて、あなたは私のピンポンゲームにソースをチェックアウトすることができます:http://jsweeneydev.net84.net/apps.php

http://jsweeneydev.net84.net/apps/pong/game/script.js

+0

これはまさに私が望んでいたようです!コードを少しテストしたら、私は答えを受け入れるでしょう。 –

+1

何か問題があれば教えてください(ここには2つの可能性があります:パドルが真ん中には行かず、上/下の境界を越えることができます)。コードは本当に単なる例であり、私たちは異なるコーディングスタイルを持っているので、好きなようにそれを再プログラムしたいかもしれません;) –

+0

これは完全に動作しますが、2つの追加要求があります。 1.パドルのスピードを変更するパワーアップがあるので、スピードを変えずにパドルがこれを行うことができるようにします。 AIが通常​​通り減速することができないということは、プレイヤーができないので意味があります。 2. AIがパワーアップを2番目の優先順位にするようにします(ボールがパドルの40%の範囲内にない場合)。私はこれらのことを達成するために何ができるのか考えていますか? –

関連する問題