前のエントリで書いたとおり、HTML5になると、Javascriptで、円や四角形などを生成したり、動かしたりすることが出来る。
というと、動画が書けるのではないか?と思うかもしれないけど、ここで2つ問題がある。
・Javascriptには、sleepがない。 このため、一定時間待って、再描画とするには、何かの仕組みが必要 ・Javascriptでは、関数から抜けないと動画しない。 ということは、for文でぐるぐる回して・・・というわけには行かない。 |
この2つの問題を、同時に解決するのが、setTimeout()関数で、setTimeout()を使うと、
・指定時間後に、指定された関数を呼び出す
・セットするだけで、次の行に進む
という特徴をもっているため、指定された関数=自分自身(の関数)とすると、指定された時間後に、自分自身を呼び出してくれる。さらに、関数も抜けてくれる。
今回はそこで、setTimeout()を使う。
■課題
2つのボールがある。
zikkoボタンをクリックされると、2つのボールが放物線っぽく落ちるけど、1つはちょっと遅れて落ちる。
■ソース
こんなかんじ。
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>svgtest2</title> <script language="JavaScript"> <!-- //======================================== // 初期設定:好きな値に変える //======================================== var endcount=100; // 繰り返し数 var intv = 50; // インターバル var inc_y=2; // yの係数 var inc_x=20; // xの係数 //======================================== // 変数宣言:値は変えないこと //======================================== var count=0; var timer; //======================================== // 動画部分 //======================================== function douga() { // 動画書き出し en = document.getElementById("svg_1"); // 円を取ってくる en.setAttribute("cy",inc_y*count*count); // xの値セット en.setAttribute("cx",inc_x * count); // yの値セット en = document.getElementById("svg_2"); // 円を取ってくる en.setAttribute("cy",inc_y*(count-3)*(count-3));// xの値セット en.setAttribute("cx",inc_x * (count-3)); // yの値セット // タイマーセット if ( count < endcount ) { count ++; timer = setTimeout(douga,intv); } } // --> </script> </head> <body bgcolor="#00FFFF"> <button onclick="douga()" name="zikko" type="button">zikko</button><br> <svg> <g> <circle id="svg_1" r="10" cy="1" cx="1" stroke-width="2" stroke="#000000" fill="#FF0000"/> <circle id="svg_2" r="10" cy="1" cx="1" stroke-width="2" stroke="#FF0000" fill="#0000FF"/> </g> </svg> </body> </html> |
(上記< > は本当は半角)
douga()のところで描画している。
前半は、位置を指定して、移動させている。
後半、setTimeout()を使って自分自身を呼び出すことで、時間待ち&何回も呼び出を実現している。
もちろん、確認するときは、(IEでなく)Chromeを使ってね!(<>は、半角に置換して)