2016-04-22 7 views
1

私は単純なキャンバスレイアウトを使用しています。ヒットするたびにボールの色が赤に変わるようにpongスクリプトを変更する方法を理解しようとしていますそれを逃すたびにパドルとブルーに。HTMLキャンバスでサークルの色を変更するPong Animation on Paddleヒット

キャンバスのセットアップは、このWebページ上と同じです:

Informit Canvas for Gaming

私は色を変更するContext.strokeStyleを使用していますが、それは私がそれを配置したコンテキストで動作していません。ここで

は私のコードです:

HTML:

<HTML> 
<BODY> 
    <canvas id="myCanvas" width="600" height="600" style="border:1px solid #000000;" /> 
    <script src="JQuery.js"></script> 
    <script src="scripts.js"></script> 
</BODY> 

Javascriptをキャンバス上にピンポン要素に対して:

var Main = {};          // scope a (global) main object 

Main.Canvas = document.getElementById('myCanvas');     // 600 x 600 canvas (per HTML) 
Main.Context = Main.Canvas.getContext('2d');       
Main.MX = 0;          // keep track of X mouse position 
Main.MY = 0;  

Main.CX = 395; 
Main.CY = 150;  
Main.CRAD = 20; 

Main.XINC = 1; 
Main.YINC = 1; 
Main.OFFSET = 1;  

Main.HITS = 0; 
Main.MISSES = 0; 

// keep track of mouse movements 
Main.Canvas.onmousemove = function(event) 
{ 
    if (event.offsetX) 
    { 
     mouseX = event.offsetX; 
     mouseY = event.offsetY; 
    } 
    else if (event.layerX) 
    { 
     mouseX = event.layerX; 
     mouseY = event.layerY; 
    } 

    Main.MX = mouseX; 
    Main.MY = mouseY; 
} 

Main.Animate = function() 
{ 
    Main.Context.clearRect(0, 0, Main.Canvas.width, Main.Canvas.height);  // clear entire canvas 
              // upper left X & Y coordinates, width & height 

    // Draw Rectangle 
    Main.Context.fillStyle = "#FF0000";       // color red 
    Main.Context.fillRect(0, Main.MY, 25, 50);     // position and size (follow mouse) 

    // Draw Circle 
    Main.Context.beginPath();       // start the circle 

    // When ball crosses the paddle width, 
    // check to see if paddle intersects path 
    if ((Main.CX-Main.CRAD == 25) && (Main.XINC == -1)) { 

     // if ball hits paddle, change increment (both X & Y) and change color of circle 
     if ((Main.CY>Main.MY) && (Main.CY<(Main.MY+50))){ 

      Main.XINC = Main.XINC * (-1); 
      Main.YINC = Main.YINC * (-1); 

      Main.HITS = Main.HITS + 1; 
      Main.Context.beginPath(); 
      Main.Context.strokeStyle = 'red'; 

     } else Main.MISSES = Main.MISSES + 1; 
     Main.Context.beginPath(); 
      Main.Context.strokeStyle = 'blue'; 

    } 

    // If we hit a wall in x coordinate, then change x direction 
    if ((Main.CX < 0+Main.CRAD) || (Main.CX > 600-Main.CRAD)) 
     Main.XINC = Main.XINC * (-1); 
    Main.CX = Main.CX + (Main.XINC);  

    // If we hit a wall in y coordinate, then change y direction 
    if ((Main.CY < 0+Main.CRAD) || (Main.CY > 600-Main.CRAD)) 
     Main.YINC = Main.YINC * (-1); 
    Main.CY = Main.CY + Main.YINC; 

    Main.Context.arc(Main.CX, Main.CY, Main.CRAD, 0, 2 * Math.PI);   // draw the circle 
    Main.Context.stroke();        // fill the circle 

    // Display the location of the mouse and circle 
    Main.Context.font = "10px Arial"; 
    Main.Context.fillText("Mouse: X: " + Main.MX + " Y: " + Main.MY, 50, 25); 
    Main.Context.fillText("Ball: X: " + Main.CX + " Y: " + Main.CY, 350, 25); 

    // Display the score 
    Main.Context.font = "30px Arial"; 
    Main.Context.fillText("Hits: " + Main.HITS + " Misses: " + Main.MISSES, 50, 100); 

    requestAnimFrame(function() { Main.Animate(); });    // must call at end of Main.Animate (recursive) 
} 

window.requestAnimFrame = (function(callback)      // part of sample standard framework      
{           // for browser compatibilty 
    return window.requestAnimationFrame 
    || window.webkitRequestAnimationFrame 
    || window.mozRequestAnimationFrame 
    || window.oRequestAnimationFrame 
    || window.msRequestAnimationFrame 
    || function(callback) { window.setTimeout(callback, 1000/60); };  // control repainting speed 
})(); 

$(document).ready(function()        // called when document loads 
{ 
    Main.Animate();         // this method is all that executes here 
}); 

答えて

2

あなただけのオープンとクローズ{}ブラケットを欠落していましたあなたのelse、フィドル:https://jsfiddle.net/5wwg1q5j/61/

else{ 
     Main.MISSES = Main.MISSES + 1; 
     Main.Context.beginPath(); 
     Main.Context.strokeStyle = 'blue'; 
} 
+0

ワウ。私は本当にこのばか? –

+0

クイックフィックスをお寄せいただきありがとうございます。私はそれを逃したと信じられない! –

1

私はすでに提供された回答と以下のOPのコメントに追加したいと思います。

言語をプログラミングする際の最も一般的なバグの原因は、コンパイルまたは解析に合格できる構文エラーです。 Javascriptは、宣言的でゆるやかに型付けされた性質であるため、このタイプのエラーに特に脆弱です。つまり、変数、オブジェクト構造、関数を宣言する必要はなく、変数の型を明示的に定義する必要はありません。

OPに、そのバグを逃したことに驚くことはありません。特に、構文ではなくコードのロジックに焦点を当てている場合は、見落とすのが簡単です。また、この同じ構文バグがあなたを苛立たせてしまうのは、これが最後ではないとも言います。

シンタックスバグを制限する最良の方法は、一貫したスタイルです。

100行目と1000行目のコード行があり、スタイルが全体的に異なる場合、これらのタイプのエラーを見るのが非常に難しくなります。中括弧は文字の大部分で特に見えにくく、あなたは時々インデントし、他の人はインデントしません。また、新しい行に中かっこを追加することもあります。スタイルの一貫性といくつかの経験で、このようなバグが目立ち、すぐに発見されます。

Javascriptには、スタイルに役立つさまざまなコード品質ツールがあります。 JSLintJSHintは2つの例であり、多くのエディタにこれらのツールなどが組み込まれています。このようなツールを使用するより重要なのは、適用するルールとその適用理由を理解することです。彼らは、ロジックやパフォーマンスの面でコードの品質を向上させるものではなく、バグを減らしてバグを見つけやすくします。OP(およびそのことについては誰も)については

私はあなたが永遠にJavascriptがあなたが(同じCについても同様ifelseforwhile、およびdoために波括弧をドロップすることを可能にするという事実を忘れていることを提案します/ C++、Javaと似た言語)

再び簡略化の必要性のために

if(foo === bar) 
    callThat(); 

一部を行うことはありません、単一のライン条件が同じ行

に従わなければならないというスタイルを採用しています
if(foo === bar) callThat(); 

または

while(!stream.eof) buff.push(stream.read); 

これは、条件内の余分なコードを追加している場合は見つけることが容易になり一つのスタイルです。条件のステートメントが長く、インデントされたコードに深く関わっている場合、これは面倒になることがあります。このよう

if((foo !== bar && foo <== poo && foo > that && what !== how) || cows === cud || day !== night || black == white) return (((u1/r1) * (r1 * r1 * m1 - r2 * r2 * m2) + 2 * r2 * r2 * m2 * (u2/r2))/(r1 * r1 * m1 + r2 * r2 * m2)) * r1; 

として、あるいは場合、あなたは多くの単一回線の状態個人的に私のルールは常には例外なく中括弧を持ってある2つの余分な文字の痛みのための

if(foo !== bar) if(foo <== poo) if(foo > that) if(what !== how) if(cows === cud || day !== night || black == white) return sunshine(); 

を入れ子にしています。あなたがそのルールに従えば、あなたが持っていたバグはもう決して起こりません。

また、中括弧を配置する場所に矛盾していることに気付きました。時には同じ行の新しい行にあることもあります。

if(foo === bar) 
{ 
    doThat(); 
} 

、その後

if(bar === foo){ 
    doThat() 
} 

あなたはそれを見過ごすことができ行にブレースを期待されていない場合ので、これはまた、見つけるのがバグが難しくなってになってしまいます。 1つのスタイルを選択し、そのスタイルをプロジェクト全体に適用します。

あなたの個人的なコーディングスタイルを開発して一貫性を持たせるために、ちょっと不満なバグを追跡するのではなく、生産的なコードを書く時間を増やします。

+1

あなたのコーディング言語を理解しているIDEでも、IDEを使用してください。もしIDEを使用していない場合は、 '')} ''を自動的に追加します。 '[({'そうでなければ、あなたの "欠けている"エラーは、コンパイラが意図しないクローズを見つけた後で、コードの下に耳障りに報告されることがよくあります。 – markE

関連する問題