スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ゲーム制作日記<46> アイテムを使った採取システム

op.png



みなさん、こんばんは。
ネコタです。



今回も恒例の『 コモンイベントで作るちょっとしたシステム 』 のご紹介。


今回のシステムは、採集システムを発展させた『アイテムを利用した採取システム』です。

どういうシステムかというと、特定のアイテムを所持している場合にのみ、特定のポイントで採集ができるシステムです。


過去記事『採集システム』を確認したい方はこちら↓
採集システム


では早速、実際の挙動を見てみましょう。


tc32-02.png


今回は、現在制作中の『ALQMEST』で実演してみます。

以前紹介した、ベン君に活躍してもらいましょう。


tc32-01.png


まずは、所持品の確認です。

現在『つるはし』を所持しています。


これから、岩からアイテムを採取します。
そのとき、この『つるはし』が必要となってきます。


tc32-03.png


画像なので分かりませんが、アルトでは、アイテムを採取できません。

なぜなら、彼は『つるはし』を扱えないからです。


というわけで、ここはベンにお任せ!


tc32-04.png


ここでさりげなく、ベンのマップスキルをご紹介します。

ベンは、通常の接触では採集できないアイテムを採集することができます。

例えば、このような岩。他にも、植物など色々な採集ポイントを用意しています。


ただし、採集のためにはアイテムを所持している必要があります。

今回のように、岩からアイテムを採集するためには『つるはし』が必要となります。


それぞれのポイントで必要なアイテムが異なるため、ベンの採集スキルを利用するためには、専用のアイテムを購入しておく必要があります。


ちなみに、ちょっと面倒くさいですが、マップスキルはメニューのスキルからも使用できるため、それを選択した場合には誰が先頭でも採取可能です。ただ、採取ポイントは尋常じゃないくらいあるため、いちいちそんなことしてられないと思います(笑)



さて、さりげなく宣伝をしたところで、システム説明に戻りましょう。

先ほどの画像のように、今回のシステムは『特定のアイテムを所持していないと採集できない、特殊な採集』を作ることができます。

牧場物語で例えるなら、石を手に入れるためにハンマーが必要だったり、木を伐採するために斧が必要だったり。

そういった類のシステムとなります。


今回紹介する形は『特定のアイテムを所持している場合に、採集可能状態となった特定ポイントで、特定スキルを使用すると採集できるシステム』という少し複雑なシステムとなっていますが、要所を押さえて取捨選択すれば、『特定アイテムを使用して採集』『特定スキルを使用して採集』といった、もう少し簡易的にした形にもできます。



それでは、まずは必要なものの確認から。

【必須】
・変数×10
・スイッチ×2
・コモンイベント×3
・リージョン×1

【推奨】
・コモンイベント(マップ範囲取得)

【カスタマイズ】
採集システム



推奨のコモンイベントですが、これは、以前の記事でも紹介させていただきました。

tc32-05.png

≪実行内容≫
変数の操作:#0029 【取得情報】マップ範囲X = $gameMap.width() -1
変数の操作:#0030 【取得情報】マップ範囲Y = $gameMap.height() -1



現在マップの範囲(X軸の最大値、Y軸の最大値)を取得し、変数に格納するコモンイベントです。

今回はコモンイベントを使わずに同じ形で記述していますが、過去記事の無限ミミックシンボルエンカウント畑システムなど、割といろんなところで利用できる処理内容なので、コモンイベントにしておくと少しだけ制作が楽になります。



また、カスタマイズ元の採集システムですが、コモンイベント内容は以下のとおりです。

tc32-06.png

≪実行内容≫
条件分岐:採集01 ≥ 【採集】時間
セルフスイッチの操作:A = ON
変数の操作:#0061 採集01 = 乱数 0..10

分岐終了
変数の操作:#0061 採集01 += 1
ウェイト:60フレーム


以前の記事とは内容が若干異なりますが、やってることはおおむね同じです。

60フレームごとに変数を+1し、指定した値になったら変数を初期値にリセットして、セルフスイッチAをONにする。これだけ。

セルフスイッチAがONになると採集可能なページに切り替わるように、イベント自体を組みます。



では、準備はこのくらいで。

それでは、実際の処理を見てみましょう。



まずは、イベントの内容から見ていきます。

今回の内容は結構複雑なので、処理順に説明していきます。そのため、イベントだったりコモンイベントだったりと、話があちこちに飛びます。

頑張ってついて来てください。


採集イベント:1ページ目
tc32-09.png

 プライオリティ:キャラの下
 トリガー:並列処理

≪実行内容≫
コモンイベント:採集待ち01



採集イベント:2ページ目
tc32-10.png

(画像変更のみの空ページです)


採集ポイントの1ページ目と2ページ目は、セットの内容となっています。

私のゲームにおいて通常の採集ポイントは、時間が経つと画像が変わり採集可能となります。その処理内容と同じですので、パッと見では同じ感じの印象を受けます。

ただし、2ページ目が空なので、普通に採集できるものではないのが分かるかと思います。


このイベントを起動させるためには、特定のスキル(アイテム)が必要となります。


tc32-11.png

≪実行内容≫
注釈:マップの範囲を取得します。
変数の操作:#0029 【取得情報】マップ範囲X = $gameMap.width() -1
変数の操作:#0030 【取得情報】マップ範囲Y = $gameMap.height() -1
注釈:変数情報をリセットします。
変数の操作:#0039 【採取】カウント数 = 0
変数の操作:#0116 【採取】検索座標X = 0
変数の操作:#0117 【採取】検索座標Y = 0
注釈:以下のループ処理で、マップ上の指定リージョンタイル数をカウントします。
注釈:今回は36番をカウントします。採集ポイントの位置に、あらかじめ指定タイルを敷いてください。
ループ
指定位置の情報取得:【取得情報】リージョン, リージョンID, ({【採取】検索座標X},{【採取】検索座標Y})
条件分岐:【取得情報】リージョン = 36
変数の操作:#0039 【採取】カウント数 += 1

分岐終了
条件分岐:【採取】検索座標X ≠ 【取得情報】マップ範囲X
変数の操作:#0116 【採取】検索座標X += 1

それ以外のとき
変数の操作:#0116 【採取】検索座標X = 0
条件分岐:【採取】検索座標Y ≠ 【取得情報】マップ範囲Y
変数の操作:#0117 【採取】検索座標Y += 1

それ以外のとき
ループの中断

分岐終了

分岐終了

以上繰り返し
スイッチの操作:#0081 採取用01 = ON


これは、スキルやアイテムなど処理の起点となるモノに組み込むコモンイベントです。

内容としては、マップ上の全てのタイルのリージョンを調べて、該当リージョン(ここでは36番)の数をカウントします。

リージョンの上に採集イベントを配置することで、実質的に採集イベントの数をカウントすることができます。

このカウントは、後に行われる処理の終了条件として使われます。


採集ポイントの数をカウントしたら、スイッチ:採取用01ONにし、次の処理に進みます。


採集イベント:3ページ目
tc32-12.png

 出現条件:スイッチ採取用01
 プライオリティ:キャラの下
 トリガー:自動実行

≪実行内容≫
注釈:採集可能状態でないため、終了処理に進みます。
変数の操作:#0039 【採取】カウント数 -= 1
セルフスイッチの操作:C = ON


このページは、イベント1ページ目に対応したページとなります。

採集ポイントが採集可能状態でない場合には、採集処理を行わずに終了準備処理へ移行させます。(終了準備処理として、このイベントは待機ページへ切り替えられます)


採集イベント:4ページ目
tc32-13.png

 出現条件:スイッチ採取用01
        セルフスイッチA
 プライオリティ:キャラの下
 トリガー:自動実行

≪実行内容≫
注釈:各位置情報と向き情報を取得します。
変数の操作:#0004 【取得情報】現在位置X = プレイヤーのマップX
変数の操作:#0005 【取得情報】現在位置Y = プレイヤーのマップY
変数の操作:#0034 【情報取得】イベントX = このイベントのマップX
変数の操作:#0035 【情報取得】イベントY = このイベントのマップY
注釈:イベントの位置とプレイヤーの位置を計算します。
変数の操作:#0004 【取得情報】現在位置X -= 【情報取得】イベントX
変数の操作:#0005 【取得情報】現在位置Y -= 【情報取得】イベントY
注釈:計算した位置情報により、条件分岐を組みます。
注釈:以下は、対象に隣接しているとき条件を満たす向きと数値の対応表です。
注釈:↓:X=0、Y=-1
注釈:←:X=+1、Y=0
注釈:→:X=-1、Y=0
注釈:↑:X=0、Y=+1
条件分岐:【取得情報】現在位置X = 0
条件分岐:【取得情報】現在位置Y = 1
条件分岐:プレイヤーが上を向いている
条件分岐:パーティがつるはしを持っている
ラベルジャンプ:効果処理

分岐終了

分岐終了

分岐終了
条件分岐:【取得情報】現在位置Y = -1
条件分岐:プレイヤーが下を向いている
条件分岐:パーティがつるはしを持っている
ラベルジャンプ:効果処理

分岐終了

分岐終了

分岐終了

分岐終了
条件分岐:【取得情報】現在位置Y = 0
条件分岐:【取得情報】現在位置X = 1
条件分岐:プレイヤーが左を向いている
条件分岐:パーティがつるはしを持っている
ラベルジャンプ:効果処理

分岐終了

分岐終了

分岐終了
条件分岐:【取得情報】現在位置X = -1
条件分岐:プレイヤーが右を向いている
条件分岐:パーティがつるはしを持っている
ラベルジャンプ:効果処理

分岐終了

分岐終了

分岐終了

分岐終了
条件分岐:使用不可がON
ラベル:効果処理
注釈:ここに条件を満たすときの挙動を書き込みます。
アイテムの増減:何かの鉱石 + 1
セルフスイッチの操作:D = ON

分岐終了
注釈:上記の条件に当てはまらない場合には、プレイヤーが隣接していない、
注釈:あるいは、プレイヤーが対象を向いていないため、そのまま終了処理に進みます。
条件分岐:セルフスイッチ DがOFF
変数の操作:#0039 【採取】カウント数 -= 1

分岐終了
セルフスイッチの操作:B = ON
ウェイト:2フレーム


このページは、2ページ目に対応したページとなっています。

採集可能状態であるため、イベントの処理判定を行うページです。

内容としては、プレイヤーとイベントの位置、プレイヤーの向き、所持品の判定をし、全ての条件を満たした場合に採集成功の処理を行い、フラグを立てます。条件を満たせない場合には、成功処理を行わず、そのまま終了準備処理へ向かいます。(終了準備処理として、待機ページへ移行します)

大事なのは、いろんな条件がある中で、パーティがつるはしを持っているという条件分岐です。この条件分岐が、この条件付き採集の肝になる部分ですね。



ところで、このページにはこんな処理が入っています。

条件分岐:使用不可がON
ラベル:効果処理
注釈:ここに条件を満たすときの挙動を書き込みます。
アイテムの増減:何かの鉱石 + 1
セルフスイッチの操作:D = ON

分岐終了


この条件分岐ですが、スイッチ:使用不可ONの時という謎の条件分岐となっていますね。

これは、ゲーム中で絶対に使用しないスイッチを条件分岐とすることで、通常は移行しない聖域を作るための処理です。

しかし、ラベルジャンプではこの条件分岐を無視して飛び込むことができるため、実質的にはラベルジャンプのみで移行することが可能な箇所として扱うことができます。

ページを切り替えたりする処理を省くためのテクニックとして、私は使っています。

今回の使用例としては、採集成功となる場合が独立して4条件あるため、それぞれに同様の処理を書くのが面倒であり、仮に修正が必要となった場合には4か所修正する必要が出てきます。

その作業を短縮させるための工夫として、あらかじめ聖域を作っておき、その中に飛び込ませる処理を組んでやることで、修正箇所を減らしています。



さて、このイベントページがなんでこんな面倒くさそうな構造になっているかというと、採集ポイントを複数作る場合にコピペで作りたかったためです。

イベントが完成した後は、作ったイベントを丸ごとコピペして、リージョンを敷いてやるだけで大量生産できます。そのために、結構面倒くさい処理を組んでいますので、頑張ってください。最初だけ作ってしまえば、あとは楽なんです。

(ただし、採集システムと同様の仕様にする場合は、1ページ目のコモンイベントだけ変更する必要があります。使用している変数が違うためです。詳しくは採集システムを参照してください)



で、そうなるとですね。

このイベントがコピペで大量生産されるということは、実は、スイッチ:採取用01ONになった瞬間、全ての採集ポイントのページが上記のどちらか(3ページ目か4ページ目)に切り替わっています。

それぞれのイベントごとに処理が順番に行われていきますが、この中で条件を満たせるイベントは全くない、あるいは、1つだけです。なので、採集成功処理が重複して起こることはありませんので、安心してください。重複したり、無限ループに陥ってしまった場合には、どこかの処理がおかしくなっています。

そして、上記の処理を行った後に移行する待機ページを作ります。


採集イベント:5ページ目
tc32-14.png

 出現条件:セルフスイッチC

(画像のみの空ページです)


採集イベント:6ページ目
tc32-15.png

 出現条件:セルフスイッチB

(画像のみの空ページです)


上記2つの待機ページですが、5ページ目は1・3ページ目に対応したページです。6ページ目は、2・4ページ目に対応したページです。

採集可能状態か、そうでないかで画像を分けると、こういう面倒くさい構造のイベントとなります。並行して作っていくので、頭がこんがらがりそう(笑)


さて、全ての採集イベントが待機状態へ移行したら、いよいよ終了処理へ進みます。

今度は、コモンイベントに飛びますよー。


コモンイベント:終了処理01
tc32-16.png

 トリガー:自動実行
 スイッチ:採取用01

≪実行内容≫
条件分岐:【採取】カウント数 = 0
注釈:全ての採取処理がスルーされた場合の処理です。
注釈:必要に応じて、空振りメッセージなどをここで表示させることができます。

分岐終了
注釈:採取処理がスルーされなかった場合は、カウント数を修正します。
条件分岐:【採取】カウント数 = 1
変数の操作:#0039 【採取】カウント数 -= 1

分岐終了
条件分岐:【採取】カウント数 = 0
注釈:マップの範囲を取得します。
変数の操作:#0029 【取得情報】マップ範囲X = $gameMap.width() -1
変数の操作:#0030 【取得情報】マップ範囲Y = $gameMap.height() -1
注釈:変数情報をリセットします。
変数の操作:#0039 【採取】カウント数 = 0
変数の操作:#0116 【採取】検索座標X = 0
変数の操作:#0117 【採取】検索座標Y = 0
注釈:以下のループ処理で、マップ上の指定リージョンタイル数をカウントします。
注釈:今回は36番をカウントします。採集ポイントの位置に、あらかじめ指定タイルを敷いてください。
ループ
指定位置の情報取得:【取得情報】リージョン, リージョンID, ({【採取】検索座標X},{【採取】検索座標Y})
条件分岐:【取得情報】リージョン = 36
変数の操作:#0039 【採取】カウント数 += 1

分岐終了
条件分岐:【採取】検索座標X ≠ 【取得情報】マップ範囲X
変数の操作:#0116 【採取】検索座標X += 1

それ以外のとき
変数の操作:#0116 【採取】検索座標X = 0
条件分岐:【採取】検索座標Y ≠ 【取得情報】マップ範囲Y
変数の操作:#0117 【採取】検索座標Y += 1

それ以外のとき
ループの中断

分岐終了

分岐終了

以上繰り返し
スイッチの操作:#0082 採取用02 = ON
スイッチの操作:#0081 採取用01 = OFF

分岐終了
ウェイト:2フレーム


内容としては、全てのイベントで採集成功処理が行われなかった場合には、空振りメッセージなどの演出を行い、採集成功処理が行われた場合にはフラグを削除します。

そして、次の処理へ進む準備として、再び採集イベントの数(リージョンの数)をカウントします。


最後のスイッチ:採取用02ONされると、採集イベントの終了処理が起動します。

はい、また採集イベントへ戻りますね。


採集イベント:7ページ目
tc32-17.png

 出現条件:スイッチ採取用02
        セルフスイッチC
 プライオリティ:キャラの下
 トリガー:自動実行

≪実行内容≫
変数の操作:#0039 【採取】カウント数 -= 1
セルフスイッチの操作:C = OFF
ウェイト:2フレーム


このページは、採集イベントの1・3・5ページ目に対応したページです。

採集可能状態でない場合には、セルフスイッチCをOFFにして元の状態(1ページ目)に戻します。



採集イベント:8ページ目
tc32-18.png

 出現条件:スイッチ採取用02
        セルフスイッチB
 プライオリティ:キャラと同じ
 トリガー:自動実行

≪実行内容≫
変数の操作:#0039 【採取】カウント数 -= 1
セルフスイッチの操作:B = OFF
条件分岐:セルフスイッチ DがON
セルフスイッチの操作:A = OFF
セルフスイッチの操作:D = OFF

分岐終了
ウェイト:2フレーム


このページは、採集イベントの2・4・6ページ目に対応したページです。

採集成功処理が行われた場合には、フラグを削除して1ページ目(採集不可状態)へ、採集処理が行われていない場合には2ページ目(採集可能状態)に戻します。


全ての採集イベントが、これらのどちらかの処理を行います。

結果としては、採集が行われたイベントだけが1ページ目へ変更され、それ以外のイベントは元の状態に戻されます。よって、見かけ上は何の変化も起きていないように見えるというわけです。


さて、全ての採集イベントが無事終了処理を行ったら、最後にコモンイベントも終了処理を行います。

次が、最後に行われる処理となります。


コモンイベント:終了処理02
tc32-19.png

 トリガー:自動実行
 スイッチ:採取用02

≪実行内容≫
条件分岐:【採取】カウント数 = 0
スイッチの操作:#0082 採取用02 = OFF

分岐終了
ウェイト:2フレーム


内容としては、全ての採集イベントが終了処理を行った場合に、自分のスイッチをOFFにしてクローズします。これだけ。



以上で、全てのイベントが元に戻されて、最終的には採集が1か所だけ行われる、もしくは、何も起こらないという形で終了します。

ちなみに、私のゲームはプラグインの影響のためか、自動実行中でメッセージを出したときに何故かキャラを動かすことが出来るため、そのバグを封じるためにウエイト2フレームをすべてに入れています。多分、普通はいらない処理ですので、外してもいいかもしれません。でも、なぜウエイトを入れるとバグが治るかは分かっていません(笑)



さて、これで解説は終わりです。

プレイヤーとしては、アイテムやスキルを使っただけなのに、内部ではこんな複雑な処理が行われていたんですね。


作るの大変でした(笑)


しかし、これらのイベントは1回作ってしまえば、あとは楽ちん。

採集ポイントはマップを超えていくつでもコピペとリージョン配置で量産でき、コモンイベントの内容もいじる必要がありません。なんて画期的!




最後になりますが、参考までに制作中のRPG『ALQMEST』において、今回のシステムの起点となるスキルをご紹介します。

tc32-20.png

使用効果のところに、コモンイベント:カウント処理を入れるだけでOKです。あとは、メニュー画面以外では用途がないので、対象なし、使用可能時をメニュー画面にしているだけですね。




このシステムを導入して、皆さんも心置きなく採集を楽しみましょう!

てかこれ、ほんとにRPGなんでしょうか(笑)




ではでは、今日はこの辺で。
ネコタでした。





↓お役に立ちましたら、クリックをお願いします↓
にほんブログ村 ゲームブログへ
にほんブログ村

にほんブログ村 ゲームブログ ゲーム制作へ
にほんブログ村

ブログランキング・にほんブログ村へ
にほんブログ村
スポンサーサイト

コメント

Secret

No title

こんにちわ。

なるほど、採掘システムですね。
農夫だけでなく、
炭鉱夫にもなれるとは…。
あとは釣り出来たら完成ですなw

ちなみに私はダンジョン内宝箱は総取り派なので、
アイテム系は取りこぼしを許さない系のやり込み型プレイヤーなんですけど、
早くストーリーを進めたいから採集や畑系その他本筋ストーリー以外のサイドシステムを全スルー派のストーリーのみやりたい型プレイヤーがいたとして、その人がプレイした場合こういったシステムをスルーしてクリアは可能なんでしょうか。

Re: No title

こんにちは。いつもありがとうございます。

> 早くストーリーを進めたいから採集や畑系その他本筋ストーリー以外のサイドシステムを全スルー派のストーリーのみやりたい型プレイヤーがいたとして、その人がプレイした場合こういったシステムをスルーしてクリアは可能なんでしょうか。

主な金策が採集と小売業なので、おそらく不可能に近いと思います。アイテムについては材料や製品をいちいち買っていたら、お金がいくらあっても足りません。ただ、畑システムは使わなくてもいけると思います。

しかし、採集システムについては、わざわざ取りに行くというより、通行箇所にひたすら点在しているだけなので、進むついでに採って行けるような配慮はしていくつもりです。

意地でも全スルー派には、過酷なプレイ環境となるかもしれません(笑)
プロフィール

猫民のんたん

Author:猫民のんたん

ネコタ:ゲーム作りが趣味の薬剤師。本職とゲーム作りの2足の草鞋を履きこなそうと日々奮闘。

毎週曜日と曜日or曜日に更新予定。


ミノン:ゲーム作り初心者で1児の母。前職はSE/PG。子育てをしながらゲーム作りを行おうと、日々奮闘中。

毎週曜日にブログ更新予定♪

最新記事
最新コメント
月別アーカイブ
カテゴリ
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。