【理想の動作】
「マップ上にランダムに散らばったアイテムを走り回って取得する。
取得できないまま時間が経つと順々に消えてしまう」
といった構成を目指しています。
パーティゲームでよくあるコインを集めるゲームのようなイメージです。
【現状】
①触れるとアイテムを取得できる=「プレイヤーからの接触」で消えるイベントがあります。
②トリアコンタン様の「EventReSpawn.js」を使いイベントをコピー、
マップ上のランダムな位置に、リアル時間経過で1つずつ生成される(増える)ようにします。
https://raw.githubusercontent.com/triac ... ReSpawn.js
そこまではいいのですが、生成したイベントを時間で消すことができない状態です。
マップ上のイベントすべてを一斉に消すことはできるのですが、
早くに生成されたイベントから順々に消えていくようにしたいです。
イベントは50個程度と考えています(未定)。
【試したこと】(読まなくても大丈夫です)
コピー元のイベントを並列処理にしてウェイトを入れる
⇒「プレイヤーからの接触」ではなくなるのでイベントのいい発火方法が分からない
そもそも並列処理のイベントをマップに50個など配置していいものか不安
お恥ずかしながらご助力いただきたいです。
よろしくお願いいたします。
【解決済み】EventReSpawn.jsでコピーしたイベントを時間で1つずつ消去したい
【解決済み】EventReSpawn.jsでコピーしたイベントを時間で1つずつ消去したい
最後に編集したユーザー cake [ 2024年11月04日(月) 19:14 ], 累計 1 回
Re: EventReSpawn.jsでコピーしたイベントを時間で1つずつ消去したい
あんまりテストしてないから、正しく動作するかはわからないけど・・・
例えば、以下のように組めば、できそう感するけど、出来なかったらごめんしてね。
かなり複雑な内容だけど頑張ってください・・・
なお
消えたら困るイベントは、一番最初に生成されるイベントIDより小さくすること。
(消すIDの計算が複雑になるけど、できなくはないだろうと思うけど)
並列処理とイベントコマンドのメッセージ表示は相性が悪いので使わないようにすること。
コピー元のイベントが1つしかない前提です。
しっかりとテストをしてから、導入を決定すること。
2~3回のテストでは問題を見つけられない可能性が高いです。
アイテムを取得済み等で存在しないイベントIDを飛ばして次のIDを消すように組んでますが
生成位置をランダムにせず、固定にするなどして、正しく動いているか確認してください。
ちなみに、並列処理を50個おいてもいいかという問題については
まあそれなりに重くはなるだろうと思います。
それもテストしてみて、体感するほど遅くなるかどうか判断するといいと思います。
基本的な考え方
並列処理で、イベントを生成して、基本IDは連番になっているという前提。
一定の時間が経過すると若い番号のイベントから順に消えていく。
消すIDを決定する処理は、別のイベントに分けてもいいと思うけどここでは一緒に入れてあります。
消すIDを計算します。(今回は、最小の数字から+1を続けるだけ)
算出したIDのイベントが存在するかどうかを調べます。
あれば、スイッチをONにして、なければ計算しなおします。
消すスイッチがONになったら、コピーされたイベントはすべて2ページ目を実行します。
自分のIDを調べて、消すIDと同じ番号なら、セルフスイッチをONにします。
消すIDのイベントだけが、3ページ目を実行します。
そのイベントだけが消去されます。
イベントの生成と、消去するイベントIDを決定するイベント(並列処理)
◆条件分岐:セルフスイッチ AがOFF
◆変数の操作:#0019 消すID = 2(2番目までのイベントは消さないので)
◆変数の操作:#0017 回数 = 1(三回生成したら、1個消すためのフラグ)
◆セルフスイッチの操作:A = ON
◆
:分岐終了
◆プラグインコマンド:EventReSpawn, 条件付きランダム生成
: :イベントID = 1
: :通行可能タイルのみ = true
: :画面に関する条件 = 0
: :キャラクターとの位置重複 = 3
: :地形タグ = []
: :リージョン = ["1"]
: :テンプレート生成 = false
: :生成アルゴリズム = 1
◆条件分岐:回数 = 4
◆ループ
◆変数の操作:#0019 消すID += 1
◆スクリプト:var event = $gameMap.event($gameVariables.value(19));
: :if(!!event){
: : //イベントは存在する
: :$gameSwitches.setValue(4,true);
: :}else{
: : //イベントは存在しない
: :
: :}
◆条件分岐:イベント消すがON
◆変数の操作:#0017 回数 = 0
◆ループの中断
◆
:分岐終了
◆
:以上繰り返し
◆
:分岐終了
◆変数の操作:#0017 回数 += 1
◆ウェイト:60フレーム
コピーされるイベントの1ページ目(接触で起動)
◆注釈:アイテム取得処理
: :イベントコマンドのメッセージ表示を使わない。
: :メッセージを表示するなら
: :文字列ピクチャー等のプラグインで
◆イベントの一時消去
コピーされるイベントの2ページ目(条件、#0004 イベント消す = ON、並列処理)
◆注釈:実行しているイベント自身のIDを習得するスクリプト
: :https://tm.yumineko.com/viewtopic.php?t=2080
◆変数の操作:#0018 このイベントのID = this._eventId
◆条件分岐:このイベントのID = 消すID
◆セルフスイッチの操作:A = ON
◆
:分岐終了
コピーされるイベントの3ページ目(条件、セルフスイッチA = ON、並列処理)
◆スイッチの操作:#0004 イベント消す = OFF
◆変数の操作:#0019 消すID = 2
◆イベントの一時消去
例えば、以下のように組めば、できそう感するけど、出来なかったらごめんしてね。
かなり複雑な内容だけど頑張ってください・・・
なお
消えたら困るイベントは、一番最初に生成されるイベントIDより小さくすること。
(消すIDの計算が複雑になるけど、できなくはないだろうと思うけど)
並列処理とイベントコマンドのメッセージ表示は相性が悪いので使わないようにすること。
コピー元のイベントが1つしかない前提です。
しっかりとテストをしてから、導入を決定すること。
2~3回のテストでは問題を見つけられない可能性が高いです。
アイテムを取得済み等で存在しないイベントIDを飛ばして次のIDを消すように組んでますが
生成位置をランダムにせず、固定にするなどして、正しく動いているか確認してください。
ちなみに、並列処理を50個おいてもいいかという問題については
まあそれなりに重くはなるだろうと思います。
それもテストしてみて、体感するほど遅くなるかどうか判断するといいと思います。
基本的な考え方
並列処理で、イベントを生成して、基本IDは連番になっているという前提。
一定の時間が経過すると若い番号のイベントから順に消えていく。
消すIDを決定する処理は、別のイベントに分けてもいいと思うけどここでは一緒に入れてあります。
消すIDを計算します。(今回は、最小の数字から+1を続けるだけ)
算出したIDのイベントが存在するかどうかを調べます。
あれば、スイッチをONにして、なければ計算しなおします。
消すスイッチがONになったら、コピーされたイベントはすべて2ページ目を実行します。
自分のIDを調べて、消すIDと同じ番号なら、セルフスイッチをONにします。
消すIDのイベントだけが、3ページ目を実行します。
そのイベントだけが消去されます。
イベントの生成と、消去するイベントIDを決定するイベント(並列処理)
◆条件分岐:セルフスイッチ AがOFF
◆変数の操作:#0019 消すID = 2(2番目までのイベントは消さないので)
◆変数の操作:#0017 回数 = 1(三回生成したら、1個消すためのフラグ)
◆セルフスイッチの操作:A = ON
◆
:分岐終了
◆プラグインコマンド:EventReSpawn, 条件付きランダム生成
: :イベントID = 1
: :通行可能タイルのみ = true
: :画面に関する条件 = 0
: :キャラクターとの位置重複 = 3
: :地形タグ = []
: :リージョン = ["1"]
: :テンプレート生成 = false
: :生成アルゴリズム = 1
◆条件分岐:回数 = 4
◆ループ
◆変数の操作:#0019 消すID += 1
◆スクリプト:var event = $gameMap.event($gameVariables.value(19));
: :if(!!event){
: : //イベントは存在する
: :$gameSwitches.setValue(4,true);
: :}else{
: : //イベントは存在しない
: :
: :}
◆条件分岐:イベント消すがON
◆変数の操作:#0017 回数 = 0
◆ループの中断
◆
:分岐終了
◆
:以上繰り返し
◆
:分岐終了
◆変数の操作:#0017 回数 += 1
◆ウェイト:60フレーム
コピーされるイベントの1ページ目(接触で起動)
◆注釈:アイテム取得処理
: :イベントコマンドのメッセージ表示を使わない。
: :メッセージを表示するなら
: :文字列ピクチャー等のプラグインで
◆イベントの一時消去
コピーされるイベントの2ページ目(条件、#0004 イベント消す = ON、並列処理)
◆注釈:実行しているイベント自身のIDを習得するスクリプト
: :https://tm.yumineko.com/viewtopic.php?t=2080
◆変数の操作:#0018 このイベントのID = this._eventId
◆条件分岐:このイベントのID = 消すID
◆セルフスイッチの操作:A = ON
◆
:分岐終了
コピーされるイベントの3ページ目(条件、セルフスイッチA = ON、並列処理)
◆スイッチの操作:#0004 イベント消す = OFF
◆変数の操作:#0019 消すID = 2
◆イベントの一時消去
Re: EventReSpawn.jsでコピーしたイベントを時間で1つずつ消去したい
ゆわか 様
貴重なお時間を割いてここまでの内容を考えてくださり、本当にありがとうございます。
教えていただいた内容で無事に動作いたしました!
ひとまず教えていただいたそのまま、ツクールの初期マップいっぱい程度を範囲として、特に重くはならなかったです。
まだほとんどテスト・調整はできていないのでこれからですが、おそらく希望していた通りの形で制作できると思われます!
当スレッドは【解決済み】とさせていただきます。
改めまして、ありがとうございました。
貴重なお時間を割いてここまでの内容を考えてくださり、本当にありがとうございます。
教えていただいた内容で無事に動作いたしました!
ひとまず教えていただいたそのまま、ツクールの初期マップいっぱい程度を範囲として、特に重くはならなかったです。
まだほとんどテスト・調整はできていないのでこれからですが、おそらく希望していた通りの形で制作できると思われます!
当スレッドは【解決済み】とさせていただきます。
改めまして、ありがとうございました。