そろそろ「交換」処理を作っていきたいところ。
1ユニットのアイテム所持数が5なら、交換では10個ぶんのアイテム表示がなされます。押せるボタンが10以上ある自作メニューをつくるということですから、あれこれ操作性にも気を付けたほうがよさそうですね。
有効な対象がいる時だけ選べるようにする
パネルの表示で「ユニットがいる場所」を指定できるように
交換や攻撃のパネル表示は、距離のみをチェックして表示していました。
そうすると、交換の対象にできない他軍ユニットにもパネルが出たり、同軍ユニットがいる場所にも攻撃可能なパネルが出たりしてしまいます。
(左のバツ印の方が今の状態)
パネルを出すか出さないかの判定に、そこにいるユニットの所属も増やしたいところですね。
「┃┣指定位置からnマス距離にパネル」コモンをいじるわけですが、入力値はすでに4つの変数を使いきっています。
文字列変数(cself5)をフラグとして使い、次のような判定をさせましょう。
- “1”とあれば、所属1つまり自軍ユニットがいればパネルを表示(交換)
- “2”,”3″と入力してあれば、所属2か3どちらかがいればパネルを表示(攻撃)
- 文字列変数がカラなら、ユニットの在不在は問わずにパネルを表示(”1″,”2″,”3″と入れた時と同じ)
- それ以外の文字列をいれれば絶対にパネルを出さない(使わないと思いますが)
この状態によってはパネルが出ないこともあるでしょう。
パネル表示数を返り値として、呼び出し元で「パネル表示数がゼロならウンヌン……」と判断できるようにしています。
コマンドリストの追加時にチェック
「対象にとれるユニットがいないマスにはパネルを出さない」なら、そもそも「そのコマンドが実行できない(対象がいない)時はコマンド自体を選択肢に出さない」というのも、ユーザビリティへの配慮です。
コマンドによってその条件の判定は異なりますが、ごく簡単に考えるなら、上記の「┃┣指定位置からnマス距離にパネル」コモンを呼び出して、パネル(返り値)が1以上あればいいはずです。
返り値だけもらってすぐにパネルの全消去を行えば、プレイヤーさんにはパネル表示があったことは確認できません(入力値によるフラグを増やして非表示にさせても良いですが)。
操作中ユニットと交換対象のユニットの全員がアイテム所持数ゼロの時は、交換のしようがありません。本来はこういう状況にも対応したいところですが、複雑になりすぎるのでまたの機会に。
「交換」の実処理をつくっていく
まずは流れと理屈の確認
2ユニット間のアイテムのやりとりですから、「使う」の処理で行った”ユニットの所持アイテムの選択肢化”を2回こなせばよさそうです。
そして交換したいものを2つ選ぶので、操作中は次のフラグの区別が必要になるでしょう。
- 0個のアイテム選択中(初期状態)
- 1個のアイテム選択中(交換対象を1つ決めた)
- 2個のアイテム選択中(交換対象を2つ決めたので、交換成立。1番へ戻る)
また、「空欄」という欄も存在し、そこも選択できるようにするほうが交換処理の場合は望ましいでしょう。
「おなじスロットを2回クリックして、相手側に空欄があればそちらへ移動させる」といった動作もあるとより使いやすいかと思います。
それではやっていきましょう。
既存の選択肢の処理と変わらない部分から
操作待ちのループと描画部分を分けて、こんなふうにしてみましょう。
見切れている下の部分は過去にやった選択肢の描画とおなじです。
これで、カーソルのあっているスロットが点灯するようになりますね。
既存コモンの修正
また、図のように空欄が複数あって、好きな位置をクリックできる状態なら、交換の結果「空欄/空欄/てつの剣/空欄/空欄」といった状態も発生します。
過去にアイテム消去コモンで作った「上詰め」部分を独立のコモンとし、「アイテムを取得」、「アイテムを消去」、「┣アイテム位置交換」などの最後で呼び出すように変更します。
どうやら「ひとつのコモンでひとつの機能」を徹底すると後がラクなようです。プログラマー的にはモジュール化というそうな。そのほうがコモン1つあたりの長さも抑えられてわかりやすそうですね。
さらにアイテムリストの取得コモンもおおざっぱに済ませていたのを修正します。
上詰めされている前提ですから、空欄を見つけた時点で処理を中断しても構いません。
交換処理の本体の仕上げ
対象アイテムを2つ選ぶので、対象アイテムを1つがすでに決まっている時はそこにマーカーを出したいものです。
描画コモンで、不透明度ゼロでマーカー用のピクチャも追加するとよさそうですね。「点灯基準」という変数を使っているあたりです。
マーカーを出す代わりに、対象アイテム1として選択中の当たり判定用ピクチャを専用の色に変える方法も考えられます。当たり判定時の色変え分岐はややこしくなるので、別ピクチャをマーカーに使うほうがラクと思います。
マーカーも見えないだけで10個描画されていますが、実際は1つしか使いません。気にするなら「画面外にあるマーカー画像を対象1のそばに移動させる」といったやり方もありそうです。
また、右クリック・左クリック(キャンセル・決定)時も、対象アイテム1が決定されているかどうかで挙動が変わってきますね。
このあたりをケアすれば交換の処理は完成です。
ずいぶん長くなりました。150行ないぐらいですね。
対象がアイテムスロット1のとき、操作するCDBはこの記事だと5番です。スロット2なら対応CDBは6。アイテムスロットの変数に+4をしているのはそういうわけです。
出来上がり