質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

4026閲覧

画像が表示されない

otya

総合スコア19

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2015/07/23 05:42

otyaと申します。
プログラミング初心者で、ゲームを作れば身につくのも早いだろうと思い、雑誌に書いてある通り15パズルゲームのコードを書いてみたのですが、画像が表示されません。

開発環境で表示されるエラーを消すために関数の順番を変えたり、変数宣言の仕方を変えたりしたのですが、何が原因なのかわかりません。
ブラウザはクロームで、javascriptの表示設定はされており、画像も同じフォルダにいれており、ファイル名も合っています。

どこをどうすれば画像が表示されるのか教えてください。
長いですが、コードは下記の通りです。

JavaScript

1//各種設定 2var PICTURE_URL = "Penguins.png"; //画像ファイルのURL 3var BLOCK_W = 150; //ブロックの幅 4var BLOCK_H = 150; //ブロックの高さ 5var ROW_COUNT = 4; //列を何枚に切るか 6var COL_COUNT = 4; //行を何枚に切るか 7var NUM_BLOCKS = ROW_COUNT * COL_COUNT; //上下左右の相対座標を定義 8var UDLR = [[0, -1], [0, 1], [-1, 0], [1, 0]]; //ゲーム全体で使う変数 9var context, image; //描画用 10var blocks = []; //各ブロックを管理する配列変数 11var isLock; //マウス操作をロックするかどうか 12 13//パズルの画面を描画する 14function drawPuzzle() { 15 "use strict"; 16 var i, 17 dx, 18 dy, 19 no, 20 sx, 21 sy, 22 cx, 23 cy; 24 for (i = 0; i < NUM_BLOCKS; i = i + 1) { 25 //描画先座標を計算 26 dx = (i % COL_COUNT) * BLOCK_W; 27 dy = Math.floor(i / COL_COUNT) * BLOCK_H; 28 //描画元座標を計算 29 no = blocks[i]; 30 if (no < 0) { //空きブロック 31 context.fillStyle = "#0000FF"; 32 context.fillRect(dx, dy, BLOCK_W, BLOCK_H); 33 } else { 34 sx = (no % COL_COUNT) * BLOCK_W; 35 sy = Math.floor(no / COL_COUNT) * BLOCK_H; 36 // 画像の一部を切り取って描画 37 context.drawImage(image, sx, sy, BLOCK_W, BLOCK_H, dx, dy, BLOCK_W, BLOCK_H); 38 } 39 //画像の枠を描画 40 context.beginPath(); 41 context.strokeStyle = "white"; 42 context.lineWidth = 3; 43 context.rect(dx, dy, BLOCK_W, BLOCK_H); 44 context.stroke(); 45 context.closePath(); 46 // ブロック番号を描画する 47 context.fillStyle = "white"; 48 context.font = "bold 40px Arial"; 49 cx = dx + (BLOCK_W - 40) / 2; 50 cy = dy + BLOCK_H / 2; 51 context.fillText(no, cx, cy); 52 } 53} 54// 列と行からブロック番号を調べる関数 55function getIndex(col, row) { 56 "use strict"; 57 return row * COL_COUNT + col; 58} 59function getCol(no) { "use strict"; return no % COL_COUNT; } 60function getRow(no) { 61 "use strict"; 62 return Math.floor(no / COL_COUNT); 63} 64//パズルの各ピースをシャッフルする 65function shufflePuzzle() { 66 "use strict"; 67 var scount = 20, //シャッフルする回数を指定 68 blank = NUM_BLOCKS - 1, //空きブロック位置 69 //一回のシャッフルを行う関数 70 shuffle = function () { scount = scount - 1; 71 if (scount <= 0) { 72 isLock = false; //ゲーム開始 73 return; 74 } 75 var r, px, py, no; 76 while (true) { 77 r = Math.floor(Math.random() * UDLR.length); 78 px = getCol(blank) + UDLR[r][0]; 79 py = getRow(blank) + UDLR[r][1]; 80 if (!(px < 0 || px >= COL_COUNT)) && !(py < 0 || py >= COL_COUNT) { 81 no = getIndex(px, py); 82 break; 83 } 84 } 85 blocks[blank] = blocks[no]; 86 blocks[no] = -1; 87 blank = no; 88 drawPuzzle(); 89 setTimeout(shuffle, 100); 90 }; 91 shuffle(); 92} 93//ゲームの初期化 94function initGame() { 95 "use strict"; 96 isLock = true; //ユーザ操作をロックする 97 //パズルのブロックを作成する 98 var i; 99 for (i = 0; i < NU M_BLOCKS; i = i + 1) { blocks[i] = i; } 100 //末尾(右下)を空きブロックとする 101 blocks[NUM_BLOCKS - 1] = -1; 102 drawPuzzle(); //見本を表示する 103 //一秒後にシャッフルを開始する 104 setTimeout(shufflePuzzle, 1000); 105} 106//初期化処理 107function init() { 108 //描画コンテキストの取得 109 "use strict"; 110 var canvas = document.getElementById("gameCanvas"); 111 if (!canvas.getContext) { 112 window.aleat("Canvasをサポートしていません。"); 113 return; 114 } 115 context = canvas.getContext("2d"); 116 //メイン画像を生み出す 117 image = new Image(); 118 image.src = PICTURE_URL; 119 image.onload = initGame; //読み込んだらゲームを初期化 120} 121 122//マウスで移動先をクリックした時の処理 123function mouseHandler(t) { 124 if (isLock) return; 125 // タッチ座標の取得 126 var px = t.offsetX, py = t.offsetY; 127 if (px == undefined) { //Firefox対策 128 var p = t.currentTarget; 129 px = t.layerX - p.offsetLeft; 130 py = t.layerY - p.offsetTop; 131 } 132 //何番目のピースを動かしたいのか計算する 133 var px2 = Math.floor(px / BLOCK_W); 134 var py2 = Math.floor(py / BLOCK_H); 135 var no = getIndex(px2, py2); 136 //空白ブロックなら動かせない 137 if (blocks[no] == -1) return; 138 // 上下左右に動かせるブロックがあるか確認 139 for (var i = 0; i < UDLR.length; i++) { 140 var pt = UDLR[i]; 141 var xx = px2 + pt[0]; 142 var yy = py2 + pt[1]; 143 var no = getIndex(xx, yy); 144 if (xx < 0 || xx >= COL_COUNT) continue; 145 if (yy < 0 || yy >= ROW_COUNT) continue; 146 if (blocks[no] == -1) { // 移動可能か? 147 blocks[no] = blocks[getIndex(px2,py2)]; 148 blocks[getIndex(px2,py2)] = -1; 149 drawPuzzle(); 150 checkClear(); 151 break; 152 } 153 } 154} 155//マウスイベントの設定 156 canvas.onmousedown = mouseHandler; 157// クリアしたかどうかをチェックする 158function checkClear() { 159 var flag = true; 160 for (var i = 0; i < (NUM_BLOCKS - 1); i++) { 161 if (blocks[i] != i) { 162 flag = false; break; 163 } 164 } 165 if (flag) { 166 aleat("ゲームクリアしました!"); 167 initGame(); //再度ゲームを実行 168 } 169}

お手数ですが、お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

画像が表示されない・・というより、シンタックスエラーで動かないと思いますけど・・

下記の部分のカッコの対応がおかしいです。

javascript

1/* NG */ if (!(px < 0 || px >= COL_COUNT)) && !(py < 0 || py >= COL_COUNT) { 2/* OK */ if (!(px < 0 || px >= COL_COUNT) && !(py < 0 || py >= COL_COUNT)) {

下記の変数名の途中に空白があるのがおかしいです。

javascript

1/* NG */ for (i = 0; i < NU M_BLOCKS; i = i + 1) { blocks[i] = i; } 2/* OK */ for (i = 0; i < NUM_BLOCKS; i = i + 1) { blocks[i] = i; }

下記は init() 関数の中にあるべきものだと思います。

javascript

1//マウスイベントの設定 2canvas.onmousedown = mouseHandler;

投稿2015/07/23 05:52

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otya

2015/07/23 11:17

回答ありがとうございます! 動きました!感動です! わかりやすく説明していただきましてありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問