【解決済み】EvalでのIF文作成について

Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

【解決済み】EvalでのIF文作成について

投稿記事by Arkroyal » 2021年2月22日(月) 13:03

皆様、こんにちは。今度は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の場合も入れてみたんですが、結果は同じでした。

私は何を間違っているんでしょうか…?
最後に編集したユーザー Arkroyal on 2021年2月22日(月) 14:46 [ 編集 1 回目 ]

アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: EvalでのIF文作成について

投稿記事by ムノクラ » 2021年2月22日(月) 14:01

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();


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();
    }
};
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

Re: EvalでのIF文作成について

投稿記事by Arkroyal » 2021年2月22日(月) 14:21

ムノクラ さんが書きました:
答えになっているか分かりませんが、実験結果をお知らせします。

サンプルプロジェクトにプラグインのヘルプどおりにコモンイベントを作成したところ、向き判定までスクリプトコマンドで実行しているっぽいですね。

コード: 全て選択

$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を使えばいいんですけど、クールタイムはどう作ればいいんでしょうか?

無制限に使わせたらプレイヤーがマップを作りながら進めるなどの意図せぬバグ性の高いプレイになるのが心配です。

(自動生成されたダンジョンなので、回避したらダメなイベントなどはありません。あくまでバグを事前に防止するためです。)
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: EvalでのIF文作成について

投稿記事by ムノクラ » 2021年2月22日(月) 14:22

Arkroyal さんが書きました:ご確認ありがとうございます。notGroundToPassの中で判定していますね。

私も最初はスクリプト自体をいじることを考えたんですけど、この場合クールタイムをどう作ったらいいのかわからなくなってこうして回りくどい方法を選んでしましました…。

SEの再生はAudioManager.playSeを使えばいいんですけど、クールタイムはどう作ればいいんでしょうか?

無制限に使わせたらプレイヤーがマップを作りながら進めるなどの意図せぬバグ性の高いプレイになるのが心配です。

(自動生成されたダンジョンなので、回避したらダメなイベントなどはありません。あくまでバグを事前に防止するためです。)


下記を参考にして作ってみました。
viewtopic.php?t=2470

[code]
◆変数の操作:#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
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: EvalでのIF文作成について

投稿記事by ムノクラ » 2021年2月22日(月) 14:28

クールタイム自体はウェイトだと面白くないかもしれませんので、
・クールタイムカウント用の並列処理イベントを作る。(コモンイベントでスイッチで制御が良いかと)
・クールタイム開始時に指定のスイッチをONにする
・並列処理内で、変数を加算していき、一定数に達したらスイッチをOFFにする。
・ツルハシは同一スイッチがOFFの時しか使えない条件分岐を入れる。

こんな感じでどうでしょう?

全てJavaScriptで書きたいということでしたら、下記のようになると思いますが、クールタイムも考慮すると、イベントで組んだほうが使いやすいと思います。

コード: 全て選択

if ($gameMap.isPassable($gameVariables.value(11), $gameVariables.value(12), $gameVariables.value(13))) {
  //通行可能な処理

} else {
  //通行不可能な処理
  $gameMap.pickel();
}
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
Arkroyal
記事: 80
登録日時: 2021年1月06日(水) 10:41

Re: EvalでのIF文作成について

投稿記事by Arkroyal » 2021年2月22日(月) 14:41

ムノクラ さんが書きました:
下記を参考にして作ってみました。
viewtopic.php?t=2470

[code]
◆変数の操作:#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






なるほど!

falseの場合を作る代わりにtrueの時に何も起こらないようにして、それ以外の時にツルハシの発動+クールタイム という方法…。

自分が作りたいことだけを見ていた結果ですね…。こんなに呆気ないとは。

これからは回りくどくfalseの場合を条件にするより、trueの場合をまず作ってfalseはそれ以外の時として実行されるように作ります。

教えていただき、誠にありがとうございます!スイッチなどを利用したウェイトの実現は課題として一人で勉強してみます…!
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: EvalでのIF文作成について

投稿記事by ムノクラ » 2021年2月22日(月) 14:45

実験で作ってしまったので、気が向いたら参考にしてください。

コード: 全て選択

◆条件分岐: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フォルダに入れて、コモンイベントを見てください。
CommonEvents.zip
(621 バイト) ダウンロード数: 0 回
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。

“MV:質問” へ戻る