2016-04-22 4 views
1

Ich benutze ein einfaches Leinwandlayout und versuche herauszufinden, wie ich ein Pong-Skript so modifizieren kann, dass es bei jedem Treffer die Farbe des Balls in Rot ändert zu paddeln und blau jedes Mal, wenn es fehlt.Ändere die Farbe des Kreises in HTML Canvas Pong Animation auf dem Paddel Hit

Der Leinwand-Setup ist die gleiche wie auf dieser Webseite:

Informit Canvas for Gaming

ich Context.strokeStyle bin mit der Farbe zu ändern, aber es funktioniert nicht in Zusammenhang ich es aufgegeben habe.

Hier ist mein Code:

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 für pong Elemente auf Leinwand:

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 
}); 

Antwort

2

Sie wurden öffnen und schließen nur fehlt auf {} Klammern Ihre else, siehe Geige: https://jsfiddle.net/5wwg1q5j/61/

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

Wow. Bin ich wirklich so dumm? –

+0

Danke für die schnelle Lösung. Ich kann nicht glauben, dass ich das verpasst habe! –

1

Ich würde gerne die bereits zur Verfügung gestellte Antwort und die Kommentare von OP darunter hinzufügen.

Die häufigste Fehlerquelle beim Programmieren einer Sprache sind syntaktische Fehler, die Kompilierung oder Parsing passieren können. Javascript ist besonders anfällig für diese Art von Fehler aufgrund seiner nicht deklarativen Art. Das bedeutet, dass Sie Variablen, Objektstrukturen und Funktionen nicht deklarieren müssen und dass diese Variablentypen nicht explizit definiert werden müssen.

Um die OP nicht überrascht sein, dass Sie diesen Bug verpasst haben, ist es so leicht zu übersehen, vor allem, wenn der Schwerpunkt auf der Logik des Codes ist, anstatt die Syntax. Ich werde auch sagen, dass dies nicht das letzte Mal sein wird, dass derselbe Syntaxfehler Sie frustrieren wird.

Der beste Weg, um Syntaxfehler zu begrenzen, ist der konsistente Stil.

Wenn Sie 100s und 1000s Codezeilen haben und Ihr Stil über das ganze Ding variiert, wird es sehr schwierig, diese Arten von Fehlern zu sehen, geschweifte Klammern sind in der Masse der Zeichen besonders schwer zu sehen, umso mehr wenn Sie Einzug manchmal und nicht andere, oder fügen Sie die geschweifte Klammer in einer neuen Zeile manchmal und nicht andere. Mit Konsistenz im Stil und etwas Erfahrung wird ein Bug wie dieser auffallen und schnell entdeckt werden.

Für Javascript gibt es eine Vielzahl von Code-Qualitätstools, die Ihnen mit Stil helfen. JSLint und JSHint sind zwei Beispiele und viele Editoren haben diese Tools oder ähnliches eingebaut. Von größerer Bedeutung als die Verwendung solcher Tools ist das Verständnis der Regeln, die sie anwenden und warum sie sie anwenden. Sie verbessern nicht die Qualität des Codes in Bezug auf Logik oder Leistung, sondern reduzieren Bugs und machen Bugs leichter zu erkennen.

Für die OP (und jeder für diese Angelegenheit) Ich werde vorschlagen, dass Sie immer die Tatsache vergessen, dass Javascript Sie if die geschweifte Klammer fallen können, else, for, while und do (Das gleiche gilt für C gilt/C++ Java und ähnliche Sprachen)

wieder

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

Einige für Notwendigkeit der Kürze haben den Stil angenommen, dass einzelne Zeile Bedingungen auf der gleichen Linie folgen müssen

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

oder

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

Dies ist ein Stil, der es leicht zu erkennen macht, wenn Sie zusätzliche Codes innerhalb der Bedingung hinzugefügt haben. Dies kann jedoch unordentlich werden, wenn die Anweisung für die Bedingung lang ist und Sie bereits tief in eingerücktem Code sind. haben geschweiften Klammern ohne Ausnahme wie

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; 

Oder wenn Sie viele einzelne Zeile Bedingungen verschachtelt

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

persönlich für den Schmerz von zwei zusätzlichen Zeichen meine Regel immer. Wenn Sie dieser Regel folgen, werden Sie nie wieder den Fehler haben, den Sie hatten.

Ich bemerkte auch, dass Sie nicht übereinstimmen, wo Sie die geschweifte Klammer platzieren. Manchmal in derselben Zeile, manchmal in der neuen Zeile.

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

und dann

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

Dies wird auch bei der Herstellung von Bugs härter am Ende, da zu finden, wenn Sie nicht eine Klammer auf der Linie erwartet, dass es übersehen werden kann. Wählen Sie einen Stil und bleiben Sie bei diesem Stil für das gesamte Projekt.

Mit ein wenig Aufwand in die Entwicklung Ihres persönlichen Kodierungsstils und Konsistenz werden Sie mehr Zeit mit dem Schreiben von produktivem Code verbringen, anstatt frustrierende Bugs zu jagen.

+1

Verwenden Sie eine IDE, vielleicht sogar eine IDE, die Ihre Programmiersprache (n) versteht ... und wenn Sie keine IDE verwenden, die automatisch schließt '])}' dann geben Sie diese Closers bei der Eingabe von '[({'. Andernfalls werden Ihre "fehlenden" Fehler oft ärgerlicherweise weiter unten im Code gemeldet, nachdem der Compiler einen unbeabsichtigten Closer gefunden hat. – markE

Verwandte Themen