(C)WorldWideSoftware
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>へクス(ヘキサ)のマップ</title>
</head>
<body>
<canvas id="bg" width="480" height="480"></canvas><br>
<a href="http://www.wwsft.com">(C)WorldWideSoftware</a><br>
【説明】六角形を組み合わせて構成されるへクスのマップのサンプルです。
カーソルキーでカーソルを移動し、移動したマス(二次元配列)にフラグを立てています。<br>
<strong>※このバージョンは見た目に判りやすいように、六角形でなく四角形で描いています。<br>
※このようなマップを構成する方法はいくつかありますが、このサンプルは二次元配列でマップを管理しています。</strong><br>
<a href="hexa00src.html">ソースコードの確認</a>
<script>
//描画面(キャンバス)の準備
var cvs = document.getElementById("bg");
var ctx = cvs.getContext("2d");
ctx.lineWidth = 4;//線の太さ
//キー入力
var key = 0;
onkeydown = function(ev) { key = ev.keyCode; }
onkeyup = function(ev) { key = 0; }
//定数
var HEXA_W = 10;//横のマスの数 但し偶数行は横9マスとする
var HEXA_H = 10;//縦のマスの数
var HEXA_R = 48;//へクス間の画面上の距離(ドット数)
//二次元配列でマップを管理する
var hexa = [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 9],//←9は入れないマス
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 9],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 9],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 9],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 9],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
];
//へクスのキャンバス上の座標
//配列[y][x]の(x,y)の値を画面上の座標に変換する
function hexaX(x, y) {
var X = HEXA_R/2 + x*HEXA_R;
if(y%2 == 0) X += HEXA_R/2;
return X;
}
function hexaY(x, y) {
var Y = HEXA_R/2 + y*HEXA_R;
return Y;
}
//カーソル
var cur_x = 0;
var cur_y = 0;
function moveCur() {//方向キーでカーソルを移動する
var x = cur_x;
var y = cur_y;
if(key == 37) x--;
if(key == 39) x++;
if(key == 38) y--;
if(key == 40) y++;
if(0 <= x && x <= HEXA_W-1 && 0 <= y && y <=HEXA_H-1) {//移動可能な範囲
if(hexa[y][x] < 9) {//入れるマス
cur_x = x;
cur_y = y;
hexa[cur_y][cur_x] = 1;//移動した配列にフラグを立てる→描画の際に別の色にする
}
}
}
//メイン処理
var tmr = 0;
function mainProc() {
var s, x, y, X, Y;
tmr++;
moveCur();//カーソルの移動
//ヘキサの並んだBGを描く
ctx.fillStyle = "black";
ctx.fillRect(0, 0, 480, 480);
for(y=0; y<HEXA_H; y++) {
for(x=0; x<HEXA_W; x++) {
if(hexa[y][x] < 9) {
X = hexaX(x, y);
Y = hexaY(x, y);
ctx.strokeStyle = "gray";
if(hexa[y][x] == 1) ctx.strokeStyle = "gold";//移動したマスは別の色にする
ctx.strokeRect(X-20, Y-20, 40, 40);
}
}
}
//カーソルの表示
X = hexaX(cur_x, cur_y);
Y = hexaY(cur_x, cur_y);
ctx.strokeStyle = "lime";
s = 24+tmr%4;//カーソルのアニメーション
ctx.strokeRect(X-s, Y-s, s*2, s*2);
}
setInterval(mainProc, 100);
</script>
</body>
</html>
←動作確認に戻る