CDW 戦闘用ミニマップを表示する


2021年 11月 22日
 
 
 なんと 40日あまりも目を使えない状態が続きました。

 目に細菌だかカビだか入ったらしくて、結局市販の抗菌目薬を 2週間程さして治しましたけど、眼科にも行きましたけど原因を特定してもらえず未だに原因は不明です。
 
 
 それでは続きですけど、本記事は目を悪くする前に作った部分です。

 戦闘表示画面の攻守の国だけ取り出して表示するミニマップ表示を作った。

 なぜこんな表示になっているのかと言うと、全マップを表示しながらサイコロアニメを表示すると FPS20出ないため、画面切り替えで戦闘表示だけする事にしてる。
 
 

 まず、それぞれの国のマップ y座標の上辺と下辺がいくつか調べて変数に格納しておく。

; 最上、最下ライン

	repeat ldb,1
	 ldhx1(cnt)=-1
	 ldhx2(cnt)=0
	 ldhy1(cnt)=-1
	 ldhy2(cnt)=0
	loop

	repeat hyb : cnty=cnt
	 repeat hxb : cntx=cnt
	  hn=hxb*cnty+cnt
	  repeat ldb,1
	   if map(hn)!cnt : continue
	   if ldhx1(cnt)=-1   : ldhx1(cnt)=cntx ; 最左ライン
	   if ldhx2(cnt)<cntx : ldhx2(cnt)=cntx ; 最右ライン
	  loop
	 loop
	loop

	repeat hyb : cnty=cnt
	 repeat hxb
	  hn=hxb*cnty+cnt
	  repeat ldb,1
	   if map(hn)!cnt : continue
	   if ldhy1(cnt)=-1   : ldhy1(cnt)=cnty ; 最上ライン
	   if ldhy2(cnt)<cnty : ldhy2(cnt)=cnty ; 最下ライン
	  loop
	 loop
	loop

 ldhx1(n) = その国の左端座標
 ldhx2(n) = その国の右端座標
 ldhy1(n) = その国の上端座標
 ldhy2(n) = その国の下端座標

 cnt値 = 国のNo.
 
 
 それから今回、改めて HEX枠表示の最外周もチェックするように改造した。

 表示されない外の枠線の事、今までは計測してなかった。


 
 

; 枠情報

#deffunc waku_set ; 国土境界の枠線データ

	repeat mb : hwd(cnt)=0 : loop ; 枠情報リセット

	repeat hyb : cnty=cnt
	 repeat hxb : cntx=cnt
	  mn=cnty*hxb+cnt
	  ;if cnt=hxb-1 and cnty\2=1 : continue ; 奇数列の右端は無し

	  n1=map(mn) : if n1<=0 : continue ; 国土では無い
	  repeat 6,1
	   hm2 mn,cnt
	    if hm2p=-1 { ; 地形無し
		 if cnt=1 { ; 右上
		  if cnty\2=0 and cntx=hxb-1 : hwd(mn)+=1 : continue
	      if cnty=0 : hwd(mn)+=1
	      continue
	     }
		 if cnt=2 { ; 右
		  if cnty\2=0 and cntx=hxb-1 : hwd(mn)+=2
		  if cnty\2=1 and cntx=hxb-2 : hwd(mn)+=2
		  continue
		 }
		 if cnt=3 { ; 右下
		  if cnty\2=0 and cntx=hxb-1 : hwd(mn)+=4 : continue
		  if cnty=hyb-1 : hwd(mn)+=4
	      continue
		 }
		 if cnt=4 { ; 左下
		  if cnty\2=0 and cntx=0 : hwd(mn)+=8 : continue
	      if cnty=hyb-1 : hwd(mn)+=8
	      continue
	     }
		 if cnt=5 { ; 左
		  if cntx=0 : hwd(mn)+=16
		  continue
		 }
		 if cnt=6 { ; 左上
		  if cnty\2=0 and cntx=0 : hwd(mn)+=32 : continue
	      if cnty=0 : hwd(mn)+=32
		  continue
		 }
		}
	   n2=map(hm2p)
	    if n1=n2 : continue ; 同じ国土
	   if cnt=1 : hwd(mn)+=1  ; 右上
	   if cnt=2 : hwd(mn)+=2  ; 右
	   if cnt=3 : hwd(mn)+=4  ; 右下
	   if cnt=4 : hwd(mn)+=8  ; 左下
	   if cnt=5 : hwd(mn)+=16 ; 左
	   if cnt=6 : hwd(mn)+=32 ; 左上
	  loop
	 loop
	loop

	return

 真ん中へんの{ }で書いてある部分が付け足した所、最外周を計測してチェックする。
 
 
 
 ldhx1(最左)、ldhx2(最右)、ldhy1(最上段)、ldhy2(最下段)の座標を元にして戦闘表示の時に抜き出して書き出します。

#deffunc bm_put ; バトルマップ表示

	if ldhx1(kln1)<ldhx1(kln2) : bmpx1=ldhx1(kln1) : else : bmpx1=ldhx1(kln2) ; 表示最上ライン
	if ldhx2(kln1)>ldhx2(kln2) : bmpx2=ldhx2(kln1) : else : bmpx2=ldhx2(kln2) ; 表示最下ライン
	bmpxk=bmpx2-bmpx1
	bmpxk2=(hxb/2)-bmpx1-(bmpxk/2) ; 描画幅

	if ldhy1(kln1)<ldhy1(kln2) : bmpy1=ldhy1(kln1) : else : bmpy1=ldhy1(kln2) ; 表示最上ライン
	if ldhy2(kln1)>ldhy2(kln2) : bmpy2=ldhy2(kln1) : else : bmpy2=ldhy2(kln2) ; 表示最下ライン
	if bmpy1\2=1 : bmpy1-
	bmpyk=bmpy2-bmpy1+1	; 間隔
	bmpyk2=(12-bmpyk)/2	; 描き始めy座標

	repeat bmpyk : cnty=cnt
	 repeat hxb : hn=(bmpy1+cnty)*hxb+cnt
	  gmulcolor 255,255,255
	   if map(hn)>0 : pn=lpd(map(hn)) : gmulcolor cld((pn-1)*3+1),cld((pn-1)*3+2),cld((pn-1)*3+3)

	  if map(hn)=kln1 : pos (bmpxk2+cnt)*hkx+(cnty\2)*15+hxp,(bmpyk2+cnty)*hky+hyp : celput 1,1
	  if map(hn)=kln2 : pos (bmpxk2+cnt)*hkx+(cnty\2)*15+hxp,(bmpyk2+cnty)*hky+hyp : celput 1,1
	 loop
	loop


; 枠表示

	gmulcolor 255,255,255
	repeat bmpyk : cnty=cnt ; y
	 repeat hxb : hn=(bmpy1+cnty)*hxb+cnt ; x
	  if hwd(hn)<=0 : continue
	   if map(hn)!kln1 and map(hn)!kln2 : continue
	   pos (bmpxk2+cnt)*30+(cnty\2)*15+hxp,(bmpyk2+cnty)*26+hyp
	   celput hww,hwd(hn) ; 国土境界の枠線
	 loop
	loop

	return

 攻め込む国と攻め込まれる国の 2国の最左、最右、最上段、最下段の座標を元に表示するマップの幅と高さを特定し、大きさに合わせて描き始め座標(bmpxk2、bmpyk2)を設定して必要部分だけのマップを描き出します。
 
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です