以下代碼是在瀏覽器中使用編程語言J(未顯示)生成烏龜圖形的應用程序的一部分。代碼有效,但沒有動畫。相反,海龜的複雜路徑只能一次顯示在最終狀態。所以我想使用setInterval或setTimeout來產生一個動畫效果,但我看不到如何。將setInterval應用於哪個函數
我嘗試過像setInterval(drawPrimitive, 1000/2);
這樣的命令,但結果沒有任何變化。
更新0
我做的,當我在setInterval()調用提供一些虛假的論點得到一點反應。例如,當我輸入setInterval(function(){drawPrimitive(gl.LINES, linecolors[0], moves[0]);}, 3000);
,然後在發出turtle命令後,立即執行該命令,然後在多達3秒後 - 但通常更少 - 畫布變白並保持白色,直到我發出另一個命令。但有仍然在繪圖/繪畫中沒有動畫。這有什麼建議嗎?
更新0
感謝的想法。
順便說一句,如果你想看看我在說什麼,你可以看看about 1:34 in this video或只是在視頻的原始閃屏。
drawTurtles(linecolors,moves,leftColors,rightColors,backColors,bottoms,lefts,rights,backs,bottomNs,leftNs,rightNs,backNs);
function drawTurtles(linecolors,moves,leftColor,rightColor,backColor,bottom,left,right,back,bottomNs,leftNs,rightNs,backNs){
gl.uniform1i(uLit, 0);
drawLines(linecolors,moves)
bottomColor = [ 1,1,1,0];
gl.uniform1i(uLit, 1);
for(var i=0;i<leftColor.length;i++)
{
gl.uniform3f(uNormal, leftNs[i][0],leftNs[i][1],leftNs[i][2]);
drawPrimitive(gl.TRIANGLES, leftColor[i], left[i]);
gl.uniform3f(uNormal, rightNs[i][0],rightNs[i][1],rightNs[i][2]);
drawPrimitive(gl.TRIANGLES, rightColor[i], right[i]);
gl.uniform3f(uNormal, backNs[i][0],backNs[i][1],backNs[i][2]);
drawPrimitive(gl.TRIANGLES, backColor[i], back[i]);
gl.uniform3f(uNormal, -bottomNs[i][0],-bottomNs[i][1],-bottomNs[i][2]);
drawPrimitive(gl.TRIANGLES, bottomColor, bottom[i]);
}
}
function drawLines(linecolors,moves) {
setInterval(drawPrimitive, 1000/2);
gl.lineWidth(2);
gl.uniform1i(uLit, 0);
for(var i=0;i<linecolors.length;i++)
{
drawPrimitive(gl.LINES, linecolors[i], moves[i]);
}
gl.lineWidth(1);
}
function drawPrimitive(primitiveType, color, vertices) {
gl.enableVertexAttribArray(aCoords);
gl.bindBuffer(gl.ARRAY_BUFFER,aCoordsBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STREAM_DRAW);
gl.uniform4fv(uColor, color);
gl.vertexAttribPointer(aCoords, 3, gl.FLOAT, false, 0, 0);
gl.drawArrays(primitiveType, 0, vertices.length/3);
}
function init() {
var canvas = document.getElementById("glcanvas");
var vertexShaderSource = getTextContent("vshader");
var fragmentShaderSource = getTextContent("fshader");
var prog = createProgram(gl,vertexShaderSource,fragmentShaderSource);
linecolors = [];
moves = [];
gl.useProgram(prog);
aCoords = gl.getAttribLocation(prog, "coords");
uModelview = gl.getUniformLocation(prog, "modelview");
uProjection = gl.getUniformLocation(prog, "projection");
uColor = gl.getUniformLocation(prog, "color");
uLit = gl.getUniformLocation(prog, "lit");
uNormal = gl.getUniformLocation(prog, "normal");
uNormalMatrix = gl.getUniformLocation(prog, "normalMatrix");
aCoordsBuffer = gl.createBuffer();
gl.enable(gl.DEPTH_TEST);
gl.enable(gl.CULL_FACE);
}
真的,不要使用'setInterval'和'setTimeout',因爲優化。請參閱:https://developer.mozilla.org/en/docs/Web/API/window.requestAnimationFrame和http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/瞭解如何使用requestAnimationFrame '。 –
我已經讀了一些關於requestAnimationFrame()和它的優點(以及它還沒有普遍適用於所有的瀏覽器),但我想我現在要從setInterval()開始,但甚至無法使setInterval()工作。所以我可以先使用setInterval()的一些幫助。 – zerowords