| 01 | //キャンバスの設定 | 
|---|
| 02 | var winW = window.innerWidth; | 
|---|
| 03 | var canvas = document.getElementById("bg"); | 
|---|
| 04 | var cnt = canvas.getContext("2d"); | 
|---|
| 05 | var SCALE; | 
|---|
| 06 | var CWIDTH  = 640; | 
|---|
| 07 | var CHEIGHT = 480; | 
|---|
| 08 | winW = toInt(winW*0.96);//キャンバス右端がブラウザのスクロールバーに隠れないように | 
|---|
| 09 | canvas.width = winW; | 
|---|
| 10 | canvas.height = winW*CHEIGHT/CWIDTH; | 
|---|
| 11 | SCALE = winW / CWIDTH; | 
|---|
| 12 | cnt.scale( SCALE, SCALE ); | 
|---|
| 13 | cnt.textAlign = "center"; | 
|---|
| 14 | cnt.textBaseline = "middle"; | 
|---|
| 15 |  | 
|---|
| 16 | //マウスとタップの判定 | 
|---|
| 17 | var tapX = 0, tapY = 0, tapC = 0; | 
|---|
| 18 |  | 
|---|
| 19 | canvas.addEventListener( "touchstart", touchStart ); | 
|---|
| 20 | canvas.addEventListener( "touchmove", touchMove ); | 
|---|
| 21 | canvas.addEventListener( "touchend", touchEnd ); | 
|---|
| 22 | canvas.addEventListener( "touchcancel", touchCancel ); | 
|---|
| 23 | function touchStart(event) { | 
|---|
| 24 | event.preventDefault(); | 
|---|
| 25 | var rect = event.target.getBoundingClientRect(); | 
|---|
| 26 | tapX = event.touches[0].clientX-rect.left; | 
|---|
| 27 | tapY = event.touches[0].clientY-rect.top; | 
|---|
| 28 | transformXY(); | 
|---|
| 29 | tapC = 1; | 
|---|
| 30 | setMap(); | 
|---|
| 31 | } | 
|---|
| 32 | function touchMove(event) { | 
|---|
| 33 | event.preventDefault(); | 
|---|
| 34 | var rect = event.target.getBoundingClientRect(); | 
|---|
| 35 | tapX = event.touches[0].clientX-rect.left; | 
|---|
| 36 | tapY = event.touches[0].clientY-rect.top; | 
|---|
| 37 | transformXY(); | 
|---|
| 38 | setMap(); | 
|---|
| 39 | } | 
|---|
| 40 | function touchEnd(event) { tapC = 0; } | 
|---|
| 41 | function touchCancel(event) { tapC = 0; } | 
|---|
| 42 |  | 
|---|
| 43 | canvas.addEventListener( "mousedown", mouseDown ); | 
|---|
| 44 | canvas.addEventListener( "mousemove", mouseMove ); | 
|---|
| 45 | canvas.addEventListener( "mouseup", mouseUp ); | 
|---|
| 46 | function mouseDown(event) { | 
|---|
| 47 | var rect = event.target.getBoundingClientRect(); | 
|---|
| 48 | tapX = event.clientX-rect.left; | 
|---|
| 49 | tapY = event.clientY-rect.top; | 
|---|
| 50 | transformXY(); | 
|---|
| 51 | tapC = 1; | 
|---|
| 52 | setMap(); | 
|---|
| 53 | } | 
|---|
| 54 | function mouseMove(event) { | 
|---|
| 55 | var rect = event.target.getBoundingClientRect(); | 
|---|
| 56 | tapX = event.clientX-rect.left; | 
|---|
| 57 | tapY = event.clientY-rect.top; | 
|---|
| 58 | transformXY(); | 
|---|
| 59 | setMap(); | 
|---|
| 60 | } | 
|---|
| 61 | function mouseUp(event) { tapC = 0; } | 
|---|
| 62 |  | 
|---|
| 63 | function transformXY() {//実座標→仮想座標への変換 | 
|---|
| 64 | tapX = toInt(tapX/SCALE); | 
|---|
| 65 | tapY = toInt(tapY/SCALE); | 
|---|
| 66 | } | 
|---|
| 67 |  | 
|---|
| 68 | //キー入力 | 
|---|
| 69 | var key = 0; | 
|---|
| 70 | window.onkeydown = function(event) { key = event.keyCode; } | 
|---|
| 71 | window.onkeyup = function(event) { key = 0; } | 
|---|
| 72 |  | 
|---|
| 73 | function toInt( val ) {//整数を返す関数 | 
|---|
| 74 | return parseInt(val); | 
|---|
| 75 | } | 
|---|
| 76 |  | 
|---|
| 77 | function placeNum( val, pla ) {//数字を指定する桁数にする関数 | 
|---|
| 78 | return ("0000000000"+val).slice(-pla); | 
|---|
| 79 | } | 
|---|
| 80 |  | 
|---|
| 81 | //画像ファイルの処理 | 
|---|
| 82 | var img = [], imgPre = []; | 
|---|
| 83 |  | 
|---|
| 84 | function loadImg( n ) {//画像を読み込む | 
|---|
| 85 | imgPre[n] = false; | 
|---|
| 86 | img[n] = new Image(); | 
|---|
| 87 | img[n].src = "chip/" + placeNum(n,3) + ".png"; | 
|---|
| 88 | img[n].onload = function() { imgPre[n] = true; } | 
|---|
| 89 | } | 
|---|
| 90 |  | 
|---|
| 91 | function drawChip( cn, dx, dy ) {//マップチップを表示 | 
|---|
| 92 | if( imgPre[0] == true ) cnt.drawImage( img[cn], dx, dy ); | 
|---|
| 93 | } | 
|---|
| 94 |  | 
|---|
| 95 | function fText( str, x, y, siz, col ) {//文字表示 | 
|---|
| 96 | cnt.font = siz + "px monospace"; | 
|---|
| 97 | cnt.fillStyle = col; | 
|---|
| 98 | cnt.fillText( str, x, y ); | 
|---|
| 99 | } | 
|---|
| 100 |  | 
|---|
| 101 | function fRect( x, y, w, h, col ) {//矩形(塗り潰し) | 
|---|
| 102 | cnt.fillStyle = col; | 
|---|
| 103 | cnt.fillRect( x, y, w, h ); | 
|---|
| 104 | } | 
|---|
| 105 |  | 
|---|
| 106 | function sRect( x, y, w, h, col ) {//矩形(枠) | 
|---|
| 107 | cnt.lineWidth = 2; | 
|---|
| 108 | cnt.strokeStyle = col; | 
|---|
| 109 | cnt.strokeRect( x, y, w, h ); | 
|---|
| 110 | } | 
|---|
| 111 |  | 
|---|
| 112 | //ボタンを表示(中心座標、幅、高さ) | 
|---|
| 113 | function drawBtn( str, x, y, w, h ) { | 
|---|
| 114 | var ret = false; | 
|---|
| 115 | var col = "#24f"; | 
|---|
| 116 | if( x-w/2 < tapX && tapX < x+w/2 && y-h/2 < tapY && tapY < y+h/2 ) { | 
|---|
| 117 | col = "#48f"; | 
|---|
| 118 | if( tapC > 0 ) { col = "#cff"; ret = true; }//ボタンが押されている | 
|---|
| 119 | } | 
|---|
| 120 | fRect( x-w/2, y-h/2, w, h, col ); | 
|---|
| 121 | fText( str, x, y, 24, "white" ); | 
|---|
| 122 | return ret; | 
|---|
| 123 | } | 
|---|
| 124 |  | 
|---|
| 125 | //定数の宣言 | 
|---|
| 126 | var FCHIP_W = toInt(480/CHIP_SIZE);//フィールドのチップを横に何個描くか | 
|---|
| 127 | var FCHIP_H = toInt(480/CHIP_SIZE);//フィールドのチップを縦に何個描くか | 
|---|
| 128 | var SCHIP_N = toInt(160/CHIP_SIZE);//選択用のチップを横に何個描くか | 
|---|
| 129 | var WMAP_X = 480+(160-FIELD_W)/2;//全体マップの表示位置 | 
|---|
| 130 | var WMAP_Y = 420-FIELD_H; | 
|---|
| 131 |  | 
|---|
| 132 | //変数の宣言 | 
|---|
| 133 | var idx = 0; | 
|---|
| 134 | var sel = 0; | 
|---|
| 135 | var fTop = 0; | 
|---|
| 136 | var fLeft = 0; | 
|---|
| 137 |  | 
|---|
| 138 | //二次元配列の作成 | 
|---|
| 139 | var map = new Array(); | 
|---|
| 140 | for( var y = 0; y < FIELD_H; y ++ ) { | 
|---|
| 141 | map[y] = new Array(); | 
|---|
| 142 | for( var x = 0; x < FIELD_W; x ++ ) map[y][x] = 0; | 
|---|
| 143 | } | 
|---|
| 144 |  | 
|---|
| 145 | function setMap() {//画面をクリック(タップ)した時の処理 | 
|---|
| 146 | var c, x, y; | 
|---|
| 147 | if( tapC == 0 ) return; | 
|---|
| 148 | if( tapX < 480 ) {//マップチップを置く | 
|---|
| 149 | x = toInt(tapX/CHIP_SIZE); | 
|---|
| 150 | y = toInt(tapY/CHIP_SIZE); | 
|---|
| 151 | map[fTop+y][fLeft+x] = sel; | 
|---|
| 152 | } | 
|---|
| 153 | else {//マップチップを選ぶ | 
|---|
| 154 | x = toInt((tapX-480)/CHIP_SIZE); | 
|---|
| 155 | y = toInt(tapY/CHIP_SIZE); | 
|---|
| 156 | c = x + y * SCHIP_N; | 
|---|
| 157 | if( c < CHIP_MAX ) sel = c; | 
|---|
| 158 | } | 
|---|
| 159 | } | 
|---|
| 160 |  | 
|---|
| 161 | function putMapData() {//データを出力する | 
|---|
| 162 | var x, y; | 
|---|
| 163 | var dat = ""; | 
|---|
| 164 | for( y = 0; y < FIELD_H; y ++ ) { | 
|---|
| 165 | for( x = 0; x < FIELD_W; x ++ ) dat = dat + map[y][x] + ","; | 
|---|
| 166 | } | 
|---|
| 167 | document.getElementById("ta").value = dat; | 
|---|
| 168 | } | 
|---|
| 169 |  | 
|---|
| 170 | window.onload = mainProc(); | 
|---|
| 171 | function mainProc() { | 
|---|
| 172 | var i, x, y; | 
|---|
| 173 |  | 
|---|
| 174 | switch( idx ) { | 
|---|
| 175 | case 0://初期化処理 | 
|---|
| 176 | for( i = 0; i < CHIP_MAX; i ++ ) loadImg(i); | 
|---|
| 177 | idx = 1; | 
|---|
| 178 | break; | 
|---|
| 179 |  | 
|---|
| 180 | case 1: | 
|---|
| 181 | if( key == 65 ) { | 
|---|
| 182 | if( confirm("選択しているチップで画面を埋めます。よろしいですか?") == true ) { | 
|---|
| 183 | for( y = 0; y < FCHIP_H; y ++ ) { | 
|---|
| 184 | for( x = 0; x < FCHIP_W; x ++ ) map[fTop+y][fLeft+x] = sel; | 
|---|
| 185 | } | 
|---|
| 186 | } | 
|---|
| 187 | key = 0; | 
|---|
| 188 | } | 
|---|
| 189 | if( key == 38 ) { if( fTop > 0 ) fTop --; } | 
|---|
| 190 | if( key == 40 ) { if( fTop < FIELD_H-FCHIP_H ) fTop ++; } | 
|---|
| 191 | if( key == 37 ) { if( fLeft > 0 ) fLeft --; } | 
|---|
| 192 | if( key == 39 ) { if( fLeft < FIELD_W-FCHIP_W ) fLeft ++; } | 
|---|
| 193 |  | 
|---|
| 194 | //フィールドのマップチップを描く | 
|---|
| 195 | for( y = 0; y < FCHIP_H; y ++ ) { | 
|---|
| 196 | for( x = 0; x < FCHIP_W; x ++ ) drawChip( map[fTop+y][fLeft+x], x*CHIP_SIZE, y*CHIP_SIZE ); | 
|---|
| 197 | } | 
|---|
| 198 |  | 
|---|
| 199 | //選択用のチップを描く | 
|---|
| 200 | fRect( 480, 0, 160, 480, "black" ); | 
|---|
| 201 | x = 0; | 
|---|
| 202 | y = 0; | 
|---|
| 203 | for( i = 0; i < CHIP_MAX; i ++ ) { | 
|---|
| 204 | var cx = x*CHIP_SIZE + 480; | 
|---|
| 205 | var cy = y*CHIP_SIZE; | 
|---|
| 206 | drawChip( i, cx, cy ); | 
|---|
| 207 | if( i == sel ) sRect( cx+1, cy+1, CHIP_SIZE-2, CHIP_SIZE-2, "red" );//選択しているチップ | 
|---|
| 208 | x ++; | 
|---|
| 209 | if( x == SCHIP_N ) { x = 0; y ++; } | 
|---|
| 210 | } | 
|---|
| 211 |  | 
|---|
| 212 | //全体マップ | 
|---|
| 213 | fRect( WMAP_X, WMAP_Y, FIELD_W, FIELD_H, "#888" ); | 
|---|
| 214 | sRect( WMAP_X+fLeft, WMAP_Y+fTop, FCHIP_W, FCHIP_H, "#8ff" ); | 
|---|
| 215 | fText( "X="+fLeft+" Y="+fTop, 560, WMAP_Y-20, 20, "#fff" ); | 
|---|
| 216 |  | 
|---|
| 217 | if( drawBtn( "出力", 560, 455, 150, 40 ) == true ) { | 
|---|
| 218 | putMapData(); | 
|---|
| 219 | tapC = 0; | 
|---|
| 220 | } | 
|---|
| 221 | break; | 
|---|
| 222 | } | 
|---|
| 223 |  | 
|---|
| 224 | setTimeout( mainProc, 80 ); | 
|---|
| 225 | } | 
|---|