| 01 | <!DOCTYPE html> |
|---|---|
| 02 | <html lang="ja"> |
| 03 | <head> |
| 04 | <meta charset="utf-8"> |
| 05 | <title>JavaScriptのテストプログラム</title> |
| 06 | </head> |
| 07 | <body> |
| 08 | <canvas id="bg" width="800" height="720"></canvas> |
| 09 | <script> |
| 10 | var canvas = document.getElementById("bg"); |
| 11 | var cnt = canvas.getContext("2d"); |
| 12 | var img; |
| 13 | window.onload = function() { |
| 14 | img = new Image(); |
| 15 | img.src = "example181_illust.png"; |
| 16 | img.onload = function() { |
| 17 | cnt.drawImage( img, 0, 0 ); |
| 18 | } |
| 19 | } |
| 20 | </script> |
| 21 | </body> |
| 22 | </html> |
1.画像を読み込む変数名(オブジェクト名)を宣言
↓
2.new Image()命令で Imageオブジェクトを作成
↓
3.image.src で 画像ファイルを指定、読み込みが開始される ※この命令で瞬時に読み込まれるわけではない
↓
4.drawImage命令で描画 ※読み込みが完了してから描画する
image.onload = function() { 画像の読み込み完了時に行いたい処理 }
onload = function(){}の記述について
HTMLが読み込まれた時点で window.onload が働くことを 1-6 (1) で解説しました。
今回のソースコードでは window.onload = function() { 処理 } と記述しています。
これは window.onload で名称無しの関数 function() { } の処理を実行するという意味です。
JavaScriptではこのように名称の無い関数を記述できます。
image.onload = function() { } も同様に、画像が読み込まれた時点で名称無しの関数内に記述された処理が実行されます。
| 01 | <!DOCTYPE html> |
|---|---|
| 02 | <html lang="ja"> |
| 03 | <head> |
| 04 | <meta charset="utf-8"> |
| 05 | <title>HTMLとの比較</title> |
| 06 | </head> |
| 07 | <body> |
| 08 | <img src="example181_illust.png"> |
| 09 | </body> |
| 10 | </html> |
| 01 | <!DOCTYPE html> |
|---|---|
| 02 | <html lang="ja"> |
| 03 | <head> |
| 04 | <meta charset="utf-8"> |
| 05 | <title>JavaScriptのテストプログラム</title> |
| 06 | </head> |
| 07 | <body> |
| 08 | <canvas id="bg" width="880" height="720"></canvas> |
| 09 | <script> |
| 10 | var canvas = document.getElementById("bg"); |
| 11 | var cnt = canvas.getContext("2d"); |
| 12 | cnt.strokeStyle = "#000"; |
| 13 | cnt.strokeRect( 0, 0, 880, 720 ); |
| 14 | var img; |
| 15 | window.onload = function() { |
| 16 | img = new Image(); |
| 17 | img.src = "example181_illust.png"; |
| 18 | img.onload = function() { |
| 19 | cnt.drawImage( img, 5, 5, 200, 180 );// 1/4サイズ |
| 20 | cnt.drawImage( img, 5, 180, 400, 360 );// 1/2サイズ |
| 21 | cnt.drawImage( img, 94, 116, 200, 230, 450, 0, 200, 230 );//切り出し |
| 22 | cnt.drawImage( img, 94, 116, 200, 230, 450, 240, 400, 460 );//切り出して拡大 |
| 23 | } |
| 24 | } |
| 25 | </script> |
| 26 | </body> |
| 27 | </html> |
| context.drawImage( image, x, y ) | キャンバスの(x,y)の位置に 画像を表示 |
| context.drawImage( image, x, y, w, h ) | キャンバスの(x,y)の位置に 幅w、高さhの大きさで画像を表示 |
| context.drawImage( image, sx, sy, sw, sh, dx, dy, dw, dh ) | 切り出し+拡大縮小表示 下記のようになります |
| 01 | <!DOCTYPE html> |
|---|---|
| 02 | <html lang="ja"> |
| 03 | <head> |
| 04 | <meta charset="utf-8"> |
| 05 | <title>JavaScriptのテストプログラム</title> |
| 06 | </head> |
| 07 | <body style="text-align:center;"> |
| 08 | <canvas id="bg" width="800" height="320"></canvas> |
| 09 | |
| 10 | <script> |
| 11 | var canvas = document.getElementById("bg"); |
| 12 | var cnt = canvas.getContext("2d"); |
| 13 | |
| 14 | var tmr = 0;//時間を管理する変数 |
| 15 | |
| 16 | //キャラクターをアニメーションさせる番号の配列 |
| 17 | var CHR_ANI = [ 0, 1, 0, 2, ]; |
| 18 | |
| 19 | //画像ファイル用の配列 |
| 20 | var img = []; |
| 21 | var imgPre = []; |
| 22 | |
| 23 | //画像ファイルを読み込む関数 |
| 24 | function loadImg( n ) { |
| 25 | imgPre[n] = false;//読み込みできたかのフラグ |
| 26 | img[n] = new Image(); |
| 27 | img[n].src = "example182_" + n + ".png"; |
| 28 | img[n].onload = function() { imgPre[n] = true; } |
| 29 | } |
| 30 | |
| 31 | //画像を表示する関数 |
| 32 | function drawImg( n, x, y ) { |
| 33 | if( imgPre[n] == true ) cnt.drawImage( img[n], x, y ); |
| 34 | } |
| 35 | |
| 36 | function drawImgS( n, x, y, w, h ) { |
| 37 | if( imgPre[n] == true ) cnt.drawImage( img[n], x, y, w, h ); |
| 38 | } |
| 39 | |
| 40 | for( var i = 0; i < 5; i ++ ) loadImg(i);//5枚の画像を読み込む |
| 41 | |
| 42 | window.onload = drawScene(); |
| 43 | function drawScene() { |
| 44 | var a, i, ofs; |
| 45 | tmr ++;//タイマーをカウント |
| 46 | |
| 47 | ofs = tmr%240; |
| 48 | for( i = 0; i <= 4; i ++ ) drawImg( 3, 240*i-ofs, 0 );//遠景の雲 画像サイズW240 x H120 |
| 49 | |
| 50 | ofs = (tmr*2)%80; |
| 51 | for( i = 0; i <= 10; i ++ ) drawImg( 4, 80*i-ofs, 80 );//山と地面 画像サイズW 80 x H240 |
| 52 | |
| 53 | a = tmr%4; |
| 54 | drawImgS( CHR_ANI[a], 350, 160, 100, 80 );//動物のアニメーション |
| 55 | |
| 56 | setTimeout(drawScene,200); |
| 57 | } |
| 58 | </script> |
| 59 | </body> |
| 60 | </html> |
var 変数名 = []; ← 今回のソースコード20、21行
var 変数名 = [ 初期値0, 初期値1, 初期値2, ‥, ‥, ‥ ]; ←ソースコード17行
もしくは
var 変数名 = new Array();
var 変数名 = new Array(要素数);
ソースコードとリソースは最終的にネット上に置かれる
ローカル(ご自身が開発に使われているPC)でテストしている段階では、多くの枚数を瞬時あるいは短時間で読み込むことができます。
しかしソースコードと画像や音声などのリソースファイルは最終的にネット上にアップしますので、
ネットからの読み込み処理にはタイムラグが発生し、時に通信自体が途切れることもあります。
今回の例でキャラクターのアニメーション3枚を別々の画像にしていますが、
キャラクターの種類やアニメパタンが多い場合は、それらの画像を1枚にまとめるべきです。

| 配列 | a[0] | a[1] | a[2] | a[3] | a[4] |
|---|---|---|---|---|---|
| 初期値 | 1 | 3 | 5 | 7 | 9 |
| 配列 | item[0] | item[1] | item[2] |
|---|---|---|---|
| 初期値 | みかん | りんご | レモン |
JavaScriptの配列はとても柔軟
C系やJavaで配列を使うには、要素数を与えて宣言するか、初期値を入れて宣言する必要があります(その場合は初期値がいくつあるかが要素数となる)。
C系やJavaで例えば a[0]からa[4]までの配列を宣言した場合、a[5]に何らかの処理を行うことはできません。
要素数を超えた配列を扱おうとするとエラーとなり、多くの場合ソフトウェアが停止します。
一方JavaScriptの場合はまず配列名だけ宣言し、後から要素数を増やすことができます。
またC系やJavaは配列宣言の際に型(数値を扱うのか文字列を扱うのかなど)を明確にし、処理の途中で型を変更することはできません(C系やJavaでは変数自体の型を変更できない)。
JavaScriptの場合は今回のImageオブジェクトのように配列宣言後にその型を決めることが多々あります。
C系やJavaを学んでからJavaScriptを学ばれる方はJavaScriptの配列は便利だと感じられ、JavaScriptを学んだ後にC系やJavaを学ばれる方は他の言語の配列は窮屈に感じられるかもしれません。
JavaScriptの配列の扱いは他のプログラミング言語より柔軟性があり、C系やJavaと違う点があることを知っておかれると良いでしょう。
