2017-06-03 2 views
0

ok。 jsを最初に読み込むにはキャンバスが必要ですが、jsには最初に読み込まれたキャンバスが必要です。ここでは、コードです:HTMLにjsとcanvasの両方がロードされている必要があります

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 

</head> 
<body> 
    <center><canvas onmousemove="update_loc(event)" width="400" 
height="400" id="myCanvas" style="border: 1px solid; border-color: 
#000000"></canvas></center> 
    <script src="./js.js"></script> 
</body> 
</html> 

そして、私のJS:

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

function gen_line(point1, point2) { 
    var x = point1.x; 
    var y = point1.y; 
    var z = point1.z; 
    var x2 = point2.x; 
    var y2 = point2.y; 
    var z2 = point2.z; 
    var points = []; 
    if (x === x2) { 
    // manual array gen 
    } else { 
    var slope = (z - z2)/(x - x2); 
    if (slope < 0) { 
     x = point2.x; 
     y = point2.y; 
     z = point2.z; 
     x2 = point1.x; 
     y2 = point1.y; 
     z2 = point1.z; 
     var slope = (z - z2)/(x - x2); 
     console.log("hi"); 
    } 
    if (slope <= 1) { 
     var z_intercept = z - slope * x; 
     for (var x = x + 1; x < x2; x++) { 
     points.push(new Point(x, 0, x * slope + z_intercept)); 
     } 
    } else { 
     slope = (x - x2)/(z - z2); 
     var x_intercept = x - slope * z; 
     for (var z = z + 1; z < z2; z++) { 
     points.push(new Point(z * slope + x_intercept, 0, z)); 
     } 
    } 
    } 
    return points; 
} 

var Face = function (a, b, c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

Face.prototype.generate = function() { 
    return this.get_lines().concat(this.get_points()); 
}; 

Face.prototype.get_lines = function() { 
    var v = this.get_points(); 
    var points = gen_line(v[0], v[1]); 
    return points; 
}; 

Face.prototype.get_points = function() { 
    return [this.a, this.b, this.c] 
}; 

Face.prototype.draw = function() { 
    var v = this.generate(); 
    for (var i = 0; i < v.length; i++) { 
    v[i].draw(); 
    } 
}; 

var Point = function (x, y, z) { 
    this.x = Math.round(x); 
    this.y = Math.round(y); 
    this.z = Math.round(z); 
} 

Point.prototype.draw = function() { 
    ctx.fillStyle = "#FF0000"; 
    ctx.fillRect(this.x * 20, this.z * 20, 20, 20); 
}; 

var faces = [new Face(new Point(5, 0, 2), new Point(2, 0, 5), new 
Point(1, 0, 10))]; 

function update_loc(event) { 
    faces = [new Face(new Point(Math.round(event.clientX/20), 0, 
Math.round(event.clientY/20), new Point(2, 0, 5), new Point(1, 0, 
10))] 
} 

setInterval(onTimerTick, 33); // 33 milliseconds = ~ 30 frames per sec 

function onTimerTick() { 
    ctx.clearRect(0, 0, canvas.width, canvas.height); 
    faces[0].draw(); 
    ctx.beginPath(); 
    for (var i = 1; i < 20; i++) { 
    ctx.moveTo(0, i * 20); 
    ctx.lineTo(400, i * 20); 
    } 
    for (var i = 1; i < 20; i++) { 
    ctx.moveTo(i * 20, 0); 
    ctx.lineTo(i * 20, 400); 
    } 
    ctx.stroke(); 
} 

あなたが焦点を当てるべきコードが一番下にあります。残りの部分は重要ではないと思っていますが、その場合にはそこにあるのです。あなたがこれを解決する方法について何か懇願している場合は、対応してください。ありがとうございました!

+0

jsファイルコードを投稿できますか? – Lalit

+1

ここの質問は**なぜ**あなたはこれをしたいですか?私はあなたに 'onmousemove'属性があることに気付きました。この属性を削除してJSファイルからイベント**をリッスンすることで、この競合状態を解決することができます。共同依存型コードは通常、動作させるためにページのロードが完了するのを待たなければなりません。 JS呼び出しをそのまま残して、あなたのスクリプトから 'onmousemove'イベント**をバインドすることをお勧めします:' window.onload = function(){this.addEventListener( 'mousemove'、update_loc)} ' – Dorival

答えて

1

何置き換えたいことはあなたが行うことができます循環依存関係

onmousemove="update_loc(event)" 

を打破するために、この部分は、理想的には、この

document.getElementById('myCanvas').onmousemove = update_loc 

のようにJSの代わりに、HTMLからイベントリスナーを追加することですページの読み込み時に

関連する問題