キャラ選択画面を作成中


2017年 9月10日
 
 
 前回から 10日程経ったので中途半端ではありますが、経過報告です。

 というのもアクセス解析を入れた所、一日2~3人程の人に見てもらってるようで、思ったより見てくれているようです。

 実は 9月に入ってから涼しくなったので作業自体は割と順調でした。
 
 
 では前回から、まず作成したデータを本体に取り込んで表示。

/////// UNIT DATA ///////

; キャラデータ

*chara_data

	cb=210	; キャラ種類
	cdb=20	; データ量
	dim cd,cdb,cb ; キャラデータ
	 bload "c_data.dat",cd

	sdim cs,30,cb
	 notesel cs	; 名前
	  noteload "c_name.txt"
	   sdim cs2,30,cb
	   repeat cb
	    noteget s,cnt : cs2(cnt)=s
	   loop

	cha_syu=0,16,22,27,25,18,25 ; 属性各種類
	cha_zoks=0,1,31,71,111,151,181

;(0=フラグ、
; 1=HP、2=、3=筋力、4=魔力、5=知性、6=魅力、
; 7=属性、8=特殊能力、9=特殊能力値、10=出現Lv、
; 11=手スロット、12=防具スロット、13=特殊スロット、14=ITEMスロット、)
; 15=GRNo、16=GRx、17=GRy、18=枠、19=背景、


	utksb=73
	dim utks,20,utksb
utks(0)="無","攻勢","守備","行政","魔術","祭司","制作","宝の番人"
utks(10)="火傷","コールド","麻痺","スタン","ターンアンデッド","毒","テンプテーション"
utks(20)="バーサーク","ディフェンサー","速攻","盗む","スナイピング","剛弓","貫通"
utks(30)="アンデッド","ネクロマンサー","吸血","再生","絶叫","ナイトメア"
utks(40)="2回攻撃","3回攻撃","兜割り"
utks(50)="ファイアーブレス","コールドブレス","サンダーブレス","咆哮","ホーリーブレス","ポイズンブレス","津波"
utks(60)="火の息","ファイアーボール","ファイアーストーム","コールドストーム","ダークスファイア","ウインドストーム"
utks(70)="ヒール","ヒールオール","ヒールソング",""
utks(99)=""

	zks="","火","水","風","地","光","闇"




	return


; ユニットデータ

*unit_syoki

	ub=200	; ユニットの最大数
	udb=60	; 1ユニットのデータ量
	dim ud,udb*(ub+1) ; 200ユニット分

;(0=フラグ、
; 1=HP、2=、3=筋力、4=魔力、5=知性、6=魅力、
; 7=属性、8=特殊能力、9=特殊能力値、10=出現Lv、
; 11=手スロット、12=防具スロット、13=特殊スロット、14=ITEMスロット、)
; 15=GRNo、16=GRx、17=GRy、18=枠、19=背景、

;(0=フラグ、cn(キャラNo、種類)、
; 1=最大HP、2=現HP、3=筋力、4=魔力、5=知性、6=魅力、
; 7=属性、8=特殊能力、9=配属、
; 10=所属PL、
; 11=手スロット、12=防具スロット、13=特殊スロット、14=ITEMスロット、
; 15=攻撃力、16=防御力、17=特殊能力値、18=、19=、
; 
; 最終値(21=最大HP、22=HP、23=筋力、24=魔力、25=知性、26=魅力)
; ステータス(31=火傷、32=フリーズ、33=マヒ、34=スタン、35=ターンアンデッド、36=毒値)
; 40=装備)
;
; 火傷値、フリーズ%、マヒ%、スタン%、ターンアンデッド%、毒値%
; 火傷人数、フリーズ人数、マヒ人数、スタン人数、ターンアンデッド人数、毒人数


	return

 とは言っても、すり合わせがややこしく、これだけの事で 2日くらいは使ってます。

 データの扱いを整理したりしますので。

 そう言えば、おそらくプロの現場ではデータの扱いを始めからキチッと決めてから作り始めるんだと思いますが、ゲームプログラムですので、ゲーム内容を考えながら実装するため、永遠の思考錯誤スパゲティ増築工法となっております(笑)
 
 
 とりあえずテスト用にスタート時にユニットデータとアイテムデータを適当に作ります。

; UNIT 初期配置-------------------------------------------

	repeat 7,1 : pn=cnt ; プレイヤー
	 kn=mpc(pn)	; HEX

	 n=map(kn);n=rnd(6)+1 ; 属性
	 repeat 16 : cnt2=cnt

	  cn=rnd(cha_syu(n))+cha_zoks(n)

	  repeat ub,1
	   un=cnt : ug=un*udb ; ユニットNo.
	   if ud(ug)=0 : break
	  loop

	  ud(ug)=cn	; cnキャラ種類
	  repeat 9,1
	   ud(ug+cnt+20)=cd(cnt,cn) ; データ
	  loop
	  ud(ug+8)=cd(8,cn) ; 特殊能力
	  ud(ug+10)=pn ; 所属
	  repeat 3,11 ; 装備
	   ud(ug+cnt)=cd(cnt,cn)
	  loop
	  ud(ug+14)=cd(5,cn)/20-ud(ug+13)+1 ; アイテム装備数
	  ud(ug+22)=ud(ug+21) ; HP


	  if cnt2>9 : continue
	  mu(kn*10+cnt2)=un		; 領主、部隊配置
	  ud(ug+9)=kn*10+cnt2	; 配属
	 loop

	loop


; ITEM初期配置 ----------------------------------------

	n=1
	repeat 7,1 : pn=cnt ; プレイヤー
	 repeat 15
	  repeat
	   r=rnd(itb) : if itd(0,r)>0 : itn=r : break ; アイテム種類
	  loop

	  in=n : n+	; アイテムNo.
	  ig=in*idb	; データ位置
	   repeat idb
	    id(ig+cnt)=itd(cnt,itn) ; データ
	   loop
	   id(ig)=itn
	   id(ig+10)=pn ; 所属PL
	 loop
	loop

 変数について、ほんとは文字にして何のデータか分かるようにしないといけないんだと思います。

 でも自分はめんどくさいし、変数ごときにそんなに長々と文字打ってられないし、プログラムが長くなって何やってんだか分からなくなるしで、短く udとか unとか udbとか使ってます。

 短い変数だと別の所で使う可能性もあるので、あんまり良くは無いとは思いますが、思考錯誤しながらプログラムしてるのに長文なんて打ってらんないです。

 これ uならユニット、dはデータ、bは最大数と言う風に決まりはあります。

 iならアイテム、jなら自機、evならイベント、eなら敵、と言う風に自分なりに決めていつも使ってます。

 n=値、f=フラグ、c=カウンター、k=間隔、a=最小値、g=現在値、o=大きさ、r=乱数、s=文字列、t=時間、xyz=座標、pならputで表示、inならアイテムNo、cnならキャラNo、unならユニットNoとかそんな感じです。

 例えば自機座標なら jx,jy、HPなら jhpとかですね、これだけだと割りと普通だけど(笑)

 アマチュア仕様ですのでオススメはしません。

 たぶんプロのだと Jiki_xとか Item_Dataだとか文になってると思うのね。
 
 
 国表示画面で表示するようにします。

 この時点でこの画面では原則 mes表示はしてません。

 bmpフォントで数字を表示し、文字は作成してます。

 最終的に mes表示は全部使いません。
 
 
 スマホ用の操作にするため、ワンクリックで情報表示。

 選択カーソルも表示するようにします。

 この状態の選択キャラ上で、縦 130ドットの内、上 80ドットでキャラ選択、下50 ドットで装備変更になってます。

 キャラの無い状態だと 130ドット全部キャラ選択になってます。
 
 
 インフォ画面のプログラム

*info ; 国インフォ画面

	infof=0
	repeat ;------- メインルーチン -------

;------- 入力 -------

	 ky=inf_key()

	 stick kb,256,0
	  if kb=128 : break ; ESC END
	 if kc>0 : kc- : kb=0 ; 入力ウイエト

	 switch infof
	  case 0 ; 待機
	   if kb!256 : swbreak
	   if mu(kn*10+ky\10)=0 : kc=5 : sel_syo : swbreak ; キャラがいない
	   kc=5 : infof=1 : ky2=ky : if ky=-1 : hextf=0
	  swbreak
	  case 1 ; インフォ表示
	   if kb!256 : swbreak
	   kc=5 : if ky=-1 : infof=0 : swbreak
	   if (ky\10)!(ky2\10) { ; 選択しているキャラではない
			if mu(kn*10+ky\10)=0 : kc=5 : sel_syo : /*infof=0*/ : swbreak ; キャラがいない
			ky2=ky : swbreak
	   }
	   if 10<=ky and ky<=19 { ; 装備
			un=mu(kn*10+ky-10) : ug=un*udb : cn=ud(ug)
			if cn>0 : gosub *equipment : swbreak
	   }
	   sel_syo
	  swbreak
	 swend

	 if hextf!1 : break ; 戻る

;------- 表示 -------

	 redraw 0
	  color 0,0,0 : boxf : color 255,255,255

	  map_put	; マップ表示
	  inf_put	; HEX情報表示
	  dg_put	; デバッグ表示
	 redraw 1


	 await 1000/20

	loop ;---------------------------------

	return

 まだ途中なのでバグが残ってるけど、これだけでも相当にややこしい。

 inf_key()は別の場所で #deffuncによりキー入力のプログラムを作ってあって、カード座標の上 80ドットは 0~9、下 50ドットは 10~19の値を返すようになってます。

 sel_syoは、前に作ったセレクト画面です。
 
 
 とりあえず報告ここまで、現在装備画面を作ってます。

 これがまた恐ろしくややこしい。
 
 

コメントを残す

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