2017-07-22 6 views
0

私はSnakeをコーディングしようとしていますが、少し問題があります。javascript - 変数を変更しない

var ctx = document.getElementById('ctx').getContext('2d'); 
 
var canvas = document.getElementById('ctx'); 
 

 
var y = [240, 230, 220]; 
 
var x = [240, 240, 240]; 
 

 
var xSpeed = 0; 
 
var ySpeed = 0; 
 

 
function load() { 
 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
 
    for (p = 0; p < x.length; p++) { 
 
     ctx.fillStyle = "black"; 
 
     ctx.fillRect(x[p], y[p], 10, 10); 
 
    } 
 
} 
 

 
function keyDown() { 
 
    var key = event.keyCode; /*getting keyCode of pressed key*/ 
 
    ctx.fillStyle = "black"; /*color of rectangle*/ 
 
    if (key == 39) { //RIGHT 
 
     var xSpeed = 10; 
 
     var ySpeed = 0; 
 
     console.log("right"); 
 
    } else if (key == 37) { //LEFT 
 
     var xSpeed = -10; 
 
     var ySpeed = 0; 
 
     console.log("left"); 
 
    } else if (key == 38) { //UP 
 
     var xSpeed = 0; 
 
     var ySpeed = -10; 
 
     console.log("up"); 
 
    } else if (key == 40) { //DOWN 
 
     var xSpeed = 0; 
 
     var ySpeed = 10; 
 
     console.log("down"); 
 
    } 
 
} 
 

 
function update() { 
 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
 
    /*if (x[0] >= 490) { 
 
     xSpeed = 0; 
 
    } else if (y[0] >= 490) { 
 
     ySpeed = 0; 
 
    }*/ 
 
    for (w = 0; w < x.length; w++) { 
 
     y[w] += ySpeed; 
 
     x[w] += xSpeed; 
 
    } 
 
    for (i = 0; i < x.length; i++) { 
 
     ctx.fillStyle = "black"; 
 
     ctx.fillRect(x[i], y[i], 10, 10); 
 
    } 
 

 
    console.log(xSpeed); 
 
    console.log(ySpeed); 
 
} 
 

 
setInterval(update, 500);
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <link rel="shortcut icon" href="#"> 
 
    <title>The Snake Game</title> 
 
</head> 
 
<style> 
 
    #ctx { 
 
     position: absolute; 
 
     /*it can be fixed too*/ 
 
     left: 0; 
 
     right: 0; 
 
     top: 0; 
 
     bottom: 0; 
 
     margin: auto; 
 
     /*this to solve "the content will not be cut when the window is smaller than the content":*/ 
 
     max-width: 100%; 
 
     max-height: 100%; 
 
     overflow: auto; 
 
    } 
 
</style> 
 

 
<body onkeydown="keyDown()" onload="load()"> 
 
    <center><canvas id="ctx" width="500" height="500" style="border:1px solid black"></canvas></center> 
 
</body> 
 
<script src="script.js"></script> 
 

 
</html>

あなたがコードを実行した場合、あなたは変数が& ySpeedが変更されていないxSpeedこと、が分かりました。私はラバーダッキーdebbugingを試みたが、私は何も見つかりませんでした。私は14歳なので、笑ってはいけません。 :Dアドバイスありがとうございます。トーマス

答えて

2

あなたは、変数は、それが唯一のローカル関数ではなく、それの外に見えるようになる前に、VARを追加する場合であれば

else if (key == 38) { //UP 
    xSpeed = 0; 
    ySpeed = -10; 
    console.log("up"); 
... 

内の変数の前にVARを削除する必要があります。ここで

はそれを書くためのより良い方法です:

function keyDown() { 
    var key = event.keyCode; /*getting keyCode of pressed key*/ 
    ctx.fillStyle = "black"; /*color of rectangle*/ 

    switch(key){   
     case 39: //RIGHT 
     xSpeed = 10; 
     ySpeed = 0; 
     console.log("right"); 
     break; 
    case 37: //Left 
     xSpeed = -10; 
     ySpeed = 0; 
     console.log("left"); 
     break; 
    case 38: // Up 
     xSpeed = 0; 
     ySpeed = -10; 
     console.log("up"); 
     break; 
    case 40: // Down 
     xSpeed = 0; 
     ySpeed = 10; 
     console.log("down"); 
    } 
} 

たり、ずっとずっと良い:

var speed= { 
     37: { 
      xSpeed : -10, 
      ySpeed : 0, 
      text: 'left' 
     }, 
     38: { 
      xSpeed : 0, 
      ySpeed = -0, 
      text: 'up' 
     }, 
     39: { 
      xSpeed : 10, 
      ySpeed = 0, 
      text: 'right' 
     }, 
     40: { 
      xSpeed : 0, 
      ySpeed = 10, 
      text: 'down' 
     } 
} 


function keyDown() { 
    var key = event.keyCode; /*getting keyCode of pressed key*/ 
    ctx.fillStyle = "black"; /*color of rectangle*/ 

    xSpeed = speed[key].xSpeed ; 
    ySpeed = speed[key].ySpeed ; 
    console.log(speed[key].text); 
} 
+0

VAR 『が、それはうまくいきませんでした。スイッチを追加した後、「 –

+0

は私が退治しようとしているあなたのコード – CodeWizard

+0

にいくつかのより多くの改善点を追加しました「』ありがとうございました仕事を始めましたので、もう一度あなたに感謝します。 –

0

関数の内部xSpeedySpeedの新しい値を割り当てるときvarキーワードを削除してください。関数内にvarキーワードを使用すると、その関数内でローカルな関数内に新しい変数が宣言されます。したがって、他の機能からアクセスすることも、その機能の外部からアクセスすることもできません。

var ctx = document.getElementById('ctx').getContext('2d'); 
 
var canvas = document.getElementById('ctx'); 
 

 
var y = [240, 230, 220]; 
 
var x = [240, 240, 240]; 
 

 
var xSpeed = 0; 
 
var ySpeed = 0; 
 

 
function load() { 
 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
 
    for (p = 0; p < x.length; p++) { 
 
     ctx.fillStyle = "black"; 
 
     ctx.fillRect(x[p], y[p], 10, 10); 
 
    } 
 
} 
 

 
function keyDown() { 
 
    var key = event.keyCode; /*getting keyCode of pressed key*/ 
 
    ctx.fillStyle = "black"; /*color of rectangle*/ 
 
    if (key == 39) { //RIGHT 
 
     xSpeed = 10; 
 
     ySpeed = 0; 
 
     console.log("right"); 
 
    } else if (key == 37) { //LEFT 
 
     xSpeed = -10; 
 
     ySpeed = 0; 
 
     console.log("left"); 
 
    } else if (key == 38) { //UP 
 
     xSpeed = 0; 
 
     ySpeed = -10; 
 
     console.log("up"); 
 
    } else if (key == 40) { //DOWN 
 
     xSpeed = 0; 
 
     ySpeed = 10; 
 
     console.log("down"); 
 
    } 
 
} 
 

 
function update() { 
 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
 
    /*if (x[0] >= 490) { 
 
     xSpeed = 0; 
 
    } else if (y[0] >= 490) { 
 
     ySpeed = 0; 
 
    }*/ 
 
    for (w = 0; w < x.length; w++) { 
 
     y[w] += ySpeed; 
 
     x[w] += xSpeed; 
 
    } 
 
    for (i = 0; i < x.length; i++) { 
 
     ctx.fillStyle = "black"; 
 
     ctx.fillRect(x[i], y[i], 10, 10); 
 
    } 
 

 
    console.log(xSpeed); 
 
    console.log(ySpeed); 
 
} 
 

 
setInterval(update, 500);
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <link rel="shortcut icon" href="#"> 
 
    <title>The Snake Game</title> 
 
</head> 
 
<style> 
 
    #ctx { 
 
     position: absolute; 
 
     /*it can be fixed too*/ 
 
     left: 0; 
 
     right: 0; 
 
     top: 0; 
 
     bottom: 0; 
 
     margin: auto; 
 
     /*this to solve "the content will not be cut when the window is smaller than the content":*/ 
 
     max-width: 100%; 
 
     max-height: 100%; 
 
     overflow: auto; 
 
    } 
 
</style> 
 

 
<body onkeydown="keyDown()" onload="load()"> 
 
    <center><canvas id="ctx" width="500" height="500" style="border:1px solid black"></canvas></center> 
 
</body> 
 
<script src="script.js"></script> 
 

 
</html>

関連する問題