装備画面を作った


2017年 9月20日
 
 
 いやあ、ややこしかった。

 基本的に右手左手、片手持ち両手持ちがある上に、キャラによって装備スロットが違うと言う。
 これをつけたりはずしたりする、フラグの管理も大変だ。

 よく RPGでアイテム増殖バグがあったりするけど、これはその程度には複雑だからだと思う。
 
 
 とういう訳で装備画面。

 上 80ドットで選択装備、下 50ドットではずす事にした。
 この画面ではまだ装備してないので 130ドット全部選択装備だ。
 
 
 装備画面のプログラム、まだ全部できてない。
 バグも残ってる。

/////// 装備 /////////////////////////

#deffunc equ_syo int equ_syon; 装備処理

	;ud(ug+40+ky)=in

	return


#deffunc isel_syo ; 選択処理

	gosub *iselect ; 選択

	 un2=id(iseln*idb+19)
	  if un2!0 { ; 誰かが装備していたらはずす
			repeat 7
			 n=un2*udb+40+cnt : n2=ud(n)
			 if n2=iseln : ud(n)=0 : break
			loop
			if id(iseln*idb+9)=2 : ud(n+1)=0 ; 右両手
			if id(iseln*idb+9)=4 : ud(n-1)=0 ; 左両手
	  }

	 in=ud(ug+40+kyg) : ig=in*idb
	  if in>0 : id(ig+19)=0	; はずす
	  if in=-1 : id(ud(ug+40+kyg-1)*idb+19)=0 : ud(ug+40+kyg-1)=0 ; 右両手はずす
	  if in=-2 : id(ud(ug+40+kyg+1)*idb+19)=0 : ud(ug+40+kyg+1)=0 ; 左両手はずす

	 in2=iseln : ig2=in2*idb
	  id(ig2+19)=un : ud(ug+40+kyg)=in2	; 装備
	   equ_syo un	; 装備処理

	if sbn=1 or sbn=3 : if id(ig2+9)=2 { ; 右両手		
		if ud(ug+40+kyg+1)=-2 : id(ud(ug+40+kyg+2)*idb+19)=0 : ud(ug+40+kyg+2)=0 ; 右の欄が左手の左の欄に重なる
		id(ud(ug+40+kyg+1)*idb+19)=0 : ud(ug+40+kyg+1)=-1
	}
	if sbn=2 or sbn=3 : if id(ig2+9)=4 { ; 左両手
		if ud(ug+40+kyg-1)=-1 : id(ud(ug+40+kyg-2)*idb+19)=0 : ud(ug+40+kyg-2)=0 ; 左の欄が右手の右の欄に重なる
		id(ud(ug+40+kyg-1)*idb+19)=0 : ud(ug+40+kyg-1)=-2
	}


	return


#deffunc remove_syo ; 外す

	in=ud(ug+40+kyg) : ig=in*idb
	 ud(ug+40+kyg)=0
	  if in>0 {
				id(ig+19)=0 ; はずす
				if id(ig+9)=2 : ud(ug+40+kyg+1)=0 ; 右両手
				if id(ig+9)=4 : ud(ug+40+kyg-1)=0 ; 左両手
	  }
	  if in=-1 : id(ud(ug+40+kyg-1)*idb+19)=0 : ud(ug+40+kyg-1)=0 ; 右両手はずす 
	  if in=-2 : id(ud(ug+40+kyg+1)*idb+19)=0 : ud(ug+40+kyg+1)=0 ; 左両手はずす

	equ_syo un ; 装備処理

	return


*equipment ; 装備

	dim equsi,8 ; 一時装備スロット状況

	c=0 ; 装備箇所判定 ---------------
	if ud(ug+11)=2 : equsi(0)=1 : equsi(1)=2 : c=2	; 手
	if ud(ug+11)>2 {	; 複数手
		repeat ud(ug+11)
		 equsi(cnt)=3 : c+
		loop
	}
	if ud(ug+12)=1 : equsi(c)=4 : c+	; 防具
	if ud(ug+13)=1 : equsi(c)=5 : c+	; 特殊
	if ud(ug+14)>0 {	; アイテム
		repeat ud(ug+14)
		 equsi(c)=6 : c+
		loop
	}


	equif=0
	repeat ;------- メイン ----------------

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

	 ky=equ_key()	; タップ座標
	 kyg=ky\10		; 欄のNo.
/*
dgs "ky  ",ky,0
dgs "ky2 ",ky2,1
dgs "kyg ",kyg,2
dgs "equif ",equif,3
*/
	 stick kb,256,0	; ボタン
	  if kb=128 : break ; ESC 戻る
	 if kc>0 : kc- : kb=0 ; 入力ウイエト

	 switch equif
	  case 0 ; 待機
	   if kb!256 : swbreak
	   kc=5
	   if ky=-1 : equif=2 : swbreak	; 戻る
	   if equsi(kyg)=0 : equif=2 : swbreak ; アイテム欄無い
	   if ud(ug+40+kyg)=0 : isel_syo : swbreak ; 装備してない
	   ;if ky<10 {	; 情報表示
		equif=1 : ky2=ky ; 情報表示
		if ud(ug+40+kyg)=-1 : ky2=ky2-1
		if ud(ug+40+kyg)=-2 : ky2=ky2+1
		swbreak
	   ;}
	   ;remove_syo ; はずす
	  swbreak
	  case 1 ; インフォ表示
	   if kb!256 : swbreak
	   kc=5
	   if ky=-1 : equif=0 : swbreak
	   if equsi(kyg)=0 : equif=0 : swbreak ; アイテム欄無い
	   if ky!ky2 { ; 選択しているアイテム欄ではない
			if ud(ug+40+kyg)=0 : isel_syo : equif=0 : swbreak ; アイテムを装備してない
			if ud(ug+40+kyg)>0 : ky2=ky : swbreak
	   }
	   if ky<10 : isel_syo : equif=0 : ky2=ky : swbreak	; 装備

	   if ud(ug+40+kyg)=-1 : ky2=(ky-1)\10
	   if ud(ug+40+kyg)=-2 : ky2=(ky+1)\10
	   remove_syo ; はずす
	  swbreak
	 swend
/*
repeat 20
 dg id(cnt*idb),cnt
loop
*/
	
	 if equif=2 : break ; 戻る

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

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

	  equ_put				; 表示
	 dg_put
/*
font "",20
repeat 15
 pos 440,cnt*20+10 : mes ""+cnt+" "+id((cnt+pl*30)*idb)
 pos 540,cnt*20+10 : mes ""+(cnt+15)+" "+id(((cnt+15)+pl*30)*idb)
loop
*/
	 redraw 1

	 await 1000/20

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


	return

 見てもらえればいかに複雑怪奇か分かってもらえるだろう。
 単にスキルが無くて単純化できないだけかもしれないが。

 装備フラグはユニットデータの 40~46番という事に今の所なってる。
 ud(un*udb+40)の場所、これは元々2次元配列を強引に1次元配列にしているので、ややこしくなってる。
 udb=1ユニットのデータ量、un=ユニットNo.

 2次元配列なら単に ud(40,un)で済むのになあ。

 なぜ1次元配列を使っているのかと言うと、スマホ実機だとなぜか大きな2次元配列データを書き換えようとすると 7エラー(オーバーフロー?)になるから。

 両手持ちの場合、右手武器の左手には-1、左手武器の右手には-2を入れる事にした。
 ただこのデータをうっかり読み込みとエラーになる。
 きっともっと良い方法があるんだろうなあ。

 sbnは装備スロットの種類。

 dgとか dgsとかいうのは、オリジナルのデバッグ用変数表示。
 
 
 アイテム選択画面。
 キャラ選択画面ソースをコピペして改造してある。
 まだ未完成。


 
 
 選択すると装備できる。

 右手には武器、左手には武器と盾が装備できる。
 左手以降の複数武器は威力減衰をする予定。
 
 
 両手持ち。


 
 
 弓は左手の量手持ちになる。


 
 
 装備している状態でタップすると情報表示。
 これもまだできてない。


 
 
 今の所このキャラだけだが、変則装備種。

 ゲームバランス的にボツになる可能性もある。
 
 

 防具欄には体装備のみ、アイテム欄にその他防具をアクセサリーという形で装備するようにした。


 
 
 武器や防具を装備できないキャラもいる。

 黄色いのは特殊アイテム欄で、特殊アイテムは 1つしか装備できない。
 今の所特殊アイテムのアイデアは、アイテム枠増加しか思いついてない。
 
 
 アクセサリーなら装備できる。

 どこに装備してるんだろうね。

 アイテム欄には回復アイテムとか魔法とか装備する予定なので、アクセサリーは飾り程度にしかならないだろう。
 
 
 装備画面の表示プログラム。

 これもまだ未完成、後半情報表示がコピペしたキャラ表示のままになってる。
 equx2のような座標定義は別の場所で行っている。

#deffunc equ_put ; 装備画面表示


	card_put equx1,equy1,un

	gmode 2

	color 255,255,255 : pos equx2,equy2 : mes cs2(cn) ; 名前

	pos equx2+12,equy2+32 : celput mojiw,0 ; HP
	 n=ud(ug+22) : nx=fpk(n) : fp n,equx2+39+nx,equy2+33,0
	 pos equx2+89,equy2+33 : celput 7,207 ; /
	 n=ud(ug+21) : fp n,equx2+106,equy2+33,0

	pos equx2+12,equy2+60 : celput mojiw,1 : s="STR" : bfp s,equx2+57,equy2+63,0
	 n=ud(ug+23) : nx=fpk(n) : fp n,equx2+90+nx,equy2+63,0

	pos equx2+12,equy2+82 : celput mojiw,2 : s="MAG" : bfp s,equx2+57,equy2+85,0
	 n=ud(ug+24) : nx=fpk(n) : fp n,equx2+90+nx,equy2+85,0

	pos equx2+12,equy2+104 : celput mojiw,3 : s="INT" : bfp s,equx2+57,equy2+107,0
	 n=ud(ug+25) : nx=fpk(n) : fp n,equx2+90+nx,equy2+107,0

	pos equx2+12,equy2+126 : celput mojiw,4 : s="CHA" : bfp s,equx2+57,equy2+129,0
	 n=ud(ug+26) : nx=fpk(n) : fp n,equx2+90+nx,equy2+129,0

	pos equx2+162,equy2+32 : celput mojiw,5 : s="ATK" : bfp s,equx2+207,equy2+35,0
	 n=ud(ug+15) : nx=fpk(n) : fp n,equx2+240+nx,equy2+35,0

	pos equx2+162,equy2+54 : celput mojiw,6 : s="DEF" : bfp s,equx2+207,equy2+57,0
	 n=ud(ug+16) : nx=fpk(n) : fp n,equx2+240+nx,equy2+57,0

	pos equx2+162,equy2+82 : celput mojiw,7 : s="ability" : bfp s,equx2+207,equy2+85,0

	pos equx2+162,equy2+106 : mes utks(ud(ug+8))
/*
repeat 7
 dg ud(ug+40+cnt),cnt+10
loop
*/
	f=0 : cntn=0 : color 240,240,240
	repeat  ; アイテム装備表示
	 pos equx4+equxk*cntn,equy4

	 switch f
	  case 0 ; 右手
	   if ud(ug+11)=0 : f=3 : swbreak	; 無し
	   if ud(ug+11)>2 : f=2 : swbreak	; 複数手
	   pos equx4+equxk*cntn,equy4+140 : mes equs(0) : pos equx4+equxk*cntn,equy4
	   if ud(ug+40)=0 : celput wkhw : cntn+ : f=1 : swbreak ; 装備してない
	   if ud(ug+40)=-2 : gmode 3,,,128 : celput iw,id(ud(ug+41)*idb)-1 : gmode 2 : cntn+ : f=1 : swbreak ; 左両手装備
	   celput iw,id(ud(ug+40)*idb)-1 : cntn+ : f=1 ; 表示
	  swbreak
	  case 1 ; 左手
	   pos equx4+equxk*cntn,equy4+140 : mes equs(1) : pos equx4+equxk*cntn,equy4 : pos equx4+equxk*cntn,equy4
	   if ud(ug+41)=0 : celput wkhw : cntn+ : f=3 : swbreak ; 装備してない
	   if ud(ug+41)=-1 : gmode 3,,,128 : celput iw,id(ud(ug+40)*idb)-1 : gmode 2 : cntn+ : f=3 : swbreak ; 右両手装備
	   celput iw,id(ud(ug+41)*idb)-1 : cntn+ : f=3 ; 表示
	  swbreak
	  case 2 ; 複数手
	   if ud(ug+11)<=cntn : f=3 : swbreak ; 終わり
	   pos equx4+equxk*cntn,equy4+140 : mes ""+equs(4)+" "+(cntn+1) : pos equx4+equxk*cntn,equy4
	   if ud(ug+40+cntn)=0 : celput wkhw : cntn+ : swbreak ; 装備してない
	   if ud(ug+40+cntn)=-1 : gmode 3,,,128 : celput iw,id(ud(ug+40+cntn-1)*idb)-1 : gmode 2 : cntn+ : swbreak ; 右両手装備
	   if ud(ug+40+cntn)=-2 : gmode 3,,,128 : celput iw,id(ud(ug+40+cntn+1)*idb)-1 : gmode 2 : cntn+ : swbreak ; 左両手装備
	   celput iw,id(ud(ug+40+cntn)*idb)-1 : cntn+ ; 表示	   
	  swbreak
	  case 3 ; 防具
	   if ud(ug+12)=0 : f=4 : swbreak	; 無し
	   pos equx4+equxk*cntn,equy4+140 : mes equs(2) : pos equx4+equxk*cntn,equy4
	   if ud(ug+40+cntn)=0 : celput wkaw : cntn+ : f=4 : swbreak ; 装備してない
	   celput iw,id(ud(ug+40+cntn)*idb)-1 : cntn+ : f=4 ; 表示
	  swbreak
	  case 4 ; 特殊アイテム
	   if ud(ug+13)=0 : f=5 : swbreak		; 無し
	   pos equx4+equxk*cntn,equy4+140 : mes equs(3) : pos equx4+equxk*cntn,equy4
	   if ud(ug+40+cntn)=0 : celput wksw : cntn+ : f=5 : swbreak ; 装備してない
	   celput iw,id(ud(ug+40+cntn)*idb)-1 : cntn+ : f=5 ; 表示
	  swbreak
	  case 5 ; アイテム
	   if cntn>=ud(ug+11)+ud(ug+12)+ud(ug+13)+ud(ug+14) : f=6 : swbreak ; 終わり
	   if ud(ug+14)=0 : f=6 : swbreak	; 無し
	   if ud(ug+40+cntn)=0 : celput wkiw : cntn+ : swbreak ; 装備してない
	   celput iw,id(ud(ug+40+cntn)*idb)-1 : cntn+ ; 表示
	  swbreak
	 swend

	 if f=6 : break
	loop


	if equif=1 and ud(ug+40+(ky2\10))>0 { ; アイテム情報表示

	 pos equx4+equxk*(ky2\10)-4,equy4-4 : celput 9,0 ; 選択カーソル

	 in=ud(ug+40+(ky2\10)) : ig=in*idb : itn=id(ig)
	 iwdx=iwdx1 : iwdy=iwdy1

	 color 255,255,255
	  boxf iwdx,iwdy,iwdx+iwdxk,iwdy+iwdyk
	 color 8,8,8
	  boxf iwdx+2,iwdy+2,iwdx+iwdxk-2,iwdy+iwdyk-2

	 color 255,255,255 : pos iwdx+6,iwdy+6 : mes cs2(cn) ; 名前

	 pos iwdx+12,iwdy+32 : celput mojiw,0 ; HP
	  n=id(ig+22) : nx=fpk(n) : fp n,iwdx+39+nx,iwdy+33,0
	  pos iwdx+89,iwdy+33 : celput 7,207 ; /
	  n=id(ig+21) : fp n,iwdx+106,iwdy+33,0

	 pos iwdx+12,iwdy+60 : celput mojiw,1 : s="STR" : bfp s,iwdx+57,iwdy+63,0
	  n=id(ig+23) : nx=fpk(n) : fp n,iwdx+90+nx,iwdy+63,0

	 pos iwdx+12,iwdy+82 : celput mojiw,2 : s="MAG" : bfp s,iwdx+57,iwdy+85,0
	  n=id(ig+24) : nx=fpk(n) : fp n,iwdx+90+nx,iwdy+85,0

	 pos iwdx+12,iwdy+104 : celput mojiw,3 : s="INT" : bfp s,iwdx+57,iwdy+107,0
	  n=id(ig+25) : nx=fpk(n) : fp n,iwdx+90+nx,iwdy+107,0

	 pos iwdx+12,iwdy+126 : celput mojiw,4 : s="CHA" : bfp s,iwdx+57,iwdy+129,0
	  n=id(ig+26) : nx=fpk(n) : fp n,iwdx+90+nx,iwdy+129,0

	 pos iwdx+162,iwdy+32 : celput mojiw,5 : s="ATK" : bfp s,iwdx+207,iwdy+35,0
	  n=id(ig+15) : nx=fpk(n) : fp n,iwdx+240+nx,iwdy+35,0

	 pos iwdx+162,iwdy+54 : celput mojiw,6 : s="DEF" : bfp s,iwdx+207,iwdy+57,0
	  n=id(ig+16) : nx=fpk(n) : fp n,iwdx+240+nx,iwdy+57,0

	 pos iwdx+162,iwdy+82 : celput mojiw,7 : s="ability" : bfp s,iwdx+207,iwdy+85,0

	 pos iwdx+162,iwdy+106 : mes utks(id(ig+8))
	}

	return

 
 
 と言う訳で、まだバグてんこ盛りだが、経過報告でした。
 
 

キャラ選択画面を作成中


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は、前に作ったセレクト画面です。
 
 
 とりあえず報告ここまで、現在装備画面を作ってます。

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

キャラのデータを作ってた


2017年 8月23日~8月31日
 
 
 なんと、あれから 10日ばかりもかかってキャラのデータを一通り作ってた。

 どんどん変更されていくデータだからザッとでいいはずなんだけど、もう疲れでヘバってた。

 暑い時期は終わるから、そろそろスピードアップできるといいなあ。
 
 
 前回と変わり映えはしないけど、中身は作ってある。


 
 
 火と水

 
 
 風と地

 
 
 光と闇

 
 

キャラエディッターができた


2017年 8月10日~8月22日
 
 
 キャラエディッター(以降元のデータをキャラ、ゲーム中作成されるデータをユニットと呼ぶ事にする)ができた。

 アイテムエディッターを流用改造したのでグダってる割りに 2週間くらいでできた。

 ほんとはこれくらいのプログラムなら、せめて 1週間くらいで作りたいところだ。
 
 

 
 
 データもこれから沢山改変されていくと思う。


 
 
 作成されたキャラクターデータ。


 
 
 風と地。


 
 
 光と闇(作成途中)


 
 
 参考までにエディッタープログラムをダウンロードできるようにする。
 (「一般的にはダウンロードされる事の無い」って出るけど、別にウイルスとか入ってないので大丈夫です、というかそもそもそんな技術持って無いと言う(笑))

 注意して欲しいんだけど、これはエディッターを公開してる訳では無いと言う事。

 ソースがグチャグチャで本人以外に分からないと思うし、流用してるので使ってないコードもあるし、画像は 2次配布に当たるので含まれない。

 このままでは使えないし、そもそも人によってデータの構造も違うだろう。

 これはあくまで「プログラムの参考」程度に眺めたい人にはどうぞ、という事です。

 CCの時のや、アイテムエディッターの残照が無意味に残ってるし、解析しようとか思わないほうが吉(笑)
 
 
 
 次は戻って装備画面をいじる予定。
 
 

アクセス解析を導入するぞ


2017年 8月9日
 
 
 なんと今まで本ブログはアクセス解析を使って無かった。

 え?そんなものいらんじゃ無いかって?

 まあ一般のブログならそうなのかも知れないけど、ビジネスとして考えるといるよね。

 現在はまだ売れるものを一つも作ってない、というか発表してないのでまだ売り上げを気にするような段階じゃないからアクセス解析もいらなかった、という事もある。

 いずれはアフィリエイトも導入して、広告収入も考えないといけないとも思っている。

 まあアフィリエイトについては1日のアクセス数が少なくとも万は無いとお金にはならないらしいから、本ブログ程度では難しいとは思うけどね。
 
 
 さて、アクセス解析については一般のブログ、fc2とかライブドアブログみたいのでは専用のアクセス解析があると思うので、別に導入とかしなくても始めからついていると思う。

 1ページ々埋め込むのだと Google Analytics(アナリティクス)という有名なのがあるみたい。

 さて、本ブログは Xサーバーを使ってるんだけど、前はなのかプランによってなのか、Xサーバーでも 
Google Analyticsがワンボタンで導入できたみたい。

 でも現在、自分の所では専用のアクセス解析のみある。
 もちろん Google Analyticsについては手動で導入すればどこでも使えるみたい。
 
 
 それでは以下 Xサーバーのアクセス解析導入。

 サーバーパネルにログインして「アクセス解析」を押す。


 
 
 ドメインを選ぶ。
 本ブログは sinsei.spaceのドメインにあるので、それを選ぶ。


 
 
 アクセス解析の追加たぶを開いて、アクセス解析の追加ボタンを押す。


 
 
 これでXサーバーの専用アクセス解析が導入できる。

 それだけ。
 
 
 戻ってアクセス解析の一覧タブを選んで閲覧ボタンを押す。


 
 
 これでアクセス解析が見られる。

 導入した直後なのでまだデータが無い。
 
 
 さて、そもそも本ブログはどれだけの人が見てるんでしょうね。

 たぶんいても一日 1人2人だとは思うんだけど。
 
 

アイテムエディッターが大体完成した


2017年 8月9日
 
 
 なんと 10日も経ってまだアイテムエディッターをいじってる。

 ほんと冷房あるのになんでこんなにバテるんだろう?

 結局 3週間くらいかかってるけど、装備ってプログラム制作の 2、3割りは占める作業だと思うね。
 装備とかアイテム要素とかって意外と手間だと思う。

 ただちょっと時間かかり過ぎだとは思うし、プロとして考えると仕事にはなってないと思うよ(笑)
 
 
 今の所、上限 250個でやってる。


 
 
 ステータス(データ)も増えてる。

 これもまだどんどん変更されていく。

 ゲームプロフラムは「やってみないと面白いかどうか分からない」というのもあって、仕様をどんどん変更しながら作っていくので、始めに仕様を全部決めてという事はあんまり無いと思う。

 どういうプログラムを組んで実装していくかも思考錯誤だしね。
 
 
 文字データは note命令を使った。
 ただしこれも一時的なデータで、最終的には bmpに名前を書き出して使う事になると思う。

 i_name.txt


 
 
 次はこのエディッターを改造してキャラエディッター、つまりユニットデータを作らないと、

 それが出来たら装備画面に戻って装備プログラムを作る。

 いずれにせよ、この辺はゲームの核の部分に近いと思うから時間はかかると思うね。
 
 

アイテムエディッターを作ってる


2017年 7月20日~7月28日
 
 
 という訳でアイテムエディッターを作ってる。

 相変わらず不調。
 なぜ不調なのかと言うと、早くも夏バテ(笑)

 2週間ほどバテバテしながら少しずつ作った。
 ほんとは 3日くらいでできなければどうしようもない、という感じもする。

 左側の空白ウインドウはデバッグモニターだが、完成したし別にいらない。

 左下のは作業用なんたらとか言うやつです(笑)
 合成音声実況を流してますが、ほとんど見ても無いし聞いてもません。
 でも楽しい気分で集中できるし、今の所必須になってます。

 ちなみに自分は耳栓してヘッドホンしてます。

 外の音を遮断するのに長い事随分悩んだんですけど、以降10年くらいはずっとこの仕様です。
 耳栓してるので、自分は耳が悪くなる事はありませんでしたが、親が呼んでも聞こえないのでよく怒られます(笑)

 必ず耳が悪くならないという保障は無いので、マネるなら自己責任でお願いします。
 
 
 制作しながら仕様がどんどん変わるので、このアイテムエディッターもどんどん変えて使っていく。

 アイテムのグラは Whitecatさんのを使う。
 
 
 エディッターの工夫としては、Whitecatさんのグラは pngだが、HSPだと pngの背景色抜きができない。

 HSPDishはできるが、HSPだと等倍の gcopyでしか抜けない。

 今回は 3倍表示にしたので、gzoomだと背景を抜いてくれない。

 そこで bufferに一度 gzoomで3倍表示させてから、bufferからメイン画面に gcopyする事にした。
 
 
操作はパッドでできるようにしている。

 まだ属性もつけなきゃいけないし、全然これから。
 
 
 saveすると、
 i_data.dat
 i_name.dat
 item.bmp
 というファイルが出力される。

 これらのファイルを本体で読み込んで使う。

 ただし文字変数の i_name.datについては、フォントを bmpで作るようかもしれないので使わないかもしれない。
 (忘れてた、HSP3以降だと文字型変数はbsaveでセーブ出来ないんだった。
  note命令を使わないと。
  さてどうしたものか)

 item.bmp

 HSPDishの celputで使うので、左上からアイテム No.1~で 10個ずつになってる。
 
 

bmpフォント表示を整理した


2017年 7月15日~7月16日
 
 
 絶不調。
 
 
 という訳で、とりあえずbmpフォントの表示をまとめる事にした。

 フォントをまとめて(セルの大きさは 16*16)

 
 
 プログラムを改定して

#include "hsp3dish.as"


bfp_cn=1 ; セルNo.

celload "bmp_font.png",bfp_cn
celdiv bfp_cn,16,16

gosub *main : end


;----------- bmpフォント表示 --------------------------------
#module

#deffunc bfp str s,int x,int y,int t ; 英数字スモール、文字列
; s=文字列、x=x座標、y=y座標、t=文字色

	bfp_cn=1 ; #module内なので定義し直す

	ss=s			; たしか一度受け渡さないとエラーが
	sg=strlen(s)	; 文字長さ、個数
	t2=t*26			; 文字色

	gmode 2

	repeat sg			; 文字の数だけ繰り返し
	 n=peek(ss,cnt)		; 1文字読み出し、n=アスキーコード
	 if n=32 : continue ; " " スペース

	  pos x+cnt*11,y

	   if n>=65 and n<=90	: n2=n-65 : celput bfp_cn,n2+t2 : continue	; 小文字も大文字で表示
	   if n>=97 and n<=122	: n2=n-97 : celput bfp_cn,n2+t2 : continue	; アルファベット
	   if n>=48 and n<=57	: n2=n-48	; 数字
	   if n=43 : n2=10	; +
	   if n=45 : n2=11	; -
	   if n=42 : n2=12	; *
	   if n=47 : n2=13	; /
	   if n=61 : n2=14	; =
	   if n=37 : n2=15	; %
	   if n=46 : n2=16	; .
	   if n=44 : n2=17	; ,
	   if n=58 : n2=18	; :
	   if n=59 : n2=19	; ;
	   if n=40 : n2=20	; (
	   if n=41 : n2=21	; )
	   if n=33 : n2=22	; !
	   if n=63 : n2=23	; ?
	   if n=126 : n2=24	; ~

	   celput bfp_cn,182+n2+t2	; 表示
	loop

	return
#global


*main

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

	 s="1234567890"
	  bfp s,10,10,0

	 s="abcdefghijklmnopqrstuvwxyz"
	  bfp s,10,30,1

	 s="+-*/=%.,:;()!?~"
	  bfp s,10,50,2

	redraw 1

	stop

	return

 
 

 
 
 コピペすれば使えると思うから、使いたい人はどうぞ。
 物足りない人は改造してね(単色なのでグラデするとか、色がきにくわないとか)
 グラは ALFARで描いてるので、それで開けばパレットが使えるはず。

 色はノーマル、火、水、風、土、光、闇を表す。
 ノーマルは灰色なので、白(255)がよければ光(5)でどうぞ。

 一番最後の「/」はプログラムでは扱えてません。

装備と装備画面を作る


2017年 7月5日~7月11日
 
 
 今度は装備を実装するのと、装備画面を作る。

 制作した事のある人なら分かると思うが、この装備という要素も意外と手間がかかるプログラムである。
 
 
 選択画面を 2分して上はキャラ選択を、下は装備をできるようにする。
 とりあえず縦 130ドットの内、上は 80ドット、下は 50ドット。


 
 
 タップ座標を作りなおして

 
 
 上の選択は 0~9、下の装備は 10~19の値を返すようにする。


 
 
 ちなみにキー入力の関数はこんな感じ

#defcfunc inf_key ; 選択画面入力

	x=mousex : y=mousey : inf_keyn=-1

	repeat 20
	 if infkx1(cnt)<x and infky1(cnt)<y and infkx2(cnt)>x and infky2(cnt)>y {
	 inf_keyn=cnt : break
	 }
	loop

	return inf_keyn

 座標は別の所で定義している。
 
 
 とりあえずザッと装備画面を表示した。

 装備箇所は最大で 7つにした。

 アイテム欄は最低 1つで int(知性)によって増える。

 もっと増やしても良いんだけど、スクロール処理させなければならにので、とりあえず 7つにしてみる。
 
 
 さて、とりあえず装備するものを作らなければ、これ以上進められそうも無いので、次はキャラやアイテムの制作をしてみる。

キャラ選択画面を作ってる


2017年 6月25日~7月5日
 
 
 キャラの一覧を表示して選択する画面を作ってる。

 とりあえずざっとこんな感じだろうか。

 縦 8つだけどスマホ実機では小さいかもしれない。
 その時は 6つくらいにしてみよう。
 
 
 タップ座標を作る。

 座標を色分け表示した。
 この座標を元に関数を作って、キャラは 1~8、上のソートボタンは 11~18の値を返すようにする。
 
 
 キャラ表示が縦にスクロールするようにする。

 これは少し難しそうだ。

 これだけでは分からないと思うが、タップして放した y座標の差を適当に割って縦に移動する値にした。

 おそらくANDROID API(命令群)にはタップの移動量を返す関数(命令)もあるとは思うんだけど、これは HSP
だからねえ。
 実際にはどうなんだろ、時間で移動量を検出してるような気もするんだけど、そんなの難しそうだから自分は動かした量にしたよ。

 kbはボタン入力値で、256でタップしてる事を意味する。

 sel_dyが移動量、mouseyがタップ座標の y座標を検出する。
 sel_kn=押した後放したかのフラグ。
 sel_dy=(mousey-sel_ky)/20で算出している。
 移動した y座標の 20分の 1と言う訳だ。
 
 
 ソート機能を実装する。

 これが意外と難しくててこずってる。
 前に一度作った覚えがあるが、どうにもうまくいかない。
 単純なバブルソートなんだけど・・・。

 という訳でとりあえずググってみたらやり方が間違ってた、う~むもう覚えてないとか。

 それにバブルソートは単純で勉強には使うけど、遅いし実際には使わないんだそうだ。
 関数(命令)をつかったりするらしい。
 しかしソートの方法もザッと見 20種類以上はあるんだねえ。

 HSPにもソートの関数はあるけど 1次配列のもののようなので、そのままでは使えないかな。

 ちょっと自分ではバブルソート以外のソート方法を理解して使いこなすのは難しそうなので、時間的に言ってもバブルソートでやる事にした。
 
 
 とりあえず出来た

 
 
 ソースはこんな感じ

 sel(n)=自勢力のユニットNo.を格納した配列変数
 selb=照合するデータ↑の総数
 n1、n2=ユニットNo.
 nd1、nd2=比較するデータ
 
 
 今度は国の編成を変えられるようにしてみる。

 タップ座標を作って。


 
 
 選択したら

 抜き差しできるようにする

 サラッと書いてるが、それなりに苦労した。