fc2ブログ

変数呼び出し値から主人公を動かす

15/01/05改稿

TIPSの方では、ローグライク作成に不可欠とまでは言えないものの、あると便利な技術やシステムの作り方を載せていきたいと思います。
ということで第一弾、変数呼び出し値から主人公を動かす。
ウディタの話なので、ウディタ利用者以外は読んでも意味がないかと思うけども。

さて、ウディタでは主人公を動かす方法がいくつかあります。
一番ポピュラーなのが普通の方向キー入力による移動。ただのRPGだったらこれだけで十分です。
また、イベント中などでは「動作指定」から主人公を動作させることも考えられます。自動キー入力などでも代用可能ですね。
そして最後に、あまり知られていない裏技があって、今回はそれの使い方や特徴を紹介します。

すなわち、「変数呼び出し値」から主人公を動かす。

変数呼び出し値というのは1600000+Xでコモンセルフ呼び出しとかいう例のアレのことです。CDBやUDBの指定タイプ・指定データ・指定項目の数値を引っ張ってきたりすることもでき、とても便利なので、この使い方はマスターしておくといいと思います。

さて、実はこの変数呼び出し値には、主人公や指定イベントの現在座標を呼び出す数値が存在します。
主人公のX座標(標準)呼び出しが9180000、Y座標(標準)呼び出しが9180001です。どんどん+1していくと、精密座標呼び出しや高さ呼び出しなんかもできることが分かります。
また、マップイベントについては9100000+(イベント番号)×10で呼び出すことができます。
この変数呼び出し値を以下のように使うと、主人公を移動させることができます。

1.データを呼ばないにチェックを入れた状態で変数に変数呼び出し値を入力。
2.さっき入力した変数(9180000などが保管されている状態)に、X番の変数呼び出しにチェックを入れた状態で主人公を移動させたいXY座標を代入。

こうすることで、主人公が勝手に指定XY座標まで移動してくれます。もちろんマップイベントにも応用可能です。
が、どうしてこんな面倒な手順を踏んで主人公を移動させる必要があるのか。

言うまでもなく、ターン処理を行うタイミングを監視するためですね。
主人公の移動をコモンイベントで制御しておいて、一歩移動させるごとにターン処理を行うので、これはローグライクでは必須の技術なんではないかと思います。

注意点。
変数呼び出し値から主人公を動かした場合は、移動速度は反映されますが、向いている方向は変わらず、主人公はすり抜け状態になります。なので、上に動くときは上を向くなど方向を反映させる必要があるほか、移動方向に壁があるときは移動できないようにするなどの注意が必要です。
また、キー入力受付は異常に感度が高く、ちょっと方向キーを入力しただけでも滑るようにどこまでも移動してしまいます。なので、入力を実行するまでのキー押し時間や、入力受付間のウェイトなどを使って、移動を常識的な感度に設定する必要があります。

14/7/29
補足。書き忘れてましたが、ウディタキー入力で矢印キーの入力を受け付ける際、斜め方向の入力判定がやたらシビアです。特に右下方向は入力してもほとんど右か下かにしか入力判定がいかず、ここは自分もコモンを作るときに苦労しました。ぱっと見た感じでも、他のウディタ製ローグライクでも斜め移動がやりづらい作品はけっこう多いみたいです。
なので、コモンの組み方としては、斜め方向を単体で受け付けるのではなく、右が押されてから下が押されていたら右下と判断するとか(下の後に右も同じ)、そういう工夫が必要になると思われます。
ここらへんは他のゲームではまず手を加えないような部分なので、誰しも苦労するでしょう。しかし、ローグライク(特にターン制の不思議のダンジョン)である以上、移動の操作性は何をおいても重視すべきなので、ここはシビアに作っていければと思いますね。

15/01/05
さらに補足。↑でこんなこと書いてますが、自分のキーボードがイカれているだけかも。ゲームパッドだったら全然問題なかった。

ランダムダンジョン生成―通路生成

空間分割、部屋生成と手順を踏んで、最後に通路の生成を行います。
(テストプレイすると分かりますが)今のところマップに長方形の部屋がいくつかあるだけです。
通路の生成では、これらの部屋と部屋をつなぐ通路を作ります。

ではまず、基本的な考え方。
通路の生成では、とりあえず一本道の通路ができるように通路を生成します。
やり方はというと結構簡単で、空間DBの隣り合っている番号について、それぞれの部屋と部屋を結ぶように通路を作ればいいです。(もっとも、これは空間分割の際に空間の並び順を整理していた場合の話であり、整理していなかったときは別の処理で隣り合っている空間を探し出す必要があります)

ということで、手順。

間に通路を生成する二つの空間を取得。それぞれの空間にある部屋情報を取得。

通路の入り口となる部屋の座標を決める。二つの部屋の位置関係を考慮して、左右で隣り合っているんだったらそれぞれ部屋の左端と右端に入り口の座標を設定する。上下のときも同様。

決めた座標から部屋の外の空間に向かって足を出す。ここで出す足(通路)の長さは、その部屋を含む空間の端っこまで。

伸ばされた足を延長してそれぞれ一マス分空間の外に出す。この時点で、それぞれの足の先はどの空間でもない場所(空間と空間の隙間一マス分の位置)にあるはず。

伸ばされた足と足を直線の通路でつなぐ。空間分割の際に空間と空間の間を一マス空けていたのはこのためで、この一マスがないと通路が思わぬところで部屋の周りの壁を削ってしまったりする。

この処理をそれぞれの空間に対して施して、とりあえず通路完成。


…はい、ややこしいですね。


この二つの部屋に通路を作ることにします。赤枠が空間、黒枠が部屋です。

それぞれの部屋の入り口を決めたら、そこから空間の端まで足を出します。

足を延長して、空間の外に一歩分だけ出します。

足と足を直線でつないで、通路が完成します。

ということで、これでとりあえず一本道の通路が完成します。あとは隣り合っている空間を検索して、そこにさらに通路を付け加えていくなどすれば不思議のダンジョンっぽい地形が出来上がります。

注意点としては、部屋の入り口を決める際は、すでにある部屋の入り口の位置を考慮すること。
入り口のすぐ隣に入り口を作ったりすると、通路と通路の間の壁が消滅して幅ニマスの通路ができたりしちゃいます。
部屋の同じ端に入り口を二つ以上つくるときは、すでにある入り口から必ず一マス以上離して作るようにしましょう。
で、さらなる注意点ですが、そうやって入り口の位置を分けていると、小さな部屋ではこれ以上どこにも入り口が作れないような状態が発生してしまいます。これに対処する処理を組み込んでいないと、500000エラーが出ることになるので注意しましょう。
具体的な対処方法としては、部屋の入り口の位置をすでにある入り口の位置と同じにしてしまうこと。
こうすると通路の途中で三叉路が作られて、ちょうどいい具合に通路を作ることができます。
ScreenShot_2014_0703_11_35_12.png
↑完成例。生成する空間の数とかはデータベース側で設定できるようにしておくと、いろんなダンジョンを作るときに個性を持たせられていいかも。なお、ちゃっかりミニマップが表示されていたりお店があったりしますが、その詳しい作り方については[TIPS]の方をご覧ください。

ランダムダンジョン生成―部屋生成

今まで机上の概念的な話ばかりで頭が痛かったですが、ようやく画面処理にも入っていきます。
部屋の生成です。
不思議のダンジョンシリーズではなんだか複雑な形の部屋もありますが、残念ながら自分にはそこまで処理するだけの能力がないので、とりあえず長方形の部屋を作ることにします。

が、その前にやっておくべきことがひとつ。マップをすべて床と天井で埋め尽くしてしまいます。
ウディタの場合は、レイヤー1を床チップで敷き詰め、レイヤー2を天井チップで埋め尽くすといい感じです。
あらかじめ天井で埋め尽くされたフロアから、天井をくりぬいてダンジョンを生成するイメージですね。

さて、では部屋の生成手順。

空間分割の情報を保存してある空間DBを参照。空間の起点(左上)となるXY、終点(右下)となるXY座標を取得。

あらかじめ部屋の最小縦サイズ、最小横サイズを決めておき、部屋のサイズがそれ以下にならないように空間内に作る部屋の座標(起点と終点)を決定。 

決定した部屋の空間について、レイヤー2の天井チップをくりぬく(透明チップで上書きすればOK)。

次の空間へ。

こんな感じです。空間分割よりは分かりやすいしやりやすいと思います。
注意点としては、こちらも空間いっぱいいっぱいに部屋を生成せず、一マス空けておくこと。これも後で通路を作る際に必要な処理になります。


↑イメージ。ヘタクソだけど、外側のでかい四角形が空間で、内側の四角形が部屋。必ず一マス空けるように!
空けてないと通路を作るとき、通路と部屋の間の壁がなくなるおそれがある。

余談:長方形じゃなくてさらに複雑な形のダンジョンを作るには、この部屋空間をさらにひとつの空間とみたてて、その空間の中に、部屋が複雑な形になるように天井をくりぬけばいいらしい。自分は長方形で妥協してしまったので詳しいやり方はしりません。あしからず。

ランダムダンジョン生成-空間分割

15/01/05改稿

さて。
別にこいつはローグライク必須の要素というわけでもないですが、いちおうランダムダンジョンの作り方なんてのも載せてみます。
といっても、別に面白くもない四角形の部屋&通路ダンジョンを生成するだけなので、たいしたことは書けないです。
そんなことより自然っぽい地形を生成したいよ~とかいう方は、自作ゲー『ワールドフロンティア』にて悪戦苦闘した記録があるので、そっちを見てみては。

不思議のダンジョンチックなダンジョン生成については、自分も他のサイトを参考にしたので、とりあえずはこちらを見てみるといいかと思われます。
ttp://www40.atwiki.jp/spellbound/pages/384.html

基本的なランダムダンジョンの生成手順は3つに分かれます。以下、この流れに沿って説明していきます。
1.空間分割
2.部屋生成
3.通路生成

1.空間分割
ここではまず、まっさらなマップをいくつかの空間に分割する処理を行います。
ここで分割した空間の中に、後で部屋を作ることになります。
手順はこんな感じ。

[ループ地点]
空間を二つに分割。空間の縦サイズ>横サイズのときは縦分割、逆なら横分割。これはどの分割においても一緒。分割線を入れるときは、分割によってできる空間が小さくなりすぎないように注意。

できた二つの空間の情報をデータベースに入力。左上の点の座標とか、右下の点の座標とか。

あらかじめ空間の最小縦サイズ、最小横サイズを決めておき、できた空間をさらに分割しても最小サイズ以下にならないときは、ループ地点に戻る。
どう分割してもどちらかが最小サイズ未満になってしまうときは、分割できないので次の空間に移動。

文字だと分かりづらいですが。。
絵で説明するとこんな感じです。


最初の何も分割のされてないマップ

一回分割した後の状態


分割した空間をさらに分割


さらに分割


これ以上分割ができなくなったら(=分割すると空間の最小サイズ未満になってしまうときは)次の空間の分割に移行


空間分割が完成した状態
この空間の中にひとつずつ部屋を生成する。

注意点としては、空間と空間の間を必ず1マス空けること!
後で通路を作る際に困ったことになってしまうので、空間と空間の間は必ず1マス空けるようにしましょう。
なお、空間の最小サイズについては余裕をもって設定するといいと思います。というのも、その空間の中にさらに部屋を作ることになるからです。部屋サイズも最低4×4くらいは欲しいので、空間サイズも最低6×6くらいは欲しいですね。
また、空間分割の際は、それぞれの空間の空間情報を保存するデータベースの並びを整えていくとのちのち便利です。

空間DB
1.空間A
2.空間B


とあるときに、空間Aを分割したら

空間DB
1.空間A
2.空間A'
3.空間B


と保存するようにすると後で通路を作る際に困らずに済みます。

ローグライクをつくる

15/01/05改稿

※全部ウディタでの話なので注意してください。

さて。ローグライクをつくるということで、いろいろ書くに先立って、とりあえず自分がローグライクをつくってみた経験から、ウディタでローグライクをつくるうえで知っておくといいことを書き連ねてみます。

1.システムは全自作!
→当たり前ですが。ローグライクをつくろうとしたらシステムは全部自分でつくるしかないです。
どこかにローグライクコモンが落っこちていればいいですが、残念なことにウディタ公式にはそのようなものはありませんでしたね~。
ということで、最初から全自作するつもりで挑みましょう。

とはいえ、僕からするとローグライクなんて他のジャンルのゲームに比べればかなり敷居の低い方です。
アクションRPGと同等か、それ以下くらいかなぁ。
当たり判定で数学的演算が必要になる横スクロールアクションとかレーシングゲーム(種類にもよるが個人的にはこれが最難関なのではと思う)とかに比べれば、専門知識のない一般人でもつくりやすいです。

ただし、製作量はRPG並み+αなので、気力と時間のない人にはあまりお勧めできません。
コモン数は人によるけど、だいたい200~300くらいかなぁ。
ゲームの性質上、一歩歩くごとにいろんなコモンイベントを動かしまくることになるので、地道な作業が好きだったり論理的に考えるのが好きだったり、整理整頓の得意な方にそれとなくお勧めしておきます。

2.基本システムはひととおり見る!
→ローグライクに限らず、自作システムでゲームをつくるうえで土台となるのが基本システムの知識です。
コモンの扱い方とか処理軽減の仕方とか、ちょっとしたテクニックを吸収するためにも基本システムの中身は全部頭に入っているのが理想ですね。
基本システムでさえ何をやっているのかよく分からんという方は、まず基本システム改造のRPGを短編でもいいのでひとつつくってみることをお勧めします。
ローグライクってもRPGと似た部分は非常に多いので、とっても参考になることでしょう。

僕が思うに、ローグライクをつくる前に最低限、
・自作戦闘をつくれる(フロントビューなどの形式は問わず)
・自作メニュー画面をつくれる(アイテム使用、装備変更、セーブロード操作etc…万能ウィンドウも自作できるとなおよし)
・ピクチャのあらゆるコマンドの使い方を理解している(相対モード、スクロールとリンク、ディレイリセットなどなど)
くらいの技術は必要な気がします。
特に戦闘は基本システムの流れを追うだけでもいいので、ひととおり自分で形にしてみるとよいと思われます。
なにしろローグライクなんて、戦闘フェーズを無限ループさせてるようなゲームですからねぇ。
ステータス一時値再計算とか状態更新とかレベルアップ処理とか、そこらへんのコモンイベントで何をやっているのか、ちゃんと理解してますか~?

3.凝るところと凝らないところを区別する!
→ローグライクって頻繁に使う処理と使わない処理の差が激しいんですよね。
具体的にいうとターン処理なんかは一歩歩くごとに呼び出しますが、攻撃処理なんかは攻撃キーが押されたときにしか使いません。
どういうことかというと、頻繁に呼び出す処理がやたらに重かったらプレイヤーにとって非常にストレスなわけです。なので、頻繁に呼び出す処理はなるべく簡略化して、その代わり攻撃処理なんかでは思う存分演出を加えるといいんじゃないかと思います。こういう感覚は他のいろんなゲームをつくるうえでも役立つんじゃないかなぁ。

4.コモンイベントはなるべく抽象的に!
→こいつは別にローグライクに限ったことじゃないが。
基本システムを見ても分かる通り、コモンイベントの中には具体的な数値なんてほとんど入れない方がいいです。じゃないと後から改変しようと思った時に、とっっっても厄介なことになります。
特に長編をつくろうとすると、コモン数も増えるし、あとからいろいろ変えたい部分も出てくると思うので、多少面倒でも必要な数値は全部DBに打って、DB入力ひとつでコモンの動きを制御できるようにしておきましょう。
あと、コモンの呼び出しやDBの参照にはとことん「名前」を使うことをお勧めしておきます。数値で呼び出すと、項目がひとつずれただけでまったく動かなくなってしまうので…。

5.コモンイベント、DB構成はなるべく一元化・一般化させる!
→ローグライクではあらゆる生物(オブジェクト)がパラメータというものを持っています。
当然、これらのパラメータはひとつのDBで管理するし、敵も味方も同じコモンイベントを使ってAI移動させたり配置したり消滅させたりします。
アイテムの種類や生物のタイプによって通す処理を変えたりすると手間だし、なによりバグの温床になります。
というわけで、↑の内容と似通ってますが、柔軟性に富んだDB構成やコモンイベントをつくるとよいのではと思われます。

今さら…

自己紹介とか所信表明とか。
初めまして、こよると申します。

少し前に『ふりーむ』さんにて、自分が初めて作ったゲーム『スフィアン・マスターズ』を投稿しました。

↓布教(ふりーむのアドレス)
ttp://www.freem.ne.jp/win/game/6774

あっちの紹介文にも書いたんですが、そもそもアレは暇つぶしもかねて自分用にチョコチョコ作ってたゲームで、できたから投稿してみるかーくらいの気持ちで投稿したわけです。
なのでまぁ、反響とか特に期待してなかったんですが意外にもウケて、いろんな方からメールで感想やバグ報告をいただいたりしました。本当にありがたい限りです。
で、何人かの方からホームページがあるといいよー的なコメントをいただき、根っからの情報弱者である自分は今までブログもフェイスブックもツイッターも何もしていなかったわけですが、せっかくだからという気になりました。

ゲーム制作以外にもいろいろ趣味はあるんですが、とりあえずこのブログは「ウディタでゲーム開発」に絞っていこうかと思います。ウディタでゲームを作る際の役立ち情報とかも掲載するかもしれないので、よかったらお読みください。

以下近況報告
・とりあえずスフィアン・マスターズは開発終了
・今度はトルネコみたいなローグライク作ろう!
・(ローグライク開発中…)

ということで、しばらくはローグライク開発録とローグライク製作講座がメインになりそうです。
Twitter
カテゴリ
最新コメント
月別アーカイブ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR