2022年 1月 23日
今回は思考錯誤が予想され、報告する内容を覚えられないと思われるため、レポート形式でやってみたいと思います。
スマホの画面が小さいために、どうしても HEX数が少なく、そのためマップの変化にとぼしいので画面を大きくしてみたい。
もちろん、スマホの画面は大きくならないから、大きく作ったマップを「横スクロール」するようにしてみたい。
それではやってみましょう。
まず PCの HSP開発画面にて、ウインドウの大きさ自体を横倍に表示しながら作ってみます。
hsp3dish.iniファイルの内容を変えます。
横(wx=)540だったのを、とりあえず倍の大きさの 1080ドットにしてみます。
とりあえず、横の HEXを 19個から 38個に倍に設定してみます。
プログラム上は、全部この変数 hxbでやっているはずなので、何もなければできるはず。
1回でできました、やったぜ。
画面が大きいと地形に変化ができやすくなると思います。
1画面時の国の最大数は 40国だったので、2倍の 80国を試してみる。
あっさり出来ました、この大きさでも一杯に国を作ると地形に変化が無くなるのが分かると思います。
操作も問題無くできます、全部変数で扱ったためです。
ただ戦闘画面だけずれましたけど、これは最後には 1画面で表示するものなので大丈夫でしょう、wx(横のドット)/2(中心)座標とかかな。
1月 24日
今度は 3画面を試してみる。
3画面分の 1620ドットに設定
横の HEXの数は 55個、縦 32個、全 1760マス、国の数は 120で設定。
できました、壮観です。
半分の国数、60個くらいでやってみる。
左と右の大陸が丁度真ん中で細い通路で繋がるマップができました。
面白い良い地形だと思います。
マップの生成は問題無くできる事が分かったので、今度は画面の大きさを 1画面に戻してスクロール機能を実装します。
1月 25日
60国で生成、う~んやっぱり味があるなあ。
1月 29日
どうにも目の調子が戻らなくて 2日程休止しましたけど、その間に今度は 1画面にしてスクロールを実装する、そのやり方を考えてた。
やや難しかったけど、難所の取り組みにも大分慣れた、やっぱり分からない時は紙に書くのが良い、後は焦らずに日を使う事だ。
まず x座標の事だけ考える、y座標は変動しないので。
x座標の描き始め座標を LXとする LINE_Xだ。
この lxがスクロールの座標になる。
cx は cnt_xで、単に x座標、yhk は余白でスクロールするマップ左端とマップ右端の間の空白で、ここは海を表示する。
この場合マップの大きさは 5マスで、余白の大きさは 2マスとする。
さて、lxは描き始め座標なので lx = 2とした場合、マップの描き方は次のようになる。
この cxや yhkの座標は map(n)の参照座標になる、つまりマップデータに何が置いてあるか。
これを求める式を考える訳だ。
hxb = xの長さ、つまり HEXの横の長さ、上記の cxの長さ。
schk = 余白の長さ、上記の yhk。
bx = hxb + schk、全長さ。
mn = map(mn)、マップデータの座標。
mn = cx + lx ; map(mn)の位置x、cx = cnt_x
こんな感じで、まず mnの x座標を算出する訳だけど、cxは repeatの cnt値、lxはスクロールの現在位置。
例えば上記の図で言うと、cxは左端から描き始めるので、cnt=0の時、lx=2だから cx+lx=2で、mnは 2となり、map(2)を参照して左端を描く。
次にこれだと上記の図のように、余白の部分とその右側の座標を参照できないので次のようにする。
if hxb<=mn and mn<bx { 処理 } ; 間の海の場合
if bx<=mn : mn-=bx ; 海の右側の場合
余白の場合は mnが hxb、つまりマップ HEXの長さを越える場合と bx、つまり全長より短い間の場合に処理。
余白を越える部分は、単に mnから bx、つまり全長を引けば良い。
長々と説明したけど、コードで書くとこうなる。
; HEX表示 bx=hxb+schk ; 全横の長さ repeat hyb : cy=cnt ; y repeat whb : cx=cnt ; x gmulcolor 255,255,255 hx=cx*hkx+(cy\2)*15+hxp ; HEXのx座標 hy=cy*hky+hyp ; HEXのy座標 mn=cx+lx ; map(n)の位置x if hxb<=mn and mn<bx { ; 間の海の場合 gmode 3,,,128 pos hx,hy : celput seaw ; 海 continue } if bx<=mn : mn-=bx ; 海の右側の場合 mn=hxb*cy+mn ; 最終のmap(n)の位置 if map(mn)>0 { ; カラー pldn=map(mn) : pn=lpd(pldn) if pn>0 : gmulcolor cld((clpn(pn)-1)*3+1),cld((clpn(pn)-1)*3+2),cld((clpn(pn)-1)*3+3) } if map(mn)>0 : pos hx,hy : celput hexw,1 ; HEX gmode 3,,,128 if map(mn)=-2: pos hx,hy : celput seaw ; 海 gmode 2 if map(mn)=-3: pos hx,hy : celput lakw ; 湖 if map(mn)=-4: pos hx,hy : celput mntw ; 山 c+ loop c+=hxb-lx loop
whbと言うのは、表示する HEXの横の数、hxbはマップの全 HEX数のため、つまり 2画面の HEX数は 37個だけど、画面表示の HEXは 19個。
mn=hxb*cy+mn ; 最終のmap(n)の位置
この部分で最終的に y座標に求めた x座標を足して最終的なmap(mn)の座標を出している。
毎度の事ながら HSPDishの制約で 2次元配列では無くて 1次元配列でmapデータを扱っているため。
繰り返し説明になるけど、2次元配列が使えない訳じゃなくて、多量の2次元配列データに書き込みすると、なぜかエラーになる。
では、この状態で lxを適当に足してマップ表示してみよう。
余白部分はマップ No.を描いてないので分かりやすいと思う。
マップ表示の左端が濃い色になっていて、これはまだバグを直してない(真ん中辺の紫の 1HEX)
1月 30日
今度は枠線表示を調整。
それと間の海を 1マスにしてみた。
右上の緑が操作プレイヤーで少し枠線の色が濃い(白い)、分かり難いけど下のサイコロ表示で枠線で囲ってある色の国。
ソースはこんな感じ。
; HEX枠表示 gmulcolor 224,224,224 repeat hyb : cy=cnt ; y repeat whb : cx=cnt ; x mn=cx+lx ; map(n)の位置x if hxb<=mn and mn<bx : continue ; 間の場合 if bx<=mn : mn-=bx ; 間の右側の場合 mn=hxb*cy+mn ; 最終のmap(n)の位置 if hwd(mn)<=0 : continue hx=cx*hkx+(cy\2)*15+hxp ; HEXのx座標 hy=cy*hky+hyp pos hx,hy : celput hww,hwd(mn) ; 国土境界の枠線 loop loop ; HEX枠表示、プレイヤー選択 gmulcolor 255,255,255 repeat hyb : cy=cnt ; y repeat whb : cx=cnt ; x mn=cx+lx ; map(n)の位置x if hxb<=mn and mn<bx : continue ; 間の場合 if bx<=mn : mn-=bx ; 間の右側の場合 mn=hxb*cy+mn ; 最終のmap(n)の位置 if hwd(mn)<=0 : continue ; 枠線無し if lpd(map(mn))!pn1 : continue ; 操作者以外 hx=cx*hkx+(cy\2)*15+hxp ; HEXのx座標 hy=cy*hky+hyp pos hx,hy : celput hww,hwd(mn) ; 国土境界の枠線 loop loop
一度ノーマルの色で枠線を描いてから、濃い(白い)色で操作プレイヤーだけもう一度描いている。
これも一度で描けた方が高速なんだけど、HEX表示は各表示が重なっているので仕方ない。
選択した国のカラーを濃くする表示を調整する。
これは選択した国 1と 2(kln1、kln2)でそれぞれ表示ルーチンを作ってたんだけど、今回は最初の国土表示の時に合わせる事にした。
ソースはこう。
; HEX表示 bx=hxb+schk ; 全横の長さ repeat hyb : cy=cnt ; y repeat whb : cx=cnt ; x gmulcolor 255,255,255 hx=cx*hkx+(cy\2)*15+hxp ; HEXのx座標 hy=cy*hky+hyp ; HEXのy座標 mn=cx+lx ; map(n)の位置x if hxb<=mn and mn<bx { ; 間の海の場合 gmode 3,,,128 pos hx,hy : celput seaw ; 海 gmode 2 continue } if bx<=mn : mn-=bx ; 海の右側の場合 mn=hxb*cy+mn ; 最終のmap(n)の位置 mpn=map(mn) ; マップデータ repeat 1 ; カラー if mpn<=0 : break ; 国土では無い pn=lpd(mpn) if pn<=0 : break ; プレイヤーが無い if mpn=kln1 or mpn=kln2 { ; 選択時 gmulcolor cld((clpn(pn)-1)*3+1)*sen_cl/100,cld((clpn(pn)-1)*3+2)*sen_cl/100,cld((clpn(pn)-1)*3+3)*sen_cl/100 break } gmulcolor cld((clpn(pn)-1)*3+1),cld((clpn(pn)-1)*3+2),cld((clpn(pn)-1)*3+3) loop if mpn>0 : pos hx,hy : celput hexw,1 ; HEX gmode 3,,,128 if mpn=-2: pos hx,hy : celput seaw ; 海 gmode 2 if mpn=-3: pos hx,hy : celput lakw ; 湖 if mpn=-4: pos hx,hy : celput mntw ; 山 c+ loop c+=hxb-lx loop
真ん中辺の repeat 1 ; カラー で囲まれた所、ここで通常表示と選択表示を合わせて、表示は 1回で済むようにした。
減衰率 sen_cl = 70で、70%の色表示になるようにしている。
map(mn)を mpnに置き換えている、何回か map(mn)を使うので少し早くなるか。
長くなったので 1回提出します。