2021年 8月 10日
名前がまだ未決定なので、タイトルが CDW(キャラクターダイスウォーズ)になってます。
CDS(ストラテジー)にするか Wウォーズにするか、他に「賽ス戦略」という名前の候補もあります。
さて、今回は HEXの描き方から順々にやってみたいと思います。
まず画像を用意します、この HEXの大きさは横 22ドット、縦 23ドットです、正六角形である必要は無いと思います。
こんな感じで重なる部分のドットが同じになるようにします。
表示する時は、この場合だと、右に 10ドット、下に 16ドットずらす事になります。
この場合、線の幅が 2ドットですが、1ドットでも同じです、重なるように表示します。
連続で表示します。
ソースは次の通りです。
repeat hyb : cnt2=cnt ; y repeat hxb ; x pos cnt*20+(cnt2\2)*10,cnt2*16 : celput 1 loop loop
hxb = 横の数
hyb = 縦の数
横向き表示なので x列の座標は、単に +20します。
y列は偶数列と奇数列で 10ドットづつずれる訳です。
(cnt2\2)*10で、偶数列の場合は +0、奇数列の場合は +10されます。
斜線(\)は ¥です、割った余りを返します、表示関係で斜線になってますけど同じです。
例えば 4¥2だと 4を2で割った余りで 0、5¥2だと 5を 2で割った余り 1になります。
デザインの関係で、奇数列の右端は表示しない事にします。
repeat hyb : cnt2=cnt ; y repeat hxb ; x if cnt=hxb-1 and cnt2\2=1 : continue ; 奇数列の右端を描かない pos cnt*20+(cnt2\2)*10,cnt2*16 : celput 1,0 loop loop
if cnt=hxb-1 and cnt2\2=1 : continue で奇数列の右端をとばします。
デザインの関係で表示位置を中心に寄せます。
pos cnt*20+(cnt2\2)*10+9,cnt2*16+1: celput 1,0
+9ですね、縦も +1してます。
カーソル位置の HEX座標の取り方
スマホだとタップ座標という事になりますけど、カーソル座標が HEXのどの座標になるかです。
たぶん変数データを作って置いて、当たり判定みたいなやり方だと 1000マスもあるので遅くなるでしょう。
人によってはピッタリ六角形の座標を求める人もいるみたいですけど、自分には難しくて分かりませんし、幸いこの場合は小さな六角形の集まりなので、座標計算により大雑把な四角判定で良いでしょう。
表示が小さいので見難いですけど、できました。
ソースはこんな感じ。
mx=mousex : my=mousey repeat 1 mkn=-1 mky=(my-1)/16 ; HEX y座標 if mky\2=0 { if mx<9 or 540-9 <mx : break ; 偶数列の両端の余白 } if mky\2=1 { if mx<19 or 540-19<mx : break ; 奇数列の両端の余白 } mkx=(mx-9-(mky\2)*10)/20 ; HEX x座標 mkn=mky*hxb+mkx ; HEXの座標 if mkn>=hxb*hyb : mkn=-1 ; 最下段より下の場合 loop
mx,my = カーソルやタップの座標です。
mkn = その場所のHEX座標です、-1は無しという事ですけど 0は左上の HEX座標で使ってしまっているので。
mkx,mky = HEXの縦横の場所です、この場合 HEXの座標を 1次元の変数で扱ってますので擬似的ではあります。
mx-9というのは余白部分のカットです、my-1も同様です。
if mx<9 or 540-9 <mx : break ; 偶数列の両端の余白
if mx<19 or 540-19<mx : break ; 奇数列の両端の余白
左右の余白部分にカーソルがある場合は無しです、数値はザックリではありますが、小さいので問題無いでしょう。
hxb = HEXの横の数です。
このやり方の当たり判定は、たぶんこんな感じですけど
この場合は小さな HEXの集まりなので、そんなに問題にならないでしょう。
それよりも、この場合は高速化を優先します。
さらに判定 y座標を下にずらして
mky=(my-1-3)/16 ; HEX y座標
-3ずらして、これだとたぶん
こんな感じになると思うので、もう少し正確になるでしょうか。
追記:赤く塗ってますけど、これだと右端の 2ドットも判定外ですね。