CDW ゲームスタート画面を作った


2022年 5月 27日
 
 
 ゲームスタート時に、色々な設定をできるスタート画面を作った。


 
 
 設定できるのは「マップサイズ」「プレイヤー人数」「操作人数」「国の数」「キャラクターユニットの登場数」「ユーザーカラーの使用」「マップ表示速度」「戦闘表示速度」「戦闘表示種類」となっている。
 
 

 SUI(スクロール・ユーザー・インターフェイス、適当)の考えにより、画面は縦にスクロールする。


 
 
 マップサイズは画面の x(横)の大きさ事で、1~3画面まで設定できる。

 プレイヤー数は勢力数の事で、最大 20勢力で争う事ができる。

 操作人数は操作する勢力数の事で、普通は 1人、これは最大勢力数まで、つまり全員操作まで設定できる。

 LANDは国の数、各勢力の国数が均等になるように、勢力数の倍数になるようにしている。

 キャラクターユニットは、0なら出現無し、1~3はそのレベルのキャラクターユニットまで出現する。

 レベル 1なら、Lv1の攻撃指揮官、防御指揮官、軍師、民生官、君主が出る。

 ゲームレベルはゲームの難易度を設定する、1が簡単~5が難しい。

 ユーザーカラーは USE(使う)の時にオリジナルカラーをプレイヤー 1に設定できる。

 オリジナルカラーは元の色はシルバーで、その色を変えて使う。

 ランダムの場合は 20色をバラバラに割り当てる。

 マップの表示ウエイトを設定できます。

 戦闘の表示ウエイトを設定できます。

 戦闘表示の種類、画面切り替え ← → 簡易表示の設定をします。
 
 
 以上を任意に設定して右下の STARTを押すとゲームが始まります。


 
 
 
 ソース

////////// ゲームスタート ///////////

*game_start_ini

	gs_ly=0 ; スクロール座標

	gs_cly1=109 ; 背景分割ライン1
	gs_cly2=829 ; 背景分割ライン2

	gs_fgx1=245 ; 数字のケタ
	gs_fgx2=270-50-1
	gs_fgx3=270+1
	gs_fgx4=270-75-2
	gs_fgx5=270-25
	gs_fgx6=270+25+2

; 矢印上下
	gs_arux=540/2-192/2
	gs_aruy=gs_cly1-23
	gs_ardx=gs_arux
	gs_ardy=gs_cly2+8

	gs_arux1=170
	gs_arux2=370
	gs_aruy1=gs_aruy-4
	gs_aruy2=gs_cly1-3
	gs_ardx1=170
	gs_ardx2=370
	gs_ardy1=gs_ardy-4
	gs_ardy2=gs_ardy1+24


; キー入力
	dim gs_kx1,11
	dim gs_kx2,11
	dim gs_ky1,11
	dim gs_ky2,11

; MAP SIZE
	gs_sy1=117

	gs_msx1=102
	gs_msx2=245
	gs_msx3=388
	gs_msy1=gs_sy1+79

; PLAYR
	gs_sy2=gs_sy1+185
	 gs_kx1(1)=70
	 gs_kx2(1)=gs_kx1(1)+130
	 gs_ky1(1)=gs_sy2+46
	 gs_ky2(1)=gs_ky1(1)+120
	 gs_kx1(2)=340
	 gs_kx2(2)=gs_kx1(2)+130
	 gs_ky1(2)=gs_ky1(1)
	 gs_ky2(2)=gs_ky2(1)

; OPERATION PLAYER
	gs_sy3=gs_sy2+185
	 gs_kx1(3)=70
	 gs_kx2(3)=gs_kx1(3)+130
	 gs_ky1(3)=gs_sy3+46
	 gs_ky2(3)=gs_ky1(3)+120
	 gs_kx1(4)=340
	 gs_kx2(4)=gs_kx1(4)+130
	 gs_ky1(4)=gs_ky1(3)
	 gs_ky2(4)=gs_ky2(3)

; LAND
	gs_sy4=gs_sy3+183
	 gs_kx1(5)=70
	 gs_kx2(5)=gs_kx1(5)+130
	 gs_ky1(5)=gs_sy4+46
	 gs_ky2(5)=gs_ky1(5)+120
	 gs_kx1(6)=340
	 gs_kx2(6)=gs_kx1(6)+130
	 gs_ky1(6)=gs_ky1(5)
	 gs_ky2(6)=gs_ky2(5)

; CHARACTER UNIT
	gs_sy5=gs_sy4+197

	dim gs_cux,4
	k=109
	gs_cux(0)=84
	gs_cux(1)=gs_cux(0)+k
	gs_cux(2)=gs_cux(1)+k
	gs_cux(3)=gs_cux(2)+k
	gs_cuy1=gs_sy5+83

; GAME LEVEL
	gs_sy6=gs_sy5+201

	dim gs_lvx,6
	k=92
	gs_lvx(1)=61
	gs_lvx(2)=gs_lvx(1)+k
	gs_lvx(3)=gs_lvx(2)+k
	gs_lvx(4)=gs_lvx(3)+k
	gs_lvx(5)=gs_lvx(4)+k
	gs_lvy1=gs_sy6+83

; COLOR CHANGE
	gs_sy8=gs_sy6+202;246

	gs_sy9=gs_sy8+73
	gs_c9x1=115	; USE
	gs_c9x2=288	; RANDOM

	gs_ccx1=94	; ゲージ
	gs_ccy1=gs_sy9+74
	gs_ccy2=gs_sy9+149
	gs_ccy3=gs_sy9+224

; Map display speed
	gs_sy10=gs_sy9+344

	dim gs_mdx,6
	k=92
	gs_mdx(1)=61
	gs_mdx(2)=gs_mdx(1)+k
	gs_mdx(3)=gs_mdx(2)+k
	gs_mdx(4)=gs_mdx(3)+k
	gs_mdx(5)=gs_mdx(4)+k
	gs_mdy1=gs_sy10+83

; Battle display speed
	gs_sy11=gs_sy10+199

	dim gs_bdx,6
	k=92
	gs_bdx(1)=61
	gs_bdx(2)=gs_bdx(1)+k
	gs_bdx(3)=gs_bdx(2)+k
	gs_bdx(4)=gs_bdx(3)+k
	gs_bdx(5)=gs_bdx(4)+k
	gs_bdy1=gs_sy11+83

; 戦闘表示 FULL SIMPLE
	gs_sy12=gs_sy11+199

	gs_sy13=gs_sy12+73
	gs_c13x1=115 ; FULL
	gs_c13x2=288 ; SIMPLE


	gs_cckf=283.0/176.0 ; 間隔

	gs_ccarlx=38	; ←
	gs_ccarrx=460	; →

	gs_lyb=1430 ; スクロール最下段

	gs_btx1=26 	; back
	gs_bty1=861

	gs_btx2=277	; start
	gs_bty2=861

	return


#deffunc gs_fg_put int _gs_fg_putn

	n=_gs_fg_putn

	s=str(n)
	f=strlen(s)

	if f=1 { ; 1ケタ
	 pos gs_fgx1,y+25 : celput fg50grw,n
	 return
	}

	if f=2 { ; 2ケタ
	 n2=n/10 : pos gs_fgx2,y+25 : celput fg50grw,n2
	 n2=n\10 : pos gs_fgx3,y+25 : celput fg50grw,n2
	 return
	}

	if f=3 { ; 3ケタ
	 n2=n/100 : pos gs_fgx4,y+25 : celput fg50grw,n2
	 n2=n/10  : n2=n2\10 : pos gs_fgx5,y+25 : celput fg50grw,n2
	 n2=n\10  : pos gs_fgx6,y+25 : celput fg50grw,n2
	 return
	}

	return


#deffunc gs_put

	gmode 2

; 背景
	pos 0,gs_cly1 : celput gs3Bw

; MAP SIZE
	y=gs_sy1-gs_ly
	if y>0 and y<gs_cly2 : pos 167,y : celput gsft4w

	y=gs_msy1-gs_ly : if y>0 and y<gs_cly2 {

	 pos gs_msx1   ,y    : celput fg50orw,1
	 pos gs_msx2   ,y    : celput fg50orw,2
	 pos gs_msx3   ,y    : celput fg50orw,3

	 if scf=1 : pos gs_msx1-25,y-25 : celput gswd1w,0,0.8,0.8
	 if scf=2 : pos gs_msx2-25,y-25 : celput gswd1w,0,0.8,0.8
	 if scf=3 : pos gs_msx3-25,y-25 : celput gswd1w,0,0.8,0.8
	}

; ALL PLAYER
	y=gs_sy2-gs_ly
	if y>0 and y<gs_cly2 : pos 180,y : celput gsft5w

	y+=56 : if y>0 and y<gs_cly2 {
	 pos 100,y : celput gsar1w,0,0.7,0.7
	 pos 368,y : celput gsar2w,0,0.7,0.7
	 gs_fg_put plb
	}

; OPERATION PLAYER
	y=gs_sy3-gs_ly
	if y>0 and y<gs_cly2 : pos 47,y : celput gsft6w

	y+=56 : if y>0 and y<gs_cly2 {
	 pos 100,y : celput gsar1w,0,0.7,0.7
	 pos 368,y : celput gsar2w,0,0.7,0.7
	 gs_fg_put spln
	}

; LAND
	y=gs_sy4-gs_ly
	if y>0 and y<gs_cly2 : pos 210,y : celput gsft7w

	y+=56 : if y>0 and y<gs_cly2 {
	 pos 100,y : celput gsar1w,0,0.7,0.7
	 pos 368,y : celput gsar2w,0,0.7,0.7
	 gs_fg_put ldb
	}

; CHARACTER UNIT
	y=gs_sy5-gs_ly
	if y>0 and y<gs_cly2 : pos 67,y : celput gsft8w

	y=gs_cuy1-gs_ly : if y>0 and y<gs_cly2 {

;boxf gs_cux1-25,y-25,gs_cux1+72,y+72
	 repeat 4
	  pos gs_cux(cnt),y : celput fg50orw,cnt
	 loop
	 pos gs_cux(cusf)-25,y-25 : celput gswd1w,0,0.8,0.8
	}

; GAME LEVEL
	y=gs_sy6-gs_ly
	if y>0 and y<gs_cly2 : pos 130,y : celput gsft9w

	y=gs_lvy1-gs_ly : if y>0 and y<gs_cly2 {
	 repeat 5,1
	  pos gs_lvx(cnt),y : celput fg50blw,cnt
	 loop
	 pos gs_lvx(glv)-25,y-25 : celput gswd1w,0,0.8,0.8
	}

; FULL DICE
	y=gs_sy7-gs_ly
	if y>0 and y<gs_cly2 : pos 155,y : celput gsft11w

	y=gs_diy1-gs_ly : if y>0 and y<gs_cly2 {

	 pos gs_dix1,y    : celput fg50grw,8
	 pos gs_dix2,y    : celput fg50grw,1
	 pos gs_dix2+48,y : celput fg50grw,2
	 pos gs_dix3,y    : celput fg50grw,1
	 pos gs_dix3+48,y : celput fg50grw,6

	 if dcb=8  : pos gs_dix1-44,y-41 : celput gswd1w,0,1.1,1.1
	 if dcb=12 : pos gs_dix2-17,y-41 : celput gswd1w,0,1.1,1.1
	 if dcb=16 : pos gs_dix3-18,y-41 : celput gswd1w,0,1.1,1.1
	}

; COLOR CHANGE
	y=gs_sy8-gs_ly
	 if y>0 and y<gs_cly2 : pos 131,y : celput gsft12w

	y=gs_sy9-gs_ly
	 if y>0 and y<gs_cly2 {

	  pos gs_c9x1,y : celput gsft13w
	  pos gs_c9x2,y : celput gsft14w
	  if clcgf=1 : pos gs_c9x1-42,y+2 : celput guidew ; USE
	  if clcgf=0 : pos gs_c9x2-42,y+2 : celput guidew ; RANDOM
	}


; RGBゲージ
	y=gs_ccy1-gs_ly : if y>0 and y<gs_cly2 /*and clcgf=1*/ {
	 color cld(55),cld(56),cld(57)
	  k=int(double(cld(55)-48)*gs_cckf)
	   boxf gs_ccx1+35,y+7,gs_ccx1+35+k,y+49
	 pos gs_ccx1,y   : celput gaugew,0,0.8,0.8
	 pos gs_ccarlx,y : celput gsar1w,0,0.4,0.4
	 pos gs_ccarrx,y : celput gsar2w,0,0.4,0.4
	 pos gs_ccx1+14+k,y+5 : celput gspow
	}
	y=gs_ccy2-gs_ly : if y>0 and y<gs_cly2 /*and clcgf=1*/ {
	 color cld(55),cld(56),cld(57)
	  k=int(double(cld(56)-48)*gs_cckf)
	   boxf gs_ccx1+35,y+7,gs_ccx1+35+k,y+49
	 pos gs_ccx1,y   : celput gaugew,0,0.8,0.8
	 pos gs_ccarlx,y : celput gsar1w,0,0.4,0.4
	 pos gs_ccarrx,y : celput gsar2w,0,0.4,0.4
	 pos gs_ccx1+14+k,y+5 : celput gspow
	}
	y=gs_ccy3-gs_ly : if y>0 and y<gs_cly2 /*and clcgf=1*/ {
	 color cld(55),cld(56),cld(57)
	  k=int(double(cld(57)-48)*gs_cckf)
	   boxf gs_ccx1+35,y+7,gs_ccx1+35+k,y+49
	 pos gs_ccx1,y   : celput gaugew,0,0.8,0.8
	 pos gs_ccarlx,y : celput gsar1w,0,0.4,0.4
	 pos gs_ccarrx,y : celput gsar2w,0,0.4,0.4
	 pos gs_ccx1+14+k,y+5 : celput gspow
	}

; Map display speed
	y=gs_sy10-gs_ly
	if y>0 and y<gs_cly2 : pos 40,y : celput gsft16w

	y=gs_mdy1-gs_ly : if y>0 and y<gs_cly2 {
	 repeat 5,1
	  pos gs_mdx(cnt),y : celput fg50piw,cnt
	 loop
	 pos gs_mdx(bpwt1f)-25,y-25 : celput gswd1w,0,0.8,0.8
	}

; Battle display speed
	y=gs_sy11-gs_ly
	if y>0 and y<gs_cly2 : pos 113,y : celput gsft17w

	y=gs_bdy1-gs_ly : if y>0 and y<gs_cly2 {
	 repeat 5,1
	  pos gs_bdx(cnt),y : celput fg50piw,cnt
	 loop
	 pos gs_bdx(bpwt2f)-25,y-25 : celput gswd1w,0,0.8,0.8
	}

; 戦闘表示
	y=gs_sy12-gs_ly
	 if y>0 and y<gs_cly2 : pos 80,y : celput gsft18w

	y=gs_sy13-gs_ly
	 if y>0 and y<gs_cly2 {
	  pos gs_c13x1,y : celput gsft19w
	  pos gs_c13x2,y : celput gsft20w
	  if btl_putf=0 : pos gs_c13x1-42,y+2 : celput guidew ; USE
	  if btl_putf=1 : pos gs_c13x2-42,y+2 : celput guidew ; RANDOM
	}



; 背景
	pos 0,0 : celput gs3Aw
	pos 0,gs_cly2 : celput gs3Cw

; 枠
	gmulcolor 255,255,255

	repeat 12
	 pos 40+cnt*40,0   : celput gswk5w
	 pos 40+cnt*40,920 : celput gswk8w
	loop
	repeat 22
	 pos 0  ,40+cnt*40 : celput gswk6w
	 pos 500,40+cnt*40 : celput gswk7w
	loop
	pos 0  ,0   : celput gswk1w
	pos 500,0   : celput gswk2w
	pos 0  ,920 : celput gswk3w
	pos 500,920 : celput gswk4w

; game_start
	pos  77,24  : celput gsft1w

; back
	pos gs_btx1,gs_bty1 : celput gsbt1w
	pos 96,878 : celput gsft3w

; start
	pos gs_btx2,gs_bty2 : celput gsbt1w
	pos 335,878 : celput gsft2w

	pos gs_arux,gs_aruy : celput gsar3w
	pos gs_ardx,gs_ardy : celput gsar3w,2

	return


#deffunc gs_key_syo

	switch gsky
	 case 1 ; プレイヤー数
	  plb-
	  if plb<2 : plb=2
	  if ldb<ldba : ldb=ldba ;: ldb+=plb-(ldb\plb)
	  ldb-=ldb\plb
	  if ldb<ldba : ldb+=plb-(ldb\plb)
	  if plb<spln : spln=plb
	 swbreak
	 case 2
	  plb+
	  if plb>20 : plb=20
	  if ldb\plb=0 : swbreak
	  ldb+=plb-(ldb\plb)
	  if ldb>ldbb : ldb-=plb
	 swbreak
	 case 3 ; 操作人数
	  spln- : if spln<1 : spln=1
	 swbreak
	 case 4
	  spln+ : if spln>plb : spln=plb
	 swbreak
	 case 5 ; 国の数
	  ldb-
	   if ldb<plb : ldb=plb : swbreak ; 最小人数
	  if ldb<ldba : ldb=ldba ; 最小国数
	  ldb-=ldb\plb
	  if ldb<ldba : ldb+=plb-(ldb\plb)
	 swbreak
	 case 6
	  ldb+=plb-(ldb\plb)
	  if ldb>ldbb : ldb-=plb : swbreak
	 swbreak
	 case 11 ; 画面数
	  scf=1 : ldba=2 : ldbb=40
	  if ldb<ldba : ldb=ldba : if ldb\plb!0 : ldb+=plb-(ldb\plb)
	  if ldb>ldbb : ldb=ldbb : if ldb\plb!0 : ldb-=ldb\plb
	 swbreak
	 case 12
	  scf=2 : ldba=20 : ldbb=80
	  if ldb<ldba : ldb=ldba : if ldb\plb!0 : ldb+=plb-(ldb\plb)
	  if ldb>ldbb : ldb=ldbb : if ldb\plb!0 : ldb-=ldb\plb
	 swbreak
	 case 13
	  scf=3 : ldba=40 : ldbb=120
	  if ldb<ldba : ldb=ldba : if ldb\plb!0 : ldb+=plb-(ldb\plb)
	  if ldb>ldbb : ldb=ldbb : if ldb\plb!0 : ldb-=ldb\plb
	 swbreak

; CHARACTER UNIT
	 case 14 : cusf=0 : swbreak
	 case 15 : cusf=1 : swbreak
	 case 16 : cusf=2 : swbreak
	 case 17 : cusf=3 : swbreak

; GAAME LEVEL
	 case 19 : glv=1 : swbreak
	 case 20 : glv=2 : swbreak
	 case 21 : glv=3 : swbreak
	 case 22 : glv=4 : swbreak
	 case 23 : glv=5 : swbreak

; FULL DICE
	 case 24 : dcb=8  : swbreak
	 case 25 : dcb=12 : swbreak
	 case 26 : dcb=16 : swbreak

; COLOR CHANGE
	 case 27 : clcgf=1 : swbreak ; USE
	 case 28 : clcgf=0 : swbreak ; RANDOM

	 case 29 : cld(55)=int(double(mx-gs_ccx1-35)*(176.0/283.0)+48) : swbreak ; RED
	 case 30 : cld(56)=int(double(mx-gs_ccx1-35)*(176.0/283.0)+48) : swbreak ; GREEN
	 case 31 : cld(57)=int(double(mx-gs_ccx1-35)*(176.0/283.0)+48) : swbreak ; BLUE

	 case 32 ; R+
	  cld(55)- : if cld(55)<48 : cld(55)=48
	 swbreak
	 case 33 ; R+
	  cld(55)+ : if cld(55)>224 : cld(55)=224
	 swbreak
	 case 34 ; G-
	  cld(56)- : if cld(56)<48 : cld(56)=48
	 swbreak
	 case 35 ; G+
	  cld(56)+ : if cld(56)>224 : cld(56)=224
	 swbreak
	 case 36 ; B-
	  cld(57)- : if cld(57)<48 : cld(57)=48
	 swbreak
	 case 37 ; B+
	  cld(57)+ : if cld(57)>224 : cld(57)=224
	 swbreak

	 case 39 : mainf=5 : swbreak ; start

; Map display speed
	 case 40 : bpwt1f=1 : swbreak
	 case 41 : bpwt1f=2 : swbreak
	 case 42 : bpwt1f=3 : swbreak
	 case 43 : bpwt1f=4 : swbreak
	 case 44 : bpwt1f=5 : swbreak

; Battle display speed
	 case 45 : bpwt2f=1 : swbreak
	 case 46 : bpwt2f=2 : swbreak
	 case 47 : bpwt2f=3 : swbreak
	 case 48 : bpwt2f=4 : swbreak
	 case 49 : bpwt2f=5 : swbreak

; 戦闘表示
	 case 50 : btl_putf=0 : swbreak
	 case 51 : btl_putf=1 : swbreak
	swend

	if cusf=3 and ldb<15 : cusf=2
	if cusf=2 and ldb<10 : cusf=1
	if cusf=1 and ldb<5  : cusf=0



	return


*game_start

	if scf=1 : ldba=2  : ldbb=40
	if scf=2 : ldba=20 : ldbb=80
	if scf=3 : ldba=40 : ldbb=120

	kwc=5 : gskyk=10 : gskyc=0
	repeat

	k=0 : mx=0 : my=0 ; 入力リセット
	repeat 1
	 if kwc>0 : kwc- : break ; ウエイト
	 mx=mousex : my=mousey ; カーソル位置
	 stick k,256 ; マウスボタン、スマホクリック
	loop

; キー位置
	gsky=0 : my2=my+gs_ly
	repeat 1

; スクロール矢印上下
	 if gs_arux1<mx and gs_aruy1<my and gs_arux2>mx and gs_aruy2>my and k=256 {
	  gs_ly-=10 : if gs_ly<0 : gs_ly=0
	  break
	 }
	 if gs_ardx1<mx and gs_ardy1<my and gs_ardx2>mx and gs_ardy2>my and k=256 {
	  gs_ly+=10 : if gs_ly>=gs_lyb : gs_ly=gs_lyb
	  break
	 }

	 if gs_btx1+2<mx and gs_bty1+2<my and gs_btx1+235>mx and gs_bty1+66>my : gsky=38 : break ; back
	 if gs_btx2+2<mx and gs_bty2+2<my and gs_btx2+235>mx and gs_bty2+66>my : gsky=39 : break ; start

	 if my<gs_cly1 : break ; 画面外上
	 if my>gs_cly2 : break ; 画面外下

; プレイヤー数
	 if gs_msx1-25<mx and gs_msy1-25<my2 and gs_msx1+72>mx and gs_msy1+72>my2 : gsky=11 : break
	 if gs_msx2-25<mx and gs_msy1-25<my2 and gs_msx2+72>mx and gs_msy1+72>my2 : gsky=12 : break
	 if gs_msx3-25<mx and gs_msy1-25<my2 and gs_msx3+72>mx and gs_msy1+72>my2 : gsky=13 : break

; CHARACTER UNIT
	 repeat 4
	  if gs_cux(cnt)-25<mx and gs_cuy1-25<my2 and gs_cux(cnt)+72>mx and gs_cuy1+72>my2 {
	   gsky=14+cnt : break
	  }
	 loop

; GAAME LEVEL
	 repeat 5,1
	  if gs_lvx(cnt)-25<mx and gs_lvy1-25<my2 and gs_lvx(cnt)+72>mx and gs_lvy1+72>my2 {
	   gsky=18+cnt : break
	  }
	 loop

; FULL DICE
	 if gs_dix1-46<mx and gs_diy1-41<my2 and gs_dix1+89 >mx and gs_diy1+92>my2 : gsky=24 : break
	 if gs_dix2-18<mx and gs_diy1-41<my2 and gs_dix2+117>mx and gs_diy1+92>my2 : gsky=25 : break
	 if gs_dix3-19<mx and gs_diy1-41<my2 and gs_dix3+116>mx and gs_diy1+92>my2 : gsky=26 : break

; COLOR CHANGE
	 if gs_c9x1-15<mx and gs_sy9-10<my2 and gs_c9x1+101>mx and gs_sy9+50>my2 : gsky=27 : break ; USE
	 if gs_c9x2-15<mx and gs_sy9-10<my2 and gs_c9x2+206>mx and gs_sy9+50>my2 : gsky=28 : break ; RANDOM

	 ;if clcgf=1 { ; USE
	  if gs_ccx1+35<=mx and gs_ccy1+4<my2 and gs_ccx1+35+283>=mx and gs_ccy1+51>my2 : gsky=29 : break ; RED
	  if gs_ccx1+35<=mx and gs_ccy2+4<my2 and gs_ccx1+35+283>=mx and gs_ccy2+51>my2 : gsky=30 : break ; GREEN
	  if gs_ccx1+35<=mx and gs_ccy3+4<my2 and gs_ccx1+35+283>=mx and gs_ccy3+51>my2 : gsky=31 : break ; BLUE

	  if gs_ccarlx-9<mx and gs_ccy1-5<my2 and gs_ccarlx+48>mx and gs_ccy1+61>my2 : gsky=32 : break ; R-
	  if gs_ccarrx-7<mx and gs_ccy1-5<my2 and gs_ccarrx+50>mx and gs_ccy1+61>my2 : gsky=33 : break ; R+
	  if gs_ccarlx-9<mx and gs_ccy2-5<my2 and gs_ccarlx+48>mx and gs_ccy2+61>my2 : gsky=34 : break ; G-
	  if gs_ccarrx-7<mx and gs_ccy2-5<my2 and gs_ccarrx+50>mx and gs_ccy2+61>my2 : gsky=35 : break ; G+
	  if gs_ccarlx-9<mx and gs_ccy3-5<my2 and gs_ccarlx+48>mx and gs_ccy3+61>my2 : gsky=36 : break ; B-
	  if gs_ccarrx-7<mx and gs_ccy3-5<my2 and gs_ccarrx+50>mx and gs_ccy3+61>my2 : gsky=37 : break ; B+
	 ;}

; Map display speed
	 repeat 5,1
	  if gs_mdx(cnt)-25<mx and gs_mdy1-25<my2 and gs_mdx(cnt)+72>mx and gs_mdy1+72>my2 {
	   gsky=39+cnt : break
	  }
	 loop

; Battle display speed
	 repeat 5,1
	  if gs_bdx(cnt)-25<mx and gs_bdy1-25<my2 and gs_bdx(cnt)+72>mx and gs_bdy1+72>my2 {
	   gsky=44+cnt : break
	  }
	 loop

; 戦闘表示
	 if gs_c13x1-20<mx and gs_sy13-10<my2 and gs_c13x1+130>mx and gs_sy13+50>my2 : gsky=50 : break ; 通常表示
	 if gs_c13x2-20<mx and gs_sy13-10<my2 and gs_c13x2+180>mx and gs_sy13+50>my2 : gsky=51 : break ; 簡易表示


; 矢印
	 repeat 8
	  if gs_kx1(cnt+1)<mx and gs_ky1(cnt+1)<gs_ly+my and gs_kx2(cnt+1)>mx and gs_ky2(cnt+1)>gs_ly+my {
	   gsky=cnt+1 : break
	  }
	 loop
	loop

; 押してる
	repeat 1
	 if k!256 : break
	 if kf=0 : kf=1 : kepy=my : keply=gs_ly : gsky=0

	 if kf=1 {
	  if kepy-my>18 or my-kepy>18 : kf=2 ; スクロールモード

	  gskyc+
	  if gskyc=gskyk { ; キーウエイト
	   gskyc=0 : gskyk- : if gskyk<1 : gskyk=1

	   gs_key_syo ; キー処理
	  }
	 }

	 if kf=2 { ; スクロール
	  gs_ly=keply+(kepy-my)*2
	   if gs_ly<0 : gs_ly=0
	   if gs_ly>=gs_lyb : gs_ly=gs_lyb
	 }
	loop

; 押してない
	 repeat 1
	  if k=256 : break ; 放してない
	  gskyk=10 : gskyc=0
	  if kf=0  : break ; 一度も押してない
	  if kf=2 : kf=0 : break ; スクロールモード
	  kf=0

	  gs_key_syo ; キー処理
	 loop


	 if mainf!3 : break ; 戻る

	 redraw 0
	  gs_put
	  font "",30
	  dg_put
	 redraw 1
	 await 1000/50

	loop


	if scf=1 : hxb=19 ; 横のマスの数
	if scf=2 : hxb=37
	if scf=3 : hxb=55

	mb=hxb*hyb
	lsb=hxb*hyb ; land_set

	cld2(55)=cld(55)+8
	cld2(56)=cld(56)+8
	cld2(57)=cld(57)+8

	bpwt1_cul ; 10~50、攻守国表示時間
	bpwt2_cul ; 10*2~50*2、ダイスロール表示時間

	gosub *map_create ; マップ生成

	gosub *start_data ; スタートデータセット

	;save ; スタートセーブ

	return

 画面はスクロールするようにしてます。

 値は gs_lyです、各座標の y座標に gs_lyを足す事によってスクロールさせてます。

 一応画面外のものは表示をスキップするようにしてます。

 画面一番上と一番下の文字はスクロールしません。

 これが意外と難しくて、ノーマルの HSPだと「何画面のどこからどこまでをコピー表示」つまり gcopy 1,0,0,540,100 のようにできますけど、HSP Dishだと gcopyは使えません。

 しかもバッファ画面から表示画面へコピーもできません。

 バッファ画面から表示画面へコピーができると、別画面に完成表示を作ったら、後は表示画面へ都度完成画面を切り取って表示させるだけで間単にスクロールができるんですけど、Dishではできません。

 そのため都度、その座標に合わせて表示画面に全部表示処理する必要があります。

 そこで問題になったのが、上の文字と下の文字の表示です、背景をどうするかですね。

 めんどくさいので詳細ははぶきますけど、背景画面を上と真ん中と下の 3画面に分割して表示させてます。

 Aパーツ

 Bパーツ

 Cパーツ

 
 
 まず真ん中の背景を表示して、その上にスクロールする設定の画面を書きます。

 その上に画面上と下の背景を表示して、文字を書きます。

 するとスクールの上の端と下の端の表示を切り取る事ができます。


 
 
 
 キー入力の座標もすべて gs_lyを足す事によって算出してます。
 
 
 後、難しかったのは画面数やプレイヤー人数に対する国数の倍数調整ですね。

 画面数に対する最大数、最小数も含めて、プレイヤー人数の倍数になるように調整する式がややこしかったです。

	 case 1 ; プレイヤー数
	  plb-
	  if plb<2 : plb=2
	  if ldb<ldba : ldb=ldba
	  ldb-=ldb\plb
	  if ldb<ldba : ldb+=plb-(ldb\plb)
	  if plb<spln : spln=plb
	 swbreak

	 case 2
	  plb+
	  if plb>20 : plb=20
	  if ldb\plb=0 : swbreak
	  ldb+=plb-(ldb\plb)
	  if ldb>ldbb : ldb-=plb
	 swbreak

 こんな感じのやつですけど、これは人数が一人減る場合と一人増える場合ですね。

 plbがプレイヤー数、ldbが国数、ldbaが国の最小、ldbbが国の最大数です。

 人数は 2人~20人ですね。

 国数を人数で割った余りを引いたり足したりして、人数の倍数になるように調整してます。

 自分でも何やってるのか分かりません、適当に試行錯誤したら動いたという感じのやつです。

 別に人数に対して国数が同じで無くても良いんですけどね、なんとなくフェアにしたいじゃないですか。
 
 
 画面の大きさに対する国数の最小数と最大数は今の所

 1画面、最小2 、最大40
 2画面、最小20、最大80
 3画面、最小40、最大120

 となってます、これ以外だとマップを生成できなくなります。

コメントを残す

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