ページ 1 / 1
【解決済み】EvalでのIF文作成について
Posted: 2021年2月22日(月) 13:03
by Arkroyal
皆様、こんにちは。今度はEvalでのIF文作成の質問であり、San_MapGeneratorでのツルハシ機能に関する質問になります。
現在私が作ろうとするのは以下となります。
1.Vキーを押したときにコモンイベントを実行
2.プレイヤーの位置情報を変数で取得(Xは1981番、Yは1982番)
3.条件分岐を使い、プレイヤーの向き方向を条件にIsPassableの判断方向を変化(上向きなら8、下向きなら2など)
4.通れない、つまりisPassableの結果がfalseならツルハシコマンドを実行、ウェイトを入れて再実行までのクールタイムを作る
5.通れる場合、何も起こらない。(ウェイトがないのでクールタイムも発生しない)
ここで問題なのが4の部分なんですが、
if ($gameMap.isPassable($gameVariables.value(1981),$gameVariables.value(1982),8) === false) {
$gameMap.pickel();
}
と書いたんですけど、プレイヤーの上が通れる状態でVキーを押しても「通れない場合」が実行され、効果音とともにクールタイムが発生します。
EvalではTrueの場合も指定する必要があるのかな?と思いelse ifで=== trueの場合も入れてみたんですが、結果は同じでした。
私は何を間違っているんでしょうか…?
Re: EvalでのIF文作成について
Posted: 2021年2月22日(月) 14:01
by ムノクラ
Arkroyal さんが書きました:皆様、こんにちは。今度はEvalでのIF文作成の質問であり、San_MapGeneratorでのツルハシ機能に関する質問になります。
現在私が作ろうとするのは以下となります。
1.Vキーを押したときにコモンイベントを実行
2.プレイヤーの位置情報を変数で取得(Xは1981番、Yは1982番)
3.条件分岐を使い、プレイヤーの向き方向を条件にIsPassableの判断方向を変化(上向きなら8、下向きなら2など)
4.通れない、つまりisPassableの結果がfalseならツルハシコマンドを実行、ウェイトを入れて再実行までのクールタイムを作る
5.通れる場合、何も起こらない。(ウェイトがないのでクールタイムも発生しない)
ここで問題なのが4の部分なんですが、
if ($gameMap.isPassable($gameVariables.value(1981),$gameVariables.value(1982),8) === false) {
$gameMap.pickel();
}
と書いたんですけど、プレイヤーの上が通れる状態でVキーを押しても「通れない場合」が実行され、効果音とともにクールタイムが発生します。
EvalではTrueの場合も指定する必要があるのかな?と思いelse ifで=== trueの場合も入れてみたんですが、結果は同じでした。
私は何を間違っているんでしょうか…?
答えになっているか分かりませんが、実験結果をお知らせします。
サンプルプロジェクトにプラグインのヘルプどおりにコモンイベントを作成したところ、向き判定までスクリプトコマンドで実行しているっぽいですね。
コード: 全て選択
$gameMap.pickel();
コード: 全て選択
// ツルハシ(プレイヤーの前方1タイルを通路タイルに変換)
Game_MapGenerator.prototype.pickel = function() {
this.notGroundToPass(
$gameMap.xWithDirection($gamePlayer.x, $gamePlayer.direction()),
$gameMap.yWithDirection($gamePlayer.y, $gamePlayer.direction())
);
this.refreshWallAndRoof();
this.makeData();
if (Imported.SAN_AnalogMove) {
Game_CollideMap.setup();
}
};
Re: EvalでのIF文作成について
Posted: 2021年2月22日(月) 14:21
by Arkroyal
ムノクラ さんが書きました:
答えになっているか分かりませんが、実験結果をお知らせします。
サンプルプロジェクトにプラグインのヘルプどおりにコモンイベントを作成したところ、向き判定までスクリプトコマンドで実行しているっぽいですね。
コード: 全て選択
$gameMap.pickel();
SS01.png
SS02.png
コード: 全て選択
// ツルハシ(プレイヤーの前方1タイルを通路タイルに変換)
Game_MapGenerator.prototype.pickel = function() {
this.notGroundToPass(
$gameMap.xWithDirection($gamePlayer.x, $gamePlayer.direction()),
$gameMap.yWithDirection($gamePlayer.y, $gamePlayer.direction())
);
this.refreshWallAndRoof();
this.makeData();
if (Imported.SAN_AnalogMove) {
Game_CollideMap.setup();
}
};
ご確認ありがとうございます。notGroundToPassの中で判定していますね。
私も最初はスクリプト自体をいじることを考えたんですけど、この場合クールタイムをどう作ったらいいのかわからなくなってこうして回りくどい方法を選んでしましました…。
SEの再生はAudioManager.playSeを使えばいいんですけど、クールタイムはどう作ればいいんでしょうか?
無制限に使わせたらプレイヤーがマップを作りながら進めるなどの意図せぬバグ性の高いプレイになるのが心配です。
(自動生成されたダンジョンなので、回避したらダメなイベントなどはありません。あくまでバグを事前に防止するためです。)
Re: EvalでのIF文作成について
Posted: 2021年2月22日(月) 14:22
by ムノクラ
Arkroyal さんが書きました:
ご確認ありがとうございます。notGroundToPassの中で判定していますね。
私も最初はスクリプト自体をいじることを考えたんですけど、この場合クールタイムをどう作ったらいいのかわからなくなってこうして回りくどい方法を選んでしましました…。
SEの再生はAudioManager.playSeを使えばいいんですけど、クールタイムはどう作ればいいんでしょうか?
無制限に使わせたらプレイヤーがマップを作りながら進めるなどの意図せぬバグ性の高いプレイになるのが心配です。
(自動生成されたダンジョンなので、回避したらダメなイベントなどはありません。あくまでバグを事前に防止するためです。)
下記を参考にして作ってみました。
viewtopic.php?t=2470
コード: 全て選択
◆変数の操作:#0011 X = プレイヤーのマップX
◆変数の操作:#0012 Y = プレイヤーのマップY
◆変数の操作:#0013 D = プレイヤーの向き
◆条件分岐:スクリプト:$gameMap.isPassable($gameVariables.value(11), $gameVariables.value(12), $gameVariables.value(13))
◆文章:なし, ウィンドウ, 下
: :クールタイム
◆ウェイト:60フレーム
◆
:それ以外のとき
◆スクリプト:$gameMap.pickel();
◆
:分岐終了
[code]
$gameMap.isPassable は調べた先が通行可能だとtrueを返すようです。
スクリプトでウェイトは
this.wait(ウェイトする時間)
http://rpgmaker-script-wiki.xyz/wait_mv.php
Re: EvalでのIF文作成について
Posted: 2021年2月22日(月) 14:28
by ムノクラ
クールタイム自体はウェイトだと面白くないかもしれませんので、
・クールタイムカウント用の並列処理イベントを作る。(コモンイベントでスイッチで制御が良いかと)
・クールタイム開始時に指定のスイッチをONにする
・並列処理内で、変数を加算していき、一定数に達したらスイッチをOFFにする。
・ツルハシは同一スイッチがOFFの時しか使えない条件分岐を入れる。
こんな感じでどうでしょう?
全てJavaScriptで書きたいということでしたら、下記のようになると思いますが、クールタイムも考慮すると、イベントで組んだほうが使いやすいと思います。
コード: 全て選択
if ($gameMap.isPassable($gameVariables.value(11), $gameVariables.value(12), $gameVariables.value(13))) {
//通行可能な処理
} else {
//通行不可能な処理
$gameMap.pickel();
}
Re: EvalでのIF文作成について
Posted: 2021年2月22日(月) 14:41
by Arkroyal
ムノクラ さんが書きました:
下記を参考にして作ってみました。
viewtopic.php?t=2470
コード: 全て選択
◆変数の操作:#0011 X = プレイヤーのマップX
◆変数の操作:#0012 Y = プレイヤーのマップY
◆変数の操作:#0013 D = プレイヤーの向き
◆条件分岐:スクリプト:$gameMap.isPassable($gameVariables.value(11), $gameVariables.value(12), $gameVariables.value(13))
◆文章:なし, ウィンドウ, 下
: :クールタイム
◆ウェイト:60フレーム
◆
:それ以外のとき
◆スクリプト:$gameMap.pickel();
◆
:分岐終了
[code]
$gameMap.isPassable は調べた先が通行可能だとtrueを返すようです。
スクリプトでウェイトは
this.wait(ウェイトする時間)
http://rpgmaker-script-wiki.xyz/wait_mv.php[/quote]
なるほど!
falseの場合を作る代わりにtrueの時に何も起こらないようにして、それ以外の時にツルハシの発動+クールタイム という方法…。
自分が作りたいことだけを見ていた結果ですね…。こんなに呆気ないとは。
これからは回りくどくfalseの場合を条件にするより、trueの場合をまず作ってfalseはそれ以外の時として実行されるように作ります。
教えていただき、誠にありがとうございます!スイッチなどを利用したウェイトの実現は課題として一人で勉強してみます…!
Re: EvalでのIF文作成について
Posted: 2021年2月22日(月) 14:45
by ムノクラ
実験で作ってしまったので、気が向いたら参考にしてください。
コード: 全て選択
◆条件分岐:S1がOFF
◆変数の操作:#0011 X = プレイヤーのマップX
◆変数の操作:#0012 Y = プレイヤーのマップY
◆変数の操作:#0013 D = プレイヤーの向き
◆条件分岐:スクリプト:$gameMap.isPassable($gameVariables.value(11), $gameVariables.value(12), $gameVariables.value(13))
◆変数の操作:#0010 V10 = 0
◆スイッチの操作:#0001 S1 = ON
◆
:それ以外のとき
◆スクリプト:$gameMap.pickel();
◆
:分岐終了
◆
:それ以外のとき
◆文章:なし, ウィンドウ, 下
: :クールタイム中!
◆
:分岐終了
コード: 全て選択
◆変数の操作:#0010 V10 += 1
◆条件分岐:V10 ≥ 1800
◆変数の操作:#0010 V10 = 0
◆スイッチの操作:#0001 S1 = OFF
◆
:分岐終了
サンプルのデータつけておきます。
新規プロジェクトのdataフォルダに入れて、コモンイベントを見てください。