接触するとマップ上のランダムな位置に飛ばされるイベントについて

返信する
ネクロノ蜜柑

接触するとマップ上のランダムな位置に飛ばされるイベントについて

投稿記事 by ネクロノ蜜柑 »

こんばんわ。いつもお世話になっております。

件名通りなのですが、接触するとマップ上のランダムな位置に飛ばされるイベントの作成方法を探しております。地形タグやリージョン等で飛ばされる配置位置をある程度調節出来ればとな思ったりしてますが、良い方法をご助言いただければ、助かります。よろしくお願いいたします。
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: 接触するとマップ上のランダムな位置に飛ばされるイベントについて

投稿記事 by 名無し蛙 »

どうもこんにちは。
愚直ですけどマップ高*マップ幅の全てのマスが有効か検索して候補マスの中からランダムチョイスが無難ですね。
イベントコマンド>スクリプトで以下のコードを書けばランダムワープすると思います。

コード: 全て選択

const width = $gameMap.width();
const height = $gameMap.height();
const candidates = []
for ( let x =  0; x < width; x++ ) {
    for ( let y = 0; y < height; y++ ) {
        if ( ※ ) candidates.push([x, y]);
    }
}
if (candidates.length) {
    const pos = candidates[Math.floor(Math.random() * candidates.length)];
    $gamePlayer.locate(pos[0], pos[1]);
}
※を書いたif文の部分は
「( $gameMap.regionId(x, y) === リージョンID )」で指定のリージョンに限定、
「( $gameMap.terrainTag (x, y) === 地形タグ )」で指定の地形に限定出来ます。
スクリプト枠は12行しか書けないのでコメント文を削りましたが内容に質問があれば答えます。
アバター
ムノクラ
記事: 2118
登録日時: 2018年2月23日(金) 11:41
連絡する:

Re: 接触するとマップ上のランダムな位置に飛ばされるイベントについて

投稿記事 by ムノクラ »

名無し蛙氏のコードの場合、移動先にイベントが存在しても判定しないので、そこを考慮したほうがよろしいかと思います。

参考(何もイベントがないと0を返すっぽいです)
http://rpgmaker-script-wiki.xyz/getposiinfo_mv.php

イベントコマンドでベタに作るとこうなると思いますが、処理順を工夫しても、最低でも変数を3つ使いますね。
乱数の最大値はマップの大きさに合わせて変えてください。

コード: 全て選択

◆ループ
  ◆変数の操作:#0001 X = 乱数 0..17
  ◆変数の操作:#0002 Y = 乱数 0..13
  ◆指定位置の情報取得:地形タグ, 地形タグ, ({X},{Y})
  ◆指定位置の情報取得:イベントID, イベントID, ({X},{Y})
  ◆条件分岐:地形タグ = 0
    ◆条件分岐:イベントID = 0
      ◆変数の操作:#0005 マップID = マップID
      ◆場所移動:{マップID} ({X},{Y})
      ◆ループの中断
      ◆
    :分岐終了
    ◆
  :分岐終了
  ◆
:以上繰り返し
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
名無し蛙
記事: 352
登録日時: 2015年11月23日(月) 02:46

Re: 接触するとマップ上のランダムな位置に飛ばされるイベントについて

投稿記事 by 名無し蛙 »

ムノクラ さんが書きました:名無し蛙氏のコードの場合、移動先にイベントが存在しても判定しないので、そこを考慮したほうがよろしいかと思います。

参考(何もイベントがないと0を返すっぽいです)
http://rpgmaker-script-wiki.xyz/getposiinfo_mv.php
ワープ候補に自律移動型のイベントが偶然侵入しても移動先の抽選に選ばれる、という事でしょうか?
確かにそうですね
重なっても絵的に間抜けになるかもしれませんが支障はないので重要視していませんでした

それとムノクラさんのアルゴリズム(方法論)ですが、自分も一考しましたがあまりオススメ出来ません…
まずリージョン・地形タグが何らかの理由で存在しない場合無限ループに陥る事。
それこそ候補地点に全てイベントが侵入して移動先候補が無くなってしまった場合等。
不慮の事態やヒューマンエラーはあって然るべきなのでフリーズに繋がる可能性は極力排するべきです。
また乱数によって最良計算時間では一発で正解を引き当てる反面、
最悪計算時間では永遠にループするので安定性に欠ける事も理由の一つです。

2021年現在の各ブラウザやNode.jsでは酷い乱数の偏りが発生するとは考えづらいですが
ループの終了条件を乱数に依存する方法は危なっかしいのであまり広まってほしくありません。
最低限、ループを数万回繰り返しても終わらないようならループ抜け、等の安全弁は付けた方が良いです。
ネクロノ蜜柑

Re: 接触するとマップ上のランダムな位置に飛ばされるイベントについて

投稿記事 by ネクロノ蜜柑 »

名無し蛙 さんが書きました:どうもこんにちは。
愚直ですけどマップ高*マップ幅の全てのマスが有効か検索して候補マスの中からランダムチョイスが無難ですね。
イベントコマンド>スクリプトで以下のコードを書けばランダムワープすると思います。

コード: 全て選択

const width = $gameMap.width();
const height = $gameMap.height();
const candidates = []
for ( let x =  0; x < width; x++ ) {
    for ( let y = 0; y < height; y++ ) {
        if ( ※ ) candidates.push([x, y]);
    }
}
if (candidates.length) {
    const pos = candidates[Math.floor(Math.random() * candidates.length)];
    $gamePlayer.locate(pos[0], pos[1]);
}
※を書いたif文の部分は
「( $gameMap.regionId(x, y) === リージョンID )」で指定のリージョンに限定、
「( $gameMap.terrainTag (x, y) === 地形タグ )」で指定の地形に限定出来ます。
スクリプト枠は12行しか書けないのでコメント文を削りましたが内容に質問があれば答えます。


名無し蛙様

ご返信ありがとうございます!名無し蛙様の記述通りにスクリプトをイベントコマンドをしたらランダムにマップ上を飛びました!ありがとうございます_(._.)_※部分はリージョンid2で試しましたが飛びました!感謝致します_(._.)_
添付ファイル
1.png
1.png (41.2 KiB) 閲覧された回数 2924 回
ネクロノ蜜柑

Re: 接触するとマップ上のランダムな位置に飛ばされるイベントについて

投稿記事 by ネクロノ蜜柑 »

ムノクラ さんが書きました:名無し蛙氏のコードの場合、移動先にイベントが存在しても判定しないので、そこを考慮したほうがよろしいかと思います。

参考(何もイベントがないと0を返すっぽいです)
http://rpgmaker-script-wiki.xyz/getposiinfo_mv.php

イベントコマンドでベタに作るとこうなると思いますが、処理順を工夫しても、最低でも変数を3つ使いますね。
乱数の最大値はマップの大きさに合わせて変えてください。

コード: 全て選択

◆ループ
  ◆変数の操作:#0001 X = 乱数 0..17
  ◆変数の操作:#0002 Y = 乱数 0..13
  ◆指定位置の情報取得:地形タグ, 地形タグ, ({X},{Y})
  ◆指定位置の情報取得:イベントID, イベントID, ({X},{Y})
  ◆条件分岐:地形タグ = 0
    ◆条件分岐:イベントID = 0
      ◆変数の操作:#0005 マップID = マップID
      ◆場所移動:{マップID} ({X},{Y})
      ◆ループの中断
      ◆
    :分岐終了
    ◆
  :分岐終了
  ◆
:以上繰り返し

ムノクラ様


いつもご返信ありがとうございます!ムノクラ様の方法でもマップ上でランダムに飛びました!感謝致します_(._.)_両方の手段でも飛びましたので状況に応じて使い分けようと思います!!この度も対応して頂きありがとうございました!助かりました。
返信する

“MV:質問”に戻る