おことわり
初心者の日記です.
ほんとうに ただの日記 です.
状況
DRPGのようなものを作ろうとしてみている.
ちょっと前のミニゲームのときと同様に,C++の「Windowsデスクトップアプリケーション」である.
- 関連する過去の日記:
で,まぁ,何だかんだと小規模(というか自分でもなんとか実装できるくらい簡単)な仕様にして
- 「街」の機能
- 「宿」で泊まって回復できる
- 「店」で何か売り買いできる
- 「酒場」でパーティ編成とかできる
- 迷路に行ける
- 迷路
- 複数階層を歩ける
- 「街」に戻れる
- ランダムエンカウントした敵と殴り合える
- 負けた場合は「街」に戻される
- キャンプ画面?(何て呼ぶのかわからんが,アイテムとか使うような画面)で手持ちのアイテムを使って回復したりできる
……くらいの基本的なところはできた ……んだけども……
虚無すぎる
はい.
何も無い迷路を歩きまわって,それでどうだというのか?
いやまぁ,実装に挑戦している人としては「プログラムが想定通りに動けている様」というのを見ているだけでもわりと楽しいものではあるのだが,
そういう話じゃなくて,なんというかこう,ゲームのコンテンツ(?)的なのが何もないよね,っていう.
ランダムに襲ってくる敵しかいない迷路を徘徊しているだけでは「ゲーム」になってないのでは感,みたいな.
……なので,この空っぽすぎる寂しい世界に何か置こうと思った.
行き止まりに宝箱があるとか,人がいて話すと何かヒントくれるとか,なんかそういうのが欲しい.
(しかし,誰がプレイするわけでもないのに「ヒント」とか何の意味があるのか? とかなんとか考えちゃうといろいろと悲しくなってくるね!)
スクリプト?
どこで何が起こるのか,どんな「ヒント」とやらを表示するのか?
さすがにそういうのをハードコーディングするのはつらい気がするので,外部ファイルから読込んで動くようにしたい! とかいう欲を出した.
が,「字句解析」だの「構文解析」だのいう,なんか小難しそうな世界にマジ突入したくはないので,ここは「INIっぽいやつで書く」ということにした.
//どんなときに何が起こるのかを定義するファイル!!
//1個目の定義
[0]
//座標
Pos = 0,3,3
//どんな操作をしたときに起きるのか
Trig = OnInspect
//見た目(迷路内での表示)
Looks = Char,None
//2個目の定義
[1]
Pos = 0,3,0
だいたいこんな程度のものにするならば,
- とりあえず1行ずつ読み込んで
- それを
=
で区切って -
=
の右側に関しては,さらに,
で区切る
くらいの話で済むので,自分でもギリやれる.
何か起こることを「イベント」と呼ぶこととするならば,↑の例では,2つのイベントの発生条件とかを定義している感じだ.これでとりあえずは
【迷路を歩いている際に座標が (0,3,0)
になったときには「イベント1」を実施すべきなのだ】
みたいな情報ができた.よかった.
実際に何が起きるのか? という「イベントの内容」については,「イベント」毎に別のファイルに書くこととする.
こっちのファイルにはわりと「手続き」を書かねばならないわけだが,だからといって記法をプログラミング言語っぽく(?)してしまうと「読込処理を実装できない!」という事態になることは明白.どうすれば?
↓
大昔に「アセンブラ」だかいうのを一瞬習った気がするが,ああいう記法で良くね? みたいな:
//イベントの処理内容を書くファイル!
//処理は必ず [Page0] から始まるというルールにする
[Page0]
//何か画像を表示
ShowImg "EvImg/Centaur.bmp"
//ウェイト
Wait 3
//メッセージ表示
Msg QuestionMsg
//選択肢表示
//どれが選択されたのか,そのindexが変数L0に格納される
Sel L0,"自分は…","ちょっとした猫大好き!","そうでもないです"
//猫大好きな側を選択した場合,[Page1]に進む
J== L0,0,1
//メッセージ表示
Msg MsgForNo
//(終了)
[Page1]
//メッセージ表示
Msg MsgForYes
//お金が 70000 増える
AcqMoney 70000
//(終了)
//以下は表示するメッセージの定義
[QuestionMsg]
"俺は猫大好き!"
"おまえはどうなの?"
[MsgForYes]
"GOOD!"
"この金をやる!"
[MsgForNo]
"は?"
"じゃあ帰れよ"
"うぜぇ……"
記法的にはさっきのファイルから =
が無くなったという程度であるから,自分でも読込処理がギリ実装できる.
変数の中身を条件にして処理を別のセクションに飛ばす(ラベルにGOTOする)みたいなのさえあれば処理分岐とかも実現できるし,この程度で十分かな,と.
見た目
…と,ここまでで,虚無だった迷路で「何かが起きる」ようにはなったのだが……
やはりグラフィック的に「何かがある」と見えないと寂しい.
↑のファイルで //見た目(迷路内での表示)
とかいう設定が書いてあるが,これを表示に反映したい.
…んだけど,これが難儀.
迷路の描画は当然ながら GDI で実装しているのだが,その実装の制約的に,3Dなオブジェクトをガチで描画ってのはちょっと無理.
というか,そこで3Dグラフィックにこだわり(?)出すのであれば,それはもう「OpenGL だとかを使おうよ」っていう話になるわけで,ここも「まぁこれでいいよね」的に簡便にすませたい.
迷路(の壁)は MoveToEx()
と LineTo()
だけで描いてるんだから,物体もそれで描くんだよ!
そう,ワイヤーフレームである.
極限までシンプルなグラフィック「謎の四角い物」であるが, 「= 宝箱がある =」という文章を出せば,それはもう宝箱になるのだ .OKすぎる.
というか,最初は結構たくさんの線を用いて宝箱を描こうとしたのだが,陰線消去とかが全くないワイヤーフレームって,線が多ければ多いほど全く意味不明になる(というか,そうなった)ので,あきらめた.
なんだろう,トイレの入り口とかにあるピクトグラムみたいなのを目指したのだが…… まぁ,うん.無理.
とはいえ,こっちもこんな感じ↓で, 人物の絵を出してやれば人物だということになる と思うのでOK.
ところで,こんな感じにワイヤーフレームで表示していて気づいたんだけども,
視野の関係で「自分のいるマスに何かあってもほとんど見えない」という問題が結構厄介.
カメラ位置はマスの中心ではなく少し引いた位置にしてはあるのだが,それでも↑の宝箱は配置を壁際に寄せることで何とか視認できている状態.ピクトグラムの方もサイズをかなり小さく細くしてなんとか視野に納めている.
しかし地面に魔法陣みたいなのを描いてみたりする場合だと,その上に乗ったらもう全然見えないよね,っていう.(そのマスに踏み込む前の段階では見えているのだからOK…っていう話でいいのか?)
あと,(2Dな直線描画処理で頑張って描いている都合上)複数のワイヤフレーム物体が視野内にある場合には遠くのやつから順に描画しないと変なことになるっていう.
物体を楽しく並べる段になって始めてそこが実装から抜け落ちていることに気付き「マジかよ今から描画系の実装に立ち戻るのかよ……つらたん」みたくなった.
まとめ
迷路の中に物を置きはじめたら,すこし賑やかさ(?)が出てきた気がする!
あと,「街」側に関しても,全面真っ黒な画面に最低限のUIだけがぽつんと描画されている様というのは虚無感がすごいので,店的な画面に店員らしき絵を配置してみたりとか.
残された課題
とりあえず作った仕組みで迷路を賑やかにしていくとして……ゴールが無いです.
ゲームであれば「ゲームクリア」というのが必要であろう.
しかし「クリア」って何だろう?
何らかのクリア条件を満たしたときに何が起こるのか?
それなりの人数で作ってるとかだと「スタッフロール」だのがあり得るのかもしれんが,1人だともちろんそんなのは無いわけだし,
そしたら「乙」という簡素なメッセージが出た後でブツっとAPPが終了するのだろうか? なんだかなぁ……
あと,「セーブとロード」とかがあるといいかな.