【0059】アイテム画面を作る①
様々な機能がまだ放置気味だと言うのに
新たな機能に取り掛かる愚行に出ます。
ローグ系ゲームの目玉と言えるアイテム!
を表示する画面ですね。
もうしつこいほど映してますけど、これが今の画面構成です。
実はメニュー画面と同じ領域に
アイテムを表示しようかなと思ってたんですが、
あまりにも表示領域が小さい(文字数の制限がキツイ)ので
途中で全画面を使うように切り替えました。
メカニズム的にはメニュー画面と近いものを想定しています。
・上書きされる領域を退避
・アイテム画面を表示領域に上書き
・持ち物を更に上書き
・コマンド体系を切り替え
・カーソル移動機能の実装
という感じです。
というわけで、まずはアイテム表示枠の表示情報を作ります。
: 'アイテム欄表示内' && {
##################################################
## 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も更新していきます。記憶が正しくないかもしれませんが)
実行してみます。
it.
はい、出来ました。
この状態ではまだ前の画面に戻ることも出来ません。
(コマンド体系の変更→戻るコマンドの実装をしていないため)
それは今後付け足していきます。