| 01 | <!DOCTYPE html> | 
|---|---|
| 02 | <html lang="ja"> | 
| 03 | <head> | 
| 04 | <meta charset="utf-8"> | 
| 05 | <title>JavaScriptのテストプログラム</title> | 
| 06 | </head> | 
| 07 | <body> | 
| 08 | <p id="output1" style="color:#4a4; font-size:80px; text-align:center;">日付表示</p> | 
| 09 | <p id="output2" style="color:#fc0; font-size:120px; text-align:center;">時間表示</p> | 
| 10 | <script> | 
| 11 | window.onload = update(); | 
| 12 | /* | 
| 13 | Dateオブジェクトから日付と時間を取得する。 | 
| 14 | 曜日は数値(0~6)になるので“日月加水木金土”の文字列から | 
| 15 | charAt命令で該当する曜日を抽出している。 | 
| 16 | */ | 
| 17 | function update() { | 
| 18 | var da = new Date(); | 
| 19 | var year = da.getFullYear();//西暦を取得 | 
| 20 | var month = da.getMonth();//月を取得 1月は0 | 
| 21 | var date = da.getDate();//日を取得 | 
| 22 | var day = da.getDay();//曜日を取得 日曜は0 | 
| 23 | var hour = da.getHours();//時間を取得 | 
| 24 | var min = da.getMinutes();//分を取得 | 
| 25 | var sec = da.getSeconds();//秒を取得 | 
| 26 | var whatday = "日月火水木金土".charAt(day); | 
| 27 | document.getElementById("output1").textContent = year + "/" + (month+1) + "/" + date + "(" + whatday + ")"; | 
| 28 | document.getElementById("output2").textContent = hour + ":" + min + ":" + sec; | 
| 29 | setTimeout( update, 1000 ); | 
| 30 | } | 
| 31 | </script> | 
| 32 | </body> | 
| 33 | </html> | 
HTMLが読み込みを完了
 ↓
window.onload が働き update() が呼び出される
 ↓
update()はDateオブジェクトから日時の詳細を取得してHTMLを書き換え、setTimeout命令で再びupdate()を実行する
getFullYear と getYear
JavaScriptの古い解説には西暦の取得に getYear を使う方法が書いてあることがありますが、
getYearは廃止予定の命令で命令自体に癖がありますので、getFullYearを使いましょう。
どのような癖があるか興味を持たれた方はgetFullYear()をgetYear()に書き換えて挙動をご確認下さい。
window.onload = setInterval( update, 1000 );
とし、29行のsetTimeout命令を削除して実行すると同じ動作をします。
setIntervalの補足を参考までに
ここで説明したように、setIntervalは指定した関数の処理が終わらなくても、再びその関数を実行してしまうことがあるのですが、
筆者が開発に使っているパソコン(Win7-64bit) Chrome バージョン 58.0.3029.96 で改めてテストしたところ、
かなり重い処理を入れた関数でも最後まで処理を実行した後、再びその関数を実行することが判りました。
具体的にはsetIntervalで指定する関数内に for( var i=0; i<10000000000; i++ )と100億回のループを入れ動作確認したところ、その部分で30秒近く費やすのですが、
ブラウザが停止することなく、関数の処理が最後まで行われていました。同じソースコードで Internet Explorer バージョン 11 11.0.9600 でテストしたところ、こちらはブラウザが応答しなくなりました。
ブラウザはバージョンアップするごとに処理の安定化が図られますので、Chrome は setInterval の誤動作が減るように改良されたのでは?(Google素晴らしいかも)と考えています。
とはいえ、我々のこれまでの経験からsetTimeout命令の方が安定していますので、リアルタイム処理はsetTimeout命令で行うのが間違いないでしょう。
◇コラム◇ p、div、span要素
これらの3つの要素はHTMLを記述する上でよく使います。
私はpとdivの違いをすぐ忘れてしまい、その度にググッて調べることがあったのですが(苦笑)、
pは段落(paragraph)を定義する→段落なので1行空くと覚えることで、違いがすっきり判るようになりました。
span要素は本講座で既に扱いましたが、spanは文章の一部分を定義し前後に改行は入らないと覚えておくと判りやすいでしょう。
| 01 | <!DOCTYPE html> | 
|---|---|
| 02 | <html lang="ja"> | 
| 03 | <head> | 
| 04 | <meta charset="utf-8"> | 
| 05 | <title>JavaScriptのテストプログラム</title> | 
| 06 | </head> | 
| 07 | <body id="mybody"> | 
| 08 | <div id="output"></div> | 
| 09 | <script> | 
| 10 | var colR = 0, colG = 0, colB = 0; | 
| 11 | window.onload = fade(); | 
| 12 | function fade() { | 
| 13 | colR++; if( colR == 16 ) colR = 0; | 
| 14 | colG++; if( colG == 16 ) colG = 0; | 
| 15 | colB++; if( colB == 16 ) colB = 0; | 
| 16 | var col = "#" + colR.toString(16) + colG.toString(16) + colB.toString(16); | 
| 17 | var bo = document.getElementById("mybody"); | 
| 18 | bo.style.backgroundColor = col; | 
| 19 | var di = document.getElementById("output"); | 
| 20 | di.style.color = "yellow"; | 
| 21 | di.style.fontSize = "120px"; | 
| 22 | di.style.textAlign = "right"; | 
| 23 | di.textContent = col; | 
| 24 | setTimeout( fade, 1000 ); | 
| 25 | } | 
| 26 | </script> | 
| 27 | </body> | 
| 28 | </html> | 
| HTMLのstyle | JavaScriptのstyle | |
|---|---|---|
| 背景色 | background-color | backgroundColor | 
| 文字の色 | color | color | 
| 文字の大きさ | font-size | fontSize | 
| 文字や画像の位置 | text-align | textAlign | 
var playerX, playerY;//プレイヤーキャラの位置を管理するグローバル変数
var enemyX, enemyY;//敵キャラの位置を管理するグローバル変数
function initPosition() {//キャラクターの初期位置
 playerX, playerY 及び enemyX, enemyY の値を入れる
}
function movePlayer() {//プレイヤーを動かす処理
 var playerSpeed = 1; ← このローカル変数はこの関数内だけで使える
 playerX, playerY を変化させる
 :
}
function moveEnemy() {//敵を動かす処理
 var enemyAI = 0; ← このローカル変数はこの関数内だけで使える
 enemyX, enemyY を変化させる
 :
}
function checkCollision() {//プレイヤーと敵が接触しているか?
 playerX, playerY と enemyX, enemyY の位置関係を調べる
 :
}

◇コラム◇ グローバル変数は極力使わないようにという解説もあるけど?
グローバル変数はあらゆる関数や処理から参照でき、値を変化させることができます。
そのため処理が進む中、思わぬ箇所で値が書き換わり、プログラム上の不具合(バグ)を引き起こす恐れがあります。
とは言いましたが、個人で作るゲームのプログラムでは、どの変数で何を処理するかをきちんと管理すれば問題ございませんし、
プログラマー数名で開発する商用レベルのソフトでも、プログラムリーダーがグローバル変数の名称と用途(仕様)を決め管理すれば問題ないはずです。
実際に私達はそのようにして長年ゲーム開発を行ってきました。
一方、大規模なソフト開発において複数名のプログラマーが(まずないとは思いますが)
チーム内での意思疎通無しにグローバル変数を使うとバグが発生する危険性が高く、そのようなことは無論避けるべきです。
