見出し画像

【0059】アイテム画面を作る①

様々な機能がまだ放置気味だと言うのに
新たな機能に取り掛かる愚行に出ます。

ローグ系ゲームの目玉と言えるアイテム!

を表示する画面ですね。

画像1

もうしつこいほど映してますけど、これが今の画面構成です。

実はメニュー画面と同じ領域に
アイテムを表示しようかなと思ってたんですが、
あまりにも表示領域が小さい(文字数の制限がキツイ)ので
途中で全画面を使うように切り替えました。

メカニズム的にはメニュー画面と近いものを想定しています。
・上書きされる領域を退避
・アイテム画面を表示領域に上書き
・持ち物を更に上書き
・コマンド体系を切り替え
・カーソル移動機能の実装
という感じです。

というわけで、まずはアイテム表示枠の表示情報を作ります。

	: 'アイテム欄表示内' && {
		##################################################
		## defItemInfo
		##  アイテム一覧表示。レイヤー2。
		##   lnItemInfo[]にアイテム一覧表示内容を格納する
		##################################################
		function defItemInfo() {

			declare -a -g lnItemInfo=()

		 #初期状態      0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999
		 #文字数        0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
			lnItemInfo+=('+------------------------------------------------+----------------------------------------------+--+') #00 
			lnItemInfo+=('|   所持品  ページ目                             | 説明                                         |直|') #01 
			lnItemInfo+=('+------------------------------------------------+----------------------------------------------+--+') #02 
			lnItemInfo+=('|                           |                       |  |') #03 
			lnItemInfo+=('|                           |                       |  |') #04 
			lnItemInfo+=('|                           |                       |  |') #05 
			lnItemInfo+=('|                           |                       |  |') #06 
			lnItemInfo+=('|                           |                       |  |') #07 
			lnItemInfo+=('|                           |                       |  |') #08 
			lnItemInfo+=('|                           |                       |  |') #09 
			lnItemInfo+=('|                           |                       |  |') #10 
			lnItemInfo+=('|                           |                       |  |') #11 
			lnItemInfo+=('|                           |                       |  |') #12 
			lnItemInfo+=('|                           |                       |  |') #13 
			lnItemInfo+=('|                           |                       |  |') #14 
			lnItemInfo+=('|                           |                       |  |') #15 
			lnItemInfo+=('|                           |                       |  |') #16 
			lnItemInfo+=('|                           |                       |  |') #17 
			lnItemInfo+=('|                           |                       |  |') #18 
			lnItemInfo+=('+============================================+===+==============================================+==+') #19 +1
			}
		}

まあはい。
動きゃいいんだよ。
pフォントだと表示崩れてるかもしれませんが
まあやりたいことは察してください。

	: 'アイテムレイヤー結合' && {
		##################################################
		## joinFrameOnItem
		##  画面フレームと、アイテム表示枠を結合する
		##   lnSeedのマップ枠の中にlnItemInfoをはめ込む。
		##   また、所持アイテムの情報をはめ込んでいく。		
		##################################################
		function joinFrameOnItem (){
			
			##アイテム枠で上書き
			for ((i = 0; i <= 19; i++)) {
				lnSeed[i]="${lnItemInfo[i]}"
			}

		 #カーソル設置 
			lnSeed[3]="${lnSeed[3]:0:2}>${lnSeed[3]:3}"

画面上にアイテム表示枠を重ねる機能はこの通りです。
ただ作ったアイテム枠をlnSeed[]にぶち込んでいきます。

最後にカーソル文字の「>」を配置して終わりです。

この機能はメインループの中で
「it」コマンドとして呼び出されることとします。

	: 'コマンド受付' && {
		###########################################
		##getCmdInMain
		## mainLoopから呼び出される任意長コマンド受付
		## 各種コマンド割り振りと制御
		##  $1:メニュー内コマンド選択で呼び出された場合の引数
		###########################################
		function getCmdInMain(){

			case "$cmdMode" in

			 #通常時は続けてコマンドを取得し 、各種コマンドを起動する
				##通常時はコマンド数が多いためdispallコマンドは各ケースごとに記述する。
				##コマンドによって引数を変えるため。
				$CNST_CMDMODE_NRML0	)
					inKey2="$inKey"
					printf "$inKey2"
					getChrV

					inKey="$inKey2$inKey"
					case "$inKey" in
						'ma can')	ma can;;
						*'can'	)	dspCmdLog 'OK、キャンセルしたよ:)'
									dispAll $CNST_YN_Y;;
						'te'	)	te;;
						'??'	)	viewHelp;; 
						'man '*	)	ma "${inKey:4}";;
						'mv '*	)	mv "${inKey:3}";;
						'op '*	)	op "${inKey:3}";;
						'cl '*	)	cl "${inKey:3}";;
						'da '*	)	da "${inKey:3}";;
						'pk '*	)	pk;;
						'qq'	)	da 7;;
						'ww'	)	da 8;;
						'ee'	)	da 9;;
						'aa'	)	da 4;;
						'dd'	)	da 6;;
						'zz'	)	da 1;;
						'xx'	)	da 2;;
						'cc'	)	da 3;;
						'mn'	)	mn;;
						'it'	)	it;;<<<<<<<<<ここ
…続く

で、itコマンドを叩かれると呼び出されるのは

		###########################################
		##it
		## アイテムを開く
		##  引数なし
		###########################################
		function it(){

		 #退避 
			escLnSeed
		 #lnseed上書き 
			joinFrameOnItem
		}
		}

です。

アイテム枠の上書き関数「joinFrameOnItem」を呼んでいますがその前に
「escLnSeed」という関数を呼んでいます。

	: '全画面表示内容を退避' && {
		##################################################
		## escLnSeed
		##  lnSeedの内容を一時的に退避する。
		##################################################
		function escLnSeed() {
			for ((i = 0; i <= 26; i++)) {
				escLnSeedInfo[i]="${lnSeed[i]}"
			}
		}
		}

アイテム画面はメッセージウィンドウの上側だけなので
全画面を退避する必要はないのですが、
なんか他にも使う場面がありそうなので
全画面退避する機能にしておきました。

これによって、
・メイン画面でitコマンドを入力すると
・全画面を退避して
・画面表示情報にアイテム枠を上書きして
・画面が更新される(アイテム枠が表示される)
というところまでができました。

一旦はここまでの更新とします。

(実際にはもう色々進んでいるのですが、実際に作ったときの段取りに沿ってnoteも更新していきます。記憶が正しくないかもしれませんが)

実行してみます。

画像2

it.

画像3

はい、出来ました。

この状態ではまだ前の画面に戻ることも出来ません。
(コマンド体系の変更→戻るコマンドの実装をしていないため)

それは今後付け足していきます。

この記事が気に入ったらサポートをしてみませんか?