装備と装備画面を作る


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、攻め込む

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

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

地形生成を試みる


2017年 5月30日~6月2日
 
 
 さて、今回は MAP生成をやって行く事にする。
 
 
 まずは予定している属性 6つの勢力にそれぞれ対応した地形というものを考える。

 左から火山(火)水辺(水)草原(風)山(地)森(光)沼地(闇)という予定。

 それにしてもひどいグラだなあ。

 グラについてはそのうちエンジェルメーカー氏に描いてもらうとして、あの人も働くだけでほとんど死んでるからなあ、あんまり期待はできない。
 
 
 とりあえず、まず単純に乱数で表示してみる。

 こんな感じだ

 これだけでも戦略マップとしては面白く無いので、進入できない地形を作る。
 
 
 と、言うのは簡単だけどプログラムは多少てこずった。

 何が難しいって地形が空白によって分断してるのをどう判別するか分からない。
 地形が全部陸続きになってないと、とりあえずゲームをクリアできない。

 思考錯誤の末、結局 1マスから隣接するマスを調べていって、全部調べた時に最初に出したマスの総数と隣接で調べたマスの総数が同じなら全部陸続きという方法にした。

 もっとスマートな方法があるのかも知れないが、自分にはこれ以上分からない。

 最初はもう一つの方法で、真ん中の 13番から隣接するマップを作る方法をやってみたが、どうも地形がダマになって面白く無い。

 そこで、始めに一度 25マス全部地形で埋めてから、地形無しをランダムに引き算する事にした、
 こうするといい具合に地形に変化が出る。

 今は一応引き算するのは 5マスにした。

 5マスでもこんな感じにできる

 ソース

/////// 地形生成プログラム ///////

#include "hsp3dish.as"

gosub *main : end


#deffunc map_check ; 6回同じ処理なので一つにまとめ

	if map(m)=0 : return ; 地形無し

	f=0
	repeat 25 : cn=cnt
	 if mf(cn)=0 : break ; 登録はもう無いよ
	 if mf(cn)=m : f=1 : break ; 登録済み
	loop
	if f=1 : return ; 登録済み

	mf(cn)=m ; チェック済みに登録

	return


*main

	screen 0,640,360

	celload "hex_104_90_map.png",1
	 celdiv 1,104,96

	dim hxyd,2,26	; HEX座標変数(0=x、1=y)
	 bload "hxyd.dat",hxyd ; HEX座標データ読み込み

	dim txyd,4,26	; タップ座標変数(0=tx1、1=ty1、2=tx2、3=ty2)
	 bload "txyd.dat",txyd ; タップ座標データ読み込み

	randomize


	repeat ;------- マップ生成 -------

	 dim map,26
; マップ(0=無し、1=火山、2=水辺、3=草原、4=山、5=森、6沼)

	 dim mf,26 ; 生成チェックフラグ

	 mapg=0 ; いくつ地形を作ったか
	 mfn=0  ; 次に処理する MAP No.

	 repeat 25,1 ; MAPを地形で埋める
	  r=rnd(6)+1 : map(cnt)=r
	 loop

	 repeat 5 ; ランダムに5つ地形を消す
	  r=rnd(25)+1
	  map(r)=0
	 loop

	 bn=0 ; 地形無しのマス数
	 repeat 25,1
	  if map(cnt)=0 : bn+
	 loop

	 mapg=25-bn ; 地形有りのマス数

	 repeat 25,1 ; 始めるマップの位置
	  if map(cnt)>0 : mapn=cnt : mf(mfn)=mapn : mfn+ : break
	 loop


	 f=0
	 repeat 25 ; 隣接マップ順に順次確認処理-------------------------------

	  repeat 1 ; 上はあるか -------------------------
	   if mapn\7=1 or mapn\7=5 : break ; 上が無い地形なら終わり
	   m=mapn-1 ; 上のマップ座標

	   map_check ; マップチェックと書き込み処理
	  loop

	  repeat 1 ; 右上はあるか -----------------------
	   if mapn\7=1 or mapn>=22 : break ; 右上が無い地形なら終わり
	   m=mapn+3 ; 右上のマップ座標

	   map_check ; マップチェックと書き込み処理
	  loop

	  repeat 1 ; 右下はあるか -----------------------
	   if mapn\7=4 or mapn>=22 : break ; 右下が無い地形なら終わり
	   m=mapn+4 ; 右下のマップ座標

	   map_check ; マップチェックと書き込み処理
	  loop

	  repeat 1 ; 下はあるか -------------------------
	   if mapn\7=0 or mapn\7=4 : break ; 下が無い地形なら終わり
	   m=mapn+1 ; 下のマップ座標

	   map_check ; マップチェックと書き込み処理
	  loop

	  repeat 1 ; 左上はあるか -----------------------
	   if mapn\7=1 or mapn<=4 : break ; 左上が無い地形なら終わり
	   m=mapn-4 ; 左上のマップ座標

	   map_check ; マップチェックと書き込み処理
	  loop

	  repeat 1 ; 左下はあるか -----------------------
	   if mapn\7=4 or mapn<=4 : break ; 左下が無い地形なら終わり
	   m=mapn-3 ; 左下のマップ座標

	   map_check ; マップチェックと書き込み処理
	  loop


	  mapn=mf(mfn) : mfn+ ; 次にチェックする地形
	   if mapn=0 : break ; が無いなら終わり

	  if mapg=mfn : f=2 : break ; チェック数とマス最大数が同じなら全部繋がってるとみなして完成
	 loop

	 if f=2 : break
	loop


	redraw 0;------- 表示 -------
	 color 0,0,0 : boxf : color 255,255,255

	 gmode 2

	 repeat 25,1
	  x=hxyd(0,cnt) : y=hxyd(1,cnt)
	  pos x,y : celput 1,map(cnt)+5 ; HEX描画
	  n=map(cnt)
	  pos x+86,y+38 : mes n ;map(cnt) ; マス番号表示
	  pos 10,10 : mes bn
	 loop
	redraw 1

	repeat
	 stick k,,0 : if k=128 : break
	 await 1000/20
	loop

	return

 6角形 HEXの隣接マスの移動座標計算の仕方。

 上は-1、下は+1だとして、右上は必ず+3、右下は必ず+4、左下は-3、左上は-4になる。

 これはこのマップが縦 4+3で 7で一周するから。

 もちろん座標の取り方がx,yのようなものなら、別のやり方になるだろう。

 外周の空白に隣接するマスは例外設定を設けている if mapn\7=0のようなものだ。
 これは 7の倍数の HEX番号の上は無い事を意味します。

 データとソースのセットをダウンロード出来るようにするので、参考にしたい人はどうぞ。

hex_bulid ←zipフォルダ

HEXのマスとタップの座標をデータ化する


2017年 5月27日
 
 
 まずマップに番号を割り振る。


 国(?)が 25あるのが分かる。
 
 
 今度は色々と使う事になると思うので HEXの座標をあらかじめ配列変数で DATA化してみる。

 座標計算したものを hxyd(n1,n2)の 2次配列変数に格納し hxyd.datというデータファイルにして出力する。

/////// HEX 座標 DATA///////

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

	dim hxyd,2,26	; 格納する変数(0=x、1=y)

	n=1
	repeat 7 : cx=cnt : px=(hbx+hkx)*cnt+34 ; x座標
	 if cnt\2=0 : yk=0 : else : yk=-hky	; y座標補整
	 repeat 4 : cy=cnt : py=hby*cnt		; y座標

	  if cx=1 and cy=0 : continue	; 描かない座標
	  if cx=3 and cy=0 : continue
	  if cx=5 and cy=0 : continue

	  hxyd(0,n)=px	; データ格納
	  hxyd(1,n)=py+yk
	  n+

	 loop
	loop

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


 
 
 これで次のプログラムだけで良くなる。

/////// HEX 描画///////

#include "hsp3dish.as"

	screen 0,640,360

	celload "hex_104_90_test.png",1
	 celdiv 1,104,90

	dim hxyd,2,26	; 格納する変数(0=x、1=y)
	 bload "hxyd.dat",hxyd ; 座標データ読み込み


	redraw 0

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

	 gmode 2

	 repeat 25,1
	  x=hxyd(0,cnt) : y=hxyd(1,cnt)
	  pos x,y : celput 1,0	; HEX描画
	  pos x+44,y+36 : mes cnt	; HEX番号
	 loop

	redraw 1


 
 
 次にタップ座標を作ってみる。

 これは 6角形上に座標を取るのは難しいし、円形状にシャレてみても複雑で処理が重くなるだけだし、あまり隣接しても誤動作が多くなるだけだと思うので、そりゃもう適当に四角形上に座標を取ってみる。

 とりあえず、こんなもんかなあ。

 これも.datファイルにして DATA化する

/////// タツプ座標 ///////

#include "hsp3dish.as"

	screen 0,640,360

	celload "hex_104_90_test.png",1
	 celdiv 1,104,90


	dim hxyd,2,26	; HEX座標変数(0=x、1=y)
	 bload "hxyd.dat",hxyd ; HEX座標データ読み込み

	dim txyd,4,26	; タップ変数(0=tx1、1=ty1、2=tx2、3=ty2)


	redraw 0

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

	 gmode 2

	 repeat 25,1
	  x=hxyd(0,cnt) : y=hxyd(1,cnt)
	  pos x,y : celput 1,0	; HEX描画
	  ;pos x+86,y+38 : mes cnt

	  tx1=x+20 : tx2=x+84
	  ty1=y+15 : ty2=y+75
	
	  boxf tx1,ty1,tx2,ty2	; 矩形表示

	  txyd(0,cnt)=tx1
	  txyd(1,cnt)=ty1
	  txyd(2,cnt)=tx2
	  txyd(3,cnt)=ty2
	 loop

	redraw 1

	bsave "txyd.dat",txyd ; タップ座標データ書き出し

 
 
 テストプログラム

/////// タップテスト ///////

#include "hsp3dish.as"

	screen 0,640,360

	celload "hex_104_90_test.png",1
	 celdiv 1,104,90

	dim hxyd,2,26	; HEX座標変数(0=x、1=y)
	 bload "hxyd.dat",hxyd ; HEX座標データ読み込み

	dim txyd,4,26	; タップ座標変数(0=tx1、1=ty1、2=tx2、3=ty2)
	 bload "txyd.dat",txyd ; タップ座標データ読み込み


	repeat

	 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 : kn=cnt : break
	 loop

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

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

	  gmode 2

	  repeat 25,1
	   x=hxyd(0,cnt) : y=hxyd(1,cnt)
	   pos x,y : celput 1,0	; HEX描画
	   pos x+86,y+38 : mes cnt ; マス番号表示

	   boxf txyd(0,cnt),txyd(1,cnt),txyd(2,cnt),txyd(3,cnt)	; 矩形表示

	   if kn>0 : color 255,0,0 : pos 310,10 : mes kn : color 255,255,255
	  loop
	 redraw 1

	 await 1000/20
	loop

stop

 分かり難いけど上の真ん中に赤字で現在のマスが表示されている
 
 
 めんどくさいけど、アンドロイド実機でもテストしてみる。

 できました

 
 
 今回はここまで。

マスのふちを勢力色で塗る


2017年 5月24日~25日
 
 
 それじゃあ前回の技術を使って HEXを勢力色で塗るテストをしてみる。

 ALFARでガシガシ手描きして

 グレーでグラデーションを作る。
 
 
 一周描いて、外枠を消す。
 PNG形式で保存。
 (最終版、完成版は最後にあります)


 (注意:アンドロイド実機では PNG→png、HEX→hex等のファイル名とソース名が違うと 13エラーになるので、たぶんなるべく全部小文字でそろえましょう。
 と言う事で画像ファイルを UPし直しました(^^;))

 テストプログラム

/////// HEX /////////////////////////////////////////

#include "hsp3dish.as"

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

	screen 0,640,360

	celload "hex_104_90_d.png",1
	 celdiv 1,104,90


	redraw 0

	 color 0,0,0 : boxf
	
;------- HEX描画 -----------------------------------------

	 gmode 2
	 gmulcolor 255,255,255		; 色をリセット

	 repeat 7 : cx=cnt : px=(hbx+hkx)*cnt+34 ; x座標
	  if cnt\2=0 : yk=0 : else : yk=-hky	; y座標補整
	  repeat 4 : cy=cnt : py=hby*cnt		; y座標

	   pos px,py+yk : celput 1,0	; HEX描画

	  loop
	 loop


;------- ふち描画 -----------------------------------------

	 gmode 3,,,255			; 加算合成

	 rn=255 : gn=0 : bn=0
	  gmulcolor rn,gn,bn	; 色指定

	 repeat 7 : cx=cnt : px=(hbx+hkx)*cnt+34 ; x座標
	  if cnt\2=0 : yk=0 : else : yk=-hky	; y座標補整
	  repeat 4 : cy=cnt : py=hby*cnt		; y座標

	  if cx=1 and cy=0 : continue	; 描かない座標
	  if cx=3 and cy=0 : continue
	  if cx=5 and cy=0 : continue

	  pos px,py+yk : celput 1,1	; ふち描画

	  loop
	 loop

	 pos 

	redraw 1

 するとこんな感じ。
 
 
 gmode 3,,,255だと100%塗りつぶしなので gmode 3,,,128くらいで半透明合成する。

 するとこんな感じ。

 JPG画像だと色落ちしてるけど、もう少し明るい。
 
 
 次に背景との合成を試してみる。

 草原らしきを描いて、上から gmode 3,,,128半透明合成(50%)で描いてみる

 うむ、色が混ざって分からなくなるな
 
 
 それじゃあ加算合成 gmode 5,,,128でやってみる。


 明るいねえ(笑)
 
 
 なら gmode 2で塗りつぶしてみる。


 グラデーション部分が暗くなってしまう。
 
 
 思考錯誤の末、ふちを 1ドット gmode 2で塗りつぶし、残りのグラデを gmode 5,,,128で加算合成する事にした。

/////// HEX /////////////////////////////////////////

#include "hsp3dish.as"

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

	screen 0,640,360

	celload "hex_104_90_f.png",1
	 celdiv 1,104,96


	redraw 0

	 color 0,0,0 : boxf
	
;------- HEX描画 -----------------------------------------


	 repeat 7 : cx=cnt : px=(hbx+hkx)*cnt+34 ; x座標
	  if cnt\2=0 : yk=0 : else : yk=-hky	; y座標補整
	  repeat 4 : cy=cnt : py=hby*cnt		; y座標

	  if cx=1 and cy=0 : continue	; 描かない座標
	  if cx=3 and cy=0 : continue
	  if cx=5 and cy=0 : continue

	  gmode 2
	   gmulcolor 255,255,255		; 色をリセット
	    pos px,py+yk : celput 1,0	; HEX描画
	    pos px,py+yk : celput 1,2	; 草原描画

	  rn=255 : gn=0 : bn=0
	   gmulcolor rn,gn,bn			; 色指定
	    pos px,py+yk : celput 1,19	; ふち描画

	  gmode 5,,,160					; 加算合成
	   pos px,py+yk : celput 1,20	; ふちグラデ描画

	  loop
	 loop

	redraw 1

 
 
 赤(255,0,0)

 緑(0,255,0)

 青(0,0,255)

 白(255,255,255)

 
 
 最終版(ご使用するならどうぞ)

/////// HEX /////////////////////////////////////////

#include "hsp3dish.as"

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

	screen 0,640,360

	celload "hex_104_90_test.png",1
	 celdiv 1,104,90


	redraw 0

	 color 0,0,0 : boxf
	
;------- HEX描画 -----------------------------------------


	 repeat 7 : cx=cnt : px=(hbx+hkx)*cnt+34 ; x座標
	  if cnt\2=0 : yk=0 : else : yk=-hky	; y座標補整
	  repeat 4 : cy=cnt : py=hby*cnt		; y座標

	  if cx=1 and cy=0 : continue	; 描かない座標
	  if cx=3 and cy=0 : continue
	  if cx=5 and cy=0 : continue

	  gmode 2
	   gmulcolor 255,255,255		; 色をリセット
	    pos px,py+yk : celput 1,0	; HEX描画
	    pos px,py+yk : celput 1,1	; 草原描画

	  rn=255 : gn=0 : bn=0
	   gmulcolor rn,gn,bn			; 色指定
	    pos px,py+yk : celput 1,2	; ふち描画

	  gmode 5,,,160					; 加算合成
	   pos px,py+yk : celput 1,3	; ふちグラデ描画

	  loop
	 loop

	redraw 1

 
 
 まあとにかく基本はこれで、後は改造したり微調整していく事にする。