2015年02月10日

[HSP] 適当に作ったヘクスマップ描画ルーチン(改良版)

horizontal_hex_map_20150210.png vertical_hex_map_20150210.png

 正六角形を描けるかどうかはわからないけど、とりあえず数学の知識が要らない方法ということで。

#module
/* 横xi番目、縦yi番目のヘクスを横向きに描画 */
#deffunc draw_horizontal_hex int hex_width, int hex_height, int xi, int yi

if (xi \ 2) { ; 横奇数番目
yoffset = hex_height / 2 ; 縦方向の描画位置を半分ずらす
}
else {
yoffset = 0
}

xstart = ( hex_width / 4 * 3 ) * xi ; ヘクスをぴったり囲む四角形の左上X座標
ystart = hex_height * yi + yoffset ; ヘクスをぴったり囲む四角形の左上Y座標

; 左上の頂点から左回りで線を引いていく
line xstart + ( hex_width / 4 ), ystart, xstart, ystart + ( hex_height / 2 )
line xstart, ystart + ( hex_height / 2 ), xstart + ( hex_width / 4 ), ystart + hex_height
line xstart + ( hex_width / 4 ), ystart + hex_height, xstart + ( hex_width / 4 * 3 ), ystart + hex_height
line xstart + ( hex_width / 4 * 3 ), ystart + hex_height, xstart + hex_width, ystart + ( hex_height / 2 )
line xstart + hex_width, ystart + ( hex_height / 2 ), xstart + ( hex_width / 4 * 3 ), ystart
line xstart + ( hex_width / 4 * 3 ), ystart, xstart + ( hex_width / 4 ), ystart
return

/* 指定されたマス数・倍率のマップを横向きヘクスで描画 */
#deffunc draw_horizontal_hex_map int def_hex_width, int def_hex_height, int xnum, int ynum, int scale_map, int winid

; 描画に必要なサイズでウィンドウを初期化
map_width = ( ( def_hex_width / 4 * 3 * xnum ) + ( def_hex_width / 4 ) ) * scale_map + 1
map_height = ( def_hex_height * ynum ) * scale_map + 1
screen winid, map_width, map_height
title "ID " + winid

repeat xnum
xcnt = cnt
if ( xcnt \ 2 ) { ; 横奇数番目
ynum_cur = ynum - 1 ; 1個少なくてよい
}
else {
ynum_cur = ynum
}
repeat ynum_cur
draw_horizontal_hex ( def_hex_width * scale_map ), ( def_hex_height * scale_map ), xcnt, cnt
loop
loop
return "" + map_width + "," + map_height ; 描画サイズを返す
#global

#module
/* 横xi番目、縦yi番目のヘクスを縦向きに描画 */
#deffunc draw_vertical_hex int hex_width, int hex_height, int xi, int yi

if (yi \ 2) { ; 縦奇数番目
xoffset = hex_width / 2 ; 横方向の描画位置を半分ずらす
}
else {
xoffset = 0
}

xstart = hex_width * xi + xoffset ; ヘクスをぴったり囲む四角形の左上X座標
ystart = ( hex_height / 4 * 3 ) * yi ; ヘクスをぴったり囲む四角形の左上Y座標

; 上側の頂点から左回りで線を引いていく
line xstart + ( hex_width / 2 ), ystart, xstart, ystart + ( hex_height / 4 )
line xstart, ystart + ( hex_height / 4 ), xstart, ystart + ( hex_height / 4 * 3 )
line xstart, ystart + ( hex_height / 4 * 3 ), xstart + ( hex_width / 2 ), ystart + hex_height
line xstart + ( hex_width / 2 ), ystart + hex_height, xstart + hex_width, ystart + ( hex_height / 4 * 3 )
line xstart + hex_width, ystart + ( hex_height / 4 * 3 ), xstart + hex_width, ystart + ( hex_height / 4 )
line xstart + hex_width, ystart + ( hex_height / 4 ), xstart + ( hex_width / 2 ), ystart
return

/* 指定されたマス数・倍率のマップを縦向きヘクスで描画 */
#deffunc draw_vertical_hex_map int def_hex_width, int def_hex_height, int xnum, int ynum, int scale_map, int winid

; 描画に必要なサイズでウィンドウを初期化
map_width = def_hex_width * xnum * scale_map + 1
map_height = ( ( def_hex_height / 4 * 3 * ynum ) + ( def_hex_height / 4 ) ) * scale_map + 1

screen winid, map_width, map_height
title "ID " + winid

repeat ynum
ycnt = cnt
if ( ycnt \ 2 ) { ; 縦奇数番目
xnum_cur = xnum - 1 ; 1個少なくてよい
}
else {
xnum_cur = xnum
}
repeat xnum_cur
draw_vertical_hex ( def_hex_width * scale_map ), ( def_hex_height * scale_map ), cnt, ycnt
loop
loop
return "" + map_width + "," + map_height ; 描画サイズを返す
#global

; マス数・倍率・ウィンドウIDを指定してマップ描画
def_hex_width = 32 ; ヘクスのデフォルトの幅(横向き時。4で割れる数が良い)
def_hex_height = 28 ; ヘクスのデフォルトの高さ(横向き時。2で割れる数が良い)
xnum = 7 ; 横マス数
ynum = 8 ; 縦マス数
scale = 1 ; 描画倍率(正整数)
draw_horizontal_hex_map def_hex_width, def_hex_height, xnum, ynum, scale, 0
draw_vertical_hex_map def_hex_height, def_hex_width, ynum, xnum, scale, 1
stop

posted by chrono at 17:43| Comment(0) | TrackBack(0) | HSP
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/113491509
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック