地形生成を試みる


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

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

HSPDishで表示カラーの変更に挑戦


2017年 5月19日~23日
 
 
 ああ、どうにも立ち上がらない、やる気がしないと言うかエンジンがかからない。
 しばらくやらないと、ねえ。
 プロジェクトの立ち上がりって途方に暮れます。
 どこからとっついたら良いのか分からなくてダラダラしてます。
 こうなるとあせってくるよねえ、一歩一歩破滅に近づいてますしね(笑)

 そんな訳でとりあえず表示色を数値で変更できるかどうかから研究してみることにした。
 カラーパレットみたいな事ができるといいなと思う。

 例えば勢力の表示色の違いを一々グラフィックで用意するのめんどいので。

  “HSPDishで表示カラーの変更に挑戦” の続きを読む

次の作品を作る事にしたよ


2017年 5月15~16日
 
 
 色々考えたんだけど、結局カルギナカーディアはお蔵入りする事にしました。

 まあ本当はテストモデルとしてストアへの UPとか収益の確認とかしたかったんだけど、どうも悪い予感がしてなぜか分からないけど、それとやっぱり 3番煎じ 4番煎じなのは否めない。
 今回は HSPDishで作品を作る所までの試作品と言う事で終わりにします。
 まあ実験のために「とりあえず作った」作品なのはたしかです。

  “次の作品を作る事にしたよ” の続きを読む

シブサワコウさんの本から学ぶゲーム事業の事


2017年 5月3日
 
 
 ネットを見ていたら、たまたまこんなフレーズが目に入ってきた。

 「0から 1を創造する」

 ふむふむ、今の自分に丁度いるものだな、何だろうと思ってみてみるとKOEIのシブサワコウさんの本らしい。

 創造の仕方も知りたいが、今はむしろ「ゲームの正当制」つまりどういうあり方ならゲームを仕事にする事を許されるのか、肯定されるのかを知りたい。

 という事でアルバイトで多少お金もできたし、ちょっと面白そうなので早速買ってみた。


  “シブサワコウさんの本から学ぶゲーム事業の事” の続きを読む

CC、タイムロック機能を実装するぞ


2017年 4月14日~5月1日
 
 
 よ~し、んでは再開するにあたってまず変更の柱である「タイムロック(Time Lock)機能」をつけてみるかいな、と。

 あ~ひさしぶりにプログラム触るので、何がなんだか。
 
 
 と、その前に世の中に他にタイムロックが無いか調べてみる。

  “CC、タイムロック機能を実装するぞ” の続きを読む

レンタルサーバーとドメインの継続


2017年 4月11日
 
 
 やっと仕事が終わりました。
 地獄を見ました、2度とゴメンです。
 
 
 とりあえず再開するにあたって、まずレンタルサーバーとドメインの契約を継続させる必要があります。

 どちらも 3月の終わり位の契約なので、これは 3月中に払いました。

 Xサーバー 12ヶ月 12,960 円
 お名前com ドメイン 1年 1,760 円

 経費ばかりかかってますけど、回収できる日は来るんでしょうか。

ゲームの面白さとは何か

2017年 3月14日
 
 
 仕事を止められるまで、体の疲れで休むだけでいっぱいなので、まだ制作のほうを再開できない。
 もう少し待って下さい。
 
 
 今回はそもそもゲームとは何か、ゲームの面白さとは何かの一つを考察してみたいと思います。

  “ゲームの面白さとは何か” の続きを読む