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 | } |
---|