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


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=比較するデータ
 
 
 今度は国の編成を変えられるようにしてみる。

 タップ座標を作って。


 
 
 選択したら

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

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

どっぷりスランプに陥ってるよ


2017年 6月24日
 
 
 前回以来全く進んでない。

 一週間無為無策。

 こうなるとあせり MAXになってくる。
 働きながらの人は 1週間なんてあっと言う間だろうけど、全日使ってるとこの時間の使い方はやばいよねえ。

 ひとつには体力の増進を図って運動して疲れてるというのもある。
 そろそろ運動のペースを落とそう。

 しかしいずれにしても作業時間は基本体力に比例する。

 スランプの時どうするかは意外に重要な気がする。
 ずっとその方法を考えてるけど未だに良い思案は無い。

 お金があればどこか行ってしまうのが一番良いきもするが、後は食べるという方法もある。

 読むなり勉強するなりして充電するのが良いんだろうけど、なかなかねえ。

 他には片付けや掃除、整理もいいね、後は家の手伝いとかかな。

 まあとにかく(閑話休題)
 
 
 制作的に始めのほうなので基礎部分を練らないといけなくて、それで壁になってるという事もある。

 こういう時大事なのはとにかくあせらずにじっくり少しづつ取り組む事だ。

 岩盤に突き当たっている部分だから、じっくりドリルを当てるのが良い。

 その内サクサク進む制作部分になる。
 
 
 さて、とりあえずモンスターとアイテムのグラフィックをどうするか決める。

 モンスターは前回の CCでも使わせてもらったけど、定番の RPGドットさんのを使う。


コレね 

 モンスター一揃いなんてこの人の以外ほとんど無いので、ほとんど選択の余地が無い。
 後は自分で描けるようになるしかないよね。

 有料素材ってのも、モンスターはあんまり無いんだよねえ。
 
 
 アイテムについてはこの人のにしよう。

 Whitecatさん

 こちらもアイテム素材では定番だろうね。
 
 
 今回はとりあえずこの 2つでできる範囲でまに合わせようと思う。

ゲームの基礎部分を作ってるよ


2017年 6月16日
 
 
 背骨というか基礎を構築してる。

 まだ仮試作段階でどうなるか分からない。
 
 
 HEXをクリックすると、その HEXの情報が表示されるようにする。

 この画面でその HEXの領主と部隊を配属できる予定。

 ユニットはカードで。
 カードの大きさは前作の CCのものをそのまま使う事にする。
 80 × 130で、これは約 1 × 1.62で黄金比になってる。
 カードの大きさが黄金比が適当かは、それぞれで色々だと思う。
 
 
 基本データ部分を思考錯誤してる。

 基本的なキャラデータを用意しておいて、各ユニットは生成された時点で独自のデータを持つ。


 
 
 アイテムのデータも同様。

 固定データは 2次元配列で定義し、あらかじめ.datファイルにしたものを読み込んで使う。

 ゲーム上更新されるデータには 2次元配列が使えないので、1次元配列を強引に 2次元視して使う。

 HSP Dishでは、なぜかデータ量が多い時 2次元配列に書き込みを行うと、7エラー(オーバーフロー)になるので。
 読み出す分には問題ない。
 
 

コマンド用のタップ座標を作る


2017年 6月11日
 
 
 外周の隙間にコマンド用のタップ座標を作る。
 
 
 座標取りに苦労したが、赤い部分がコマンドのタップエリア。

 たぶんタップミスを考えて、4隅の 1、5、12、16は使わないと思う。
 消音とかに使えるかな?

 う~ん、メインは 2、3、4、13、14、15の 6つになるかなあ。
 消音に 9、10、11かな。
 10をオプションにして、左右の 9、11、を SEと音楽の on、offにするとか。
 
 
 座標割り出しのソースはベタベタ

/////// タップ座標 DATA///////

	hbx=52	: hkx=hbx/2	; 横の大きさ、半分、間隔
	hby=90	: hky=hby/2	; 縦の大きさ、間隔

	dim cxyd,4,17	; 格納する変数(0=x、1=y)

	n=1
	cxyd(0,n)=0 : cxyd(1,n)=0 : cxyd(2,n)=44 : cxyd(3,n)=30 : n+ ; 1
	repeat 3 ; 2~4
	 cxyd(0,n)=0 : cxyd(1,n)=90*cnt+60 : cxyd(2,n)=44 : cxyd(3,n)=90*cnt+60+60 : n+
	loop
	cxyd(0,n)=0 : cxyd(1,n)=90*3+60 : cxyd(2,n)=44 : cxyd(3,n)=360 : n+ ; 5

	repeat 3 ; 6~8
	 cxyd(0,n)=(hbx+hkx)*(cnt*2+1)+34+20
	 cxyd(1,n)=0
	 cxyd(2,n)=(hbx+hkx)*(cnt*2+1)+34+84
	 cxyd(3,n)=30
	 n+
	loop

	repeat 3 ; 9~11
	 cxyd(0,n)=(hbx+hkx)*(cnt*2+1)+34+20
	 cxyd(1,n)=360-30
	 cxyd(2,n)=(hbx+hkx)*(cnt*2+1)+34+84
	 cxyd(3,n)=360
	 n+
	loop

	cxyd(0,n)=640-44 : cxyd(1,n)=0 : cxyd(2,n)=640 : cxyd(3,n)=30 : n+ ; 12
	repeat 3 ; 13~15
	 cxyd(0,n)=640-44 : cxyd(1,n)=90*cnt+60 : cxyd(2,n)=640 : cxyd(3,n)=90*cnt+60+60 : n+
	loop
	cxyd(0,n)=640-44 : cxyd(1,n)=90*3+60 : cxyd(2,n)=640 : cxyd(3,n)=360 : n+ ; 16


	bsave "cxyd.dat",cxyd	; データファイル出力

 
 
 と言う訳で、とりあえずターンエンドのボタンを 15に割り当てる。

いよいよメインプログラムを構築していく


2017年 6月8日
 
 
 じゃあメイン画面の表示も出来た事だし、そろそろこの辺でメインのプログラムを構築して行く事にする。

 00というのがメインフォルダで、ひと段落事に 01、02のように更新していく。

 今の所中身はこんな感じで

 
 
 こんな感じでインクルード(含ませる)して使う

 syokiは初期設定、putは表示関係をほとんどまとめて、kansuは自前の関数(命令)をぶち込んである。

 mapは今までのマップ作成のプログラム、というようにオブジェクト指向とまでは行かないのだろうが、ある程度ブロック化して書ける。

 こうしないとプログラムが膨大になってくると管理が大変だし、把握が容易になるので。
 
 
 注意するのは HSPの場合、#deffuncなどで定義した命令を呼び出すには、呼び出すプログラムを先に書かなければいけない。

 よって、このメインルーチンはプログラムの最後に書かれている事になってる。

 例えば kansuのような、もっともよく呼び出されると思われるソースは始めのほうに置かれる。

 ちなみにこれ、緑の部分は前作のカルギナカーディアのソースをコピペして改造してるので。
 
 
 メインルーチンはこんな感じ

*main

	debugf=0	; デバッグモードスイッチ(0=無し、1=有り)

	fif=1 ; データフォルダの位置(0=Android、1=PC)
	 if fif=0 : fi=""
	 if fif=1 : fi="../data_file/"


	mainf=1

	while ;------------ メイン -------------------------------------------

	 switch mainf
	;  case 0 : gosub *time_lock : swbreak			; タイムロック
	  case 1 : gosub *syoki		: mainf=4 : swbreak	; 初期

	  ;case 2 : gosub *opening	: mainf=3 : swbreak	; オープニング
	  ;case 3 : gosub *titl		: swbreak			; タイトル
	  case 4 : gosub *game_start: mainf=5 : swbreak	; ゲーム開始

	  case 5 : gosub *hextrategy: swbreak			; main_game

	  ;case 6 : gosub *game_over : swbreak			; ゲームオーバー	  
	  case 7 : gosub *game_clear: swbreak			; ゲームクリア
	  ;case 8 : gosub *ending	: swbreak			; エンディング
	 swend

	 if mainf=10 : _break							; END

	wend ;-----------------------------------------------------------------

	return



/////// hextrategy メインゲーム ////////////////////////////////////////////////

*hextrategy

	hextf=0

	while ;------------ メインループ ---------------------------

	 switch hextf
	  case 0 : gosub *map_main			: swbreak	; 基本MAP画面
	  case 1 : gosub *info				: swbreak	; 国インフォ、情報画面
	  ;case 2 : gosub *organization		: swbreak	; 自国インフォと編成
	  case 3 : gosub *attack			: swbreak	; 攻め込む
	  ;case 4 : gosub *battle			: swbreak	; 戦闘
	 swend

	 if mainf!5 : _break
	wend ;-------------------------------------------------------

	return

 まだ未実装の部分が多いが、たぶんこの下に戦闘用のルーチンが同じように付く。

 自分はたぶんどんなゲームプログラムでも、この形式は変わらないと思う。
 ずっとやってきて現在最善と思われる形式がこれ。

 それと自分の場合、どんな画面でも同じ FPS数で画面更新する処理は同じ。
 入力のタイミングもずっと同じ。

 これは元々 PCで画面更新無しで入力待ちにすると、ウインドウに別のウインドウがかぶったりすると画面がそのままになってしまうから、というのもあるし、STGを作っていた名残りでもある。
 
 
 人によってプログラムの書き方は様々だし、今回はどうでもいい内容ではあるが、参考までに。
 
 
 参考になるか分からないが、一応ソースの zipファイルを用意しておく。

 なお、ソースには前回のカルギナカーディアのコードが残照しているので、関係ない部分もあります。

勢力表示と画面操作を作る


2017年 6月4日~6月7日
 
 
 今度は各プレイヤー事の勢力範囲を作っていく事にする。
 
 
 とりあえず 7プレイヤーの表示色を設定して

 前々々回辺りの HEXの色分け技術を使って表示

 色が薄くて分かり難いようなので、後で縁とグラデをもう少し厚く表示するように調整しよう。
 
 
 次にタップしたらその HEXの情報と編集画面を表示、ドラッグで隣接マスへ侵攻というのを作る。

 前々回辺りの技術を元に、タップしたら HEX国の情報ウインドウを開くプログラムを作る。

 画面内に数字が表示されているのは、バグでは無くて HSPDishだと mes表示は常に一番上に表示されるかららしい。

 故にまず HSPDishの本プログラムでは mes命令は自分は使わない。
 もちろん、フォントが機種依存だと言うのもある。
 
 
 次に自分の勢力(青)に隣接する HEXでボタンを放すと攻め込む仕様にする。

 サラッと書いてるが、多少苦労した。

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

	 stick k,256,0
	  if k=128 : break ; ESC END

	 kx=mousex : ky=mousey : kn=0

	 repeat 25,1 ; カーソル位置確認
	  if txyd(0,cnt)<kx and txyd(1,cnt)<ky and txyd(2,cnt)>kx and txyd(3,cnt)>ky {
		  if map(cnt)>0 : kn=cnt : break
	  }
	 loop

	 repeat 1 ; タップ処理
	  if kc2>0 : kc2- : break ; キーを入力しないウエイト

	  if k=256 and kc=0 : kc+ : hink=kn : break ; 押し始め
	  if k!256 and kc>0 {						; 一度押してから放した
	    if hink=kn and map(kn)>0 {
		 if plm(kn)=1 : mainf=1 : else : mainf=1 ; 自分の国なら国情報画面
	    }
		if plm(hink)=1 and plm(kn)!1 {
			repeat 6,1 ; 自分の国で無いなら攻め込む
	   		 m=hmv(hink,cnt) ; 6方向の座標を求める独自関数
			 if m=kn : mainf=2 : break ; 隣接するか
			loop
		}
		kc=0 : hink=0
	  }
	 loop
	 if mainf!0 : break

 plm(n)=MAPの勢力

 mainf=0、メイン MAP画面
 mainf=1、国情報画面
 mainf=2、攻め込む

 国情報画面で、後で自分の勢力ならその国の人事とか部隊配置をいじれるようにする。
 とにかく暫定的に。
 
 
 これまた暫定的に、全部自勢力にするとクリア表示するようにした。

 一応ゲーム目的はこんな感じで全部占領するか、たぶん全勢力を滅ぼす(首都を落とす)になるはず。
 
 
 とりあえずマップ処理関係はこんな感じかな。