投稿記事

[進捗]天候的なパーティクルの表示とか

進捗

ダイスプラグインのサンプルコモンイベントの注釈を整備してました。

まだ、コモン50超のすごろくの注釈が残ってまして、果てしない・・・

めませかに移植

めませかにPixiV5とかパーティクルエディタとかもろもろを移植

動画で見て分かるか微妙ですが、天候エフェクトみたいに画面全体でパーティクルが発生しつつ、個々のパーティクルはスクロール移動についていくような設定を追加しました。


今日は朝にスクリプト講座のまとめリンクの整備などしてたので、
代わりに講座は割愛です!それではまた!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

スクリプト講座その5 〜else文と複雑な条件式〜

去年すぐに頓挫してしまいましたスクリプト講座のボツ下書きが残ってたので
破棄するのももったいない気がするので公開しておきます。(その2)

現在、日記のおまけにつけている講座内容が難しく感じる場合は、
第1回の記事から順に読んでもらえると多少分かるようになるかもです!


また、講座一覧のページもまとめてみましたので貼っておきます。
* RPGツクールMV講座まとめ【スクリプト他】



こんにちは、シロップです!

前回はif文の使い方が途中で終わっていましましたね!

今回は、いくつもの条件が重なった複雑な条件分岐をする方法を解説していきます!


前回はif文を使って条件に当てはまる場合の処理を実行する方法を教えました

if(条件式){
	//条件式が真<true>であるときの処理
}

else文

では、ツクールの条件分岐のように、条件式を満たさない時の処理も書くにはどうすればよいでしょうか?

答えは↓こうです!!

if($gameParty.gold() >= 100){
	//100ゴールド以上持っている場合の処理
}else{
	//それ以外の場合(100ゴールド未満の場合の処理
}

"それ以外"を意味する「else文」を使います!

if文の終わりの中括弧「}」のあとに、else{ //それ以外の場合の処理 }と分岐させることができます。


if else文

さらに、このelse文ですが、それ以外の場合からさらに条件を絞る「else if」という使い方ができます!

if($gameParty.gold() >= 100){
	//100ゴールド以上持っている場合の処理
}else if($gameParty.gold() >= 50){
	//1つ目のif文の条件を満たさず(ゴールド100未満)、かつ50ゴールド以上の場合
}else if($gameParty.gold() >= 20){
	//上の条件式をすべて満たさず(100未満かつ50未満)、かつゴールド20以上の場合
}else{
	//上の条件式をすべて満たさない場合の処理
}

ツクールの条件分岐で表すと

こんな感じで、それ以外の場合の中に入れ子状態になってしまいますね。
この入れ子の状態をネストと呼ぶのですが…


ネストが深くなると今書いている処理がどの条件を満たす場合なのか分かりづらくなってしまうため嫌われています!


入れ子状態は見やすい範囲で減らしていくと「バグや意図しない動作」を避けられます。

例えば「毒状態か猛毒状態で、かつ毒消し草を持っていない場合に毒消し草を貰える」という処理を表してみると…

var leader = $gameParty.leader(); //パーティー先頭のアクター
var item = $dataItems[毒消し草のID]); //毒消し草のアイテムデータ

//leaderが毒ステートIDのステート(State)に影響されて(Affected)いるかをチェック
if( leader.isStateAffected(毒ステートID) ){
	//パーティーがアイテム(item)を持って(has)いるかを問い合わせて、
    //「!」で否定反転して持っていない状態なら真<true>
	if(!$gameParty.hasItem(item)){
    	//アイテムを1つ取得(gain)
		$gameParty.gainItem(item,1);
    }

//leaderが猛毒ステート状態かチェックして、以下同じ内容
}else if( leader.isStateAffected(猛毒ステートID) ){
	if($gameParty.hasItem(item)){
		$gameParty.gainItem(item,1);
    }
}

ここまでに解説した方法だけではこのようにif文が2重になってしまい、さらに毒の場合と猛毒の場合をelse if文で分けて、そこから毒消し草を持っていなければ1つ取得するという同じ内容を2回書かなければなりません。

同じ処理を何回も書くのは、修正が大変になりバグの温床となるため避けるべきです!


論理演算子

そこで、複数の条件を1つにまとめあげる「論理演算子」というものを使います。
名前だけ聞くと何じゃそれは?…とおもうかもしれませんが、「AND」と「OR」と聞けば何となくわかると思います。

「A かつ B」を表すANDは、「&&」記号で表し、
「A または B」を表すORは、「||」記号で表します!


if (条件1 && 条件2){
	//条件1と条件2を両方満たす場合の処理
}
if (条件1 || 条件2){
	//条件1と条件2のどちらかを満たす場合の処理
}

また、論理演算子はいくつもつなげて使えます。
括弧「()」で括って判別順を精確に指定しましょう。

「AかBで、かつCを満たす場合」というのは
「(A || B) で、かつC」と、まず最初の条件2つを括弧でくくり、
「(A || B) && C」とCの条件と&&で繋ぎます。

「A || B && C」としてしまうと、後ろから順に処理されてしまい
「A || (B && C)」、つまり「Aまたは、BかつC」と違った条件になってしまいます。


括弧()で括って、判別順を精確に!!


さぁ、先の毒消し草取得のスクリプトを書き換えてみましょう

var leader = $gameParty.leader(); //パーティー先頭のアクター
var item = $dataItems[毒消し草のID]); //毒消し草のアイテムデータ

//leaderが毒ステートIDのステート(State)に影響されて(Affected)いるかをチェック
if((leader.isStateAffected(毒ステートID) || leader.isStateAffected(猛毒ステートID)) && !$gameParty.hasItem(item)){
	//アイテムを1つ取得(gain)
	$gameParty.gainItem(item,1);
}

ずいぶんとすっきりしました!!
アイテムの所得処理$gameParty.gainItem(item,1)を1回にまとめられたのは大きいでス!

……けど、これはこれで見づらいですね。

また、毒ステートか猛毒ステートかの判断を括弧で括っていますが、括弧が多くて分かりづらくなってます。

ネスト(入れ子)をへらすというのはあくまで見やすくするためですので、それでif文の条件式が見づらくなったら元も子もありません!

見やすい範囲で整理しましょう!

//leaderが毒ステートIDのステート(State)に影響されて(Affected)いるかをチェック
if(leader.isStateAffected(毒ステートID) || leader.isStateAffected(猛毒ステートID){
	if(!$gameParty.hasItem(item)){
		//アイテムを1つ取得(gain)
		$gameParty.gainItem(item,1);
    }
}

また、条件式ごとに真偽値を変数にしまっておくこともできます。

var stateCondition = (leader.isStateAffected(毒ステートID) || leader.isStateAffected(猛毒ステートID);

//leaderが毒ステートIDのステート(State)に影響されて(Affected)いるかをチェック
if(stateCondition && !$gameParty.hasItem(item)){
	//アイテムを1つ取得(gain)
	$gameParty.gainItem(item,1);
}

事前に変数stateCondition(訳:"ステート条件")を用意して毒か猛毒の状態であるかを代入しておき、if文の中でアイテムの所持条件と&&(AND)でつなげて判別しています。

これだと入れ子が無くて、なおかつ読みやすくなったのではないでしょうか?

ネストの仕方や条件の書き方は人によって流儀があるので、各自で見やすい書き方を試してみてください!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

スクリプト講座その4 〜真偽値<true/false>とif文〜

去年すぐに頓挫してしまいましたスクリプト講座のボツ下書きが残ってたので
破棄するのももったいない気がするので公開しておきます。

現在、日記のおまけにつけている講座内容が難しく感じる場合は、
第1回の記事から順に読んでもらえると多少分かるようになるかもです!


また、講座一覧のページもまとめてみましたので貼っておきます。
* RPGツクールMV講座まとめ【スクリプト他】


第1回の記事

こんにちは、シロップです!

前回(第3回の記事は「変数の宣言/代入」のしかたと「文字列の扱い」について説明しましたね。

Javascriptや他の一般的なプログラミング言語には、数値や文字列以外にも便利なデータ型がいくつかあります。

今日はBoolean(真偽値)型if文について解説していきます!
*次回は配列について解説すると言った気もしますが、その日の気分で書きますのでご勘弁を!(~_~;)


さて、解説します!と力強く宣言はしたのですが…
実はBoolean型も条件分岐も第二回ですでに登場してるので、今回はすんなりと読み進められると思います!


第二回でダメージ計算式スクリプトとしてこんなの↓が出てきたのですが覚えてるでしょうか?

(b.isGuard() ? 0.1 : 1) * 2 * (a.atk * 4 - b.def * 2)

上の式は第1段階の翻訳として次のように訳しました。

(攻撃対象(b)は防御状態か(isGuard) ? 0.1 : 1) * 2 * 通常攻撃のダメージ


最初の部分の「(攻撃対象(b)は防御状態か(isGuard)?」のようにYESかNOで表されるデータ型」Boolean<真偽値>型と呼びます。
(※上の例は、正しくはisGuard()関数が戻り値としてBoolean型の値を返しています。)

そして、3項演算子(?と:のセット)によって条件式が正しい場合と正しくない場合によってダメージにかかる倍率を変化させていたのでしたね!

(攻撃対象(b)が防御状態(isGuard)であれば0.1 、そうでなければ1) * 2 * 通常攻撃のダメージ

今回、紹介するif文による条件式分岐は3項演算子よりも覚えやすく使い勝手も良いので、気構えずに読み進めてください!


Boolean型(真偽値)

さて、先程Boolean型は「YESかNOで表されるデータ型」と言いましたが、Javascriptではtrue<真>とfalse<偽> という2つの値(真偽値)を取ります。

  • true<真> : YES、ツクールのスイッチのONにあたる値
  • false<偽>:NO、ツクールのスイッチのOFFにあたる値

たとえば、ツクールのイベントコマンドのセーブ可能かどうかはイベントコマンドを通じて「$gameSystem(ゲームのシステム管理オブジェクト)」が所有する「_saveEnabled」という変数を操作しています。

// ゲームシステムに対してセーブ不可状態にさせる命令
Game_System.prototype.disableSave = function() {
    this._saveEnabled = false;
};

// ゲームシステムに対してセーブ可能状態にさせる命令
Game_System.prototype.enableSave = function() {
    this._saveEnabled = true;
};

prototypeやら見慣れない表記がたくさんあると思いますが、今は無視して大丈夫です。

Game_System(ゲームシステム管理クラスのオブジェクト)にとっての自身(this)が所有する変数_saveEnabledにたいしてtrue<真>やfalse<偽>の値を代入していることが分かればOKです。



※簡単に説明すると、Game_Systemという「ゲームシステムを扱う機能を集めたクラス」の鋳型(prototype)に対して、disableSave()やenableSave()という新しい関数機能を追加しているスクリプトです。

$gameSystemというのはGame_Systemというクラスの鋳型から作られた実際のオブジェクトです。クラスというのはそれ自体は実態のない設計図であり、その設計図に沿って作られたものがオブジェクト、という程度に覚えて置いてください。



実際にゲーム上でセーブコマンドを選ぼうとすると、この$gameSystemにたいしてセーブが可能かどうか問い合わせます。

Game_System.prototype.isSaveEnabled = function() {
    return this._saveEnabled;
};

$gameSystem.isSaveEnabled();のように問い合わせると、$gameSystemは自身が管理している「_saveEnabled」変数に格納されているtrueかfalseの真偽値をそのまま返答(return)しているのが分かると思います。


if文

trueかfalseかを保存する変数があるのであれば、当然、trueかfalseによって処理を分岐させるツクールでいう条件分岐機能を使いたいところですよね。

それを実現するのがif文という文法構文です。

if (条件式){
	//条件式が正しい(true)場合の処理内容
}

簡単ですね!
条件式というのは「trueかfalseで表される式」のことです。ついさっき覚えましたBooleanデータ型ももちろん使えます!

var saveEnabled = $gameSystem.isSaveEnabled();
if (saveEnabled){
	//セーブが可能なら実行する処理
}

$gameSystemにセーブが可能かどうか問い合わせて変数saveEnabledに返り値(trueかfalseの真偽値)を代入して、その値を条件式として使っています。

セーブ可能(true)なら中括弧「{ }」の中身の処理を実行します。

いちいち変数に代入しないで、そのまま関数の戻り値を条件式に使うこともできます。

if ($gameSystem.isSaveEnabled()){
	//セーブが可能なら実行する処理
}

ですが、条件式の中身が複雑になりそうなときは変数を使うと読みやすくなるのでおすすめです。(あとで例を出します)

真偽値をひっくり返す

上の例をみて、じゃあ「セーブが不可能な場合に行いたい処理はどうするんだ!」と思うかもしれません。後ほど説明する比較演算子を使ったりelse文を使ったりと方法はいろいろありますが、もっとも簡単なのは「!」 という否定演算子を使うことです。


真偽値の頭に「!」をつけるとtrueとfalseが入れ替わります!


if (!$gameSystem.isSaveEnabled()){
	//セーブが不可能なら実行する処理
}

条件式の中身の$gameSystem.isSaveEnabled()がtrueであれば条件式は!true つまり反転されてfalseとなります。

逆に、セーブ不可能(false)であれば「!」により反転してtrueとなって、条件式をクリアして「{}」の中身が実行されます。

簡単ですね!


比較演算子

さて、今までは真偽値(true/false)をそのまま代入するなりして使ってましたが、「ある値や式が等しいか」「等しくないか」「○○以上/以下か」といった判断をする条件式も作れます。

var gold = $gameParty.gold();
if (gold < 10){
	//所持金が10未満の場合の処理
}

条件式の中身は、左辺(gold)と右辺(10)を比較演算子(<)で比較して、正しければtrue、間違っていればfalse**を表します。

このように左右の項を比較して真偽値を返す演算子を「比較演算子」と呼びます。

真偽値が返されるので、例えば下のようにそのまま変数にBoolean値として代入することもできます。

var isMoneyShort = ($gameParty.gold() < 10);
if (isMoneyShort){
	//所持金が10未満の場合の処理
}

変数isMoneyShort(直訳:お金が不足しているか)に比較演算子<を使った条件式が真であればtrue、偽であればfalseが代入されます。

そして、その真偽値をif文の条件式に使ってるわけです!

比較演算子

「<」以外の比較演算子も見ていきましょう
=== : 左辺と右辺が等しければtrue
!==:左辺と右辺が等しくなければtrue
> :左辺が右辺よりも大きければtrue
>=:左辺が右辺以上であればtrue
* <=:左辺が右辺以下であればtrue

「===」が等号を表しますが、始めて見る方は「=」の数の多さにびっくりするかと思います……が、深く考えないでください!

こういうものなのです!!

(※実は「==」という=の数が違う比較演算子もある……のですが、もう少しJavascriptを理解してからもっと詳しくなりたければ是非ご自身で調べて見てください!! 今はこういうものだと思ってもらって大丈夫なのです!!)


次回予告

すごく中途半端なのですが、長くなってきたのでいったん区切ります!

今回は

  • Boolean型の値<true(真)/false(偽)>
  • if文の構文`if(条件式) { //処理内容 }
  • 比較演算子で左右の項を比較して条件式を作る
    の3本立てでお送りしました!

次回は、複数の条件をつなぎ合わせる論理演算子else文について解説予定です!


おまけ

if文を活用してツクールでなにか……と考えたのですが、スクリプトでif文を使っても実行したい内容をスクリプトで書けないとあまり意味が無いのですよね…。

そこで、今回は「ツクールの条件分岐コマンド」で役立つスクリプトを紹介します。

条件分岐コマンドのスクリプトはif文の条件式を入れる小括弧()の中を書くものだと考えると分かりやすいと思います!

「スクリプトじゃないと書けない処理」や、「変数を通さないと書けない面倒な処理」もばんばんスクリプトで分岐できちゃいますよ!(ほんの少しだけ処理が遅くなりますけど、毎フレーム呼び出すような処理じゃなきゃ全然平気です!)

「スマホかPCか」で分岐!

Utils.isMobileDevice():スマホ利用ならtrue
スマホ(MobileDevice)であればtrueとなります。

「スマホ以外なら」という条件にしたかったら否定演算子「!」を使うのでしたね!
!Utils.isMobileDevice():スマホ以外ならtrue

Utilsクラス(Utilities・ユーティリティーズの略)にはゲームの動作環境などを調べる関数が豊富に用意されてます!

「テストプレイならば」

Utils.isOptionValid('test'):テストプレイ中であればtrue
デバッグ用にテストプレイでだけアイテムを取得させたりレベルを上げたい場合はこの条件式!
完成版にうっかりデバッグ用のイベントが残ってしまう…なんてこともなくなるはずです!

「タッチ/マウス操作」で分岐!

TouchInput.isTriggered():ちょうどタッチされた瞬間であればtrue
TouchInput.isPressed():タッチが押され続けていればtrue
TouchInput.isLongPressed():タッチが長く押され続けていればtrue
TouchInput.isRepeated():タッチが押され続けていれば一定間隔でtrue
TouchInput.isCancelled():マウスの右クリックか2本指タップでキャンセルされたときにtrue
TouchInput.isReleased():タッチがちょうど離されたときにtrue
TouchInput.isMoved():タッチされたまま動いたときにtrue

ちなみに、どこがタッチ/クリックされたかはTouchInput.xでx座標、TouchInput.yでy座標が取得出来ますよ!

「キーボード入力」で分岐!

Input.isTriggered(keyName):keyNameが押された瞬間であればtrue
keyNameはそれぞれのキーを表す文字列を使います。
'left':左キー
'right':右キー
'down':下キー
'up':上キー
'ok':決定(z、Enter、スペース)
'cancel':キャンセル(x、esc)
'shift':シフトキー
'pageup':ページアップ(Qキー)
* 'pagedown':ページダウン(Wキー)

だいたいこんなところでしょうか?
isTriggered以外の関数はこちら↓

Input.isPressed(keyName):keyNameが押され続けていればtrue
Input.isRepeated(keyName):keyNameが押され続けていれば一定間隔でtrue
Input.isLongPressed(keyName):keyNameが長く押され続けていればtrue

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

RPGツクールMV講座まとめ【スクリプト他】

ツクール講座(初心者向け〜)

ツクールの操作


スクリプト講座(中級者向け〜)

プログラミングの基本構文を網羅的に覚えるのにはあまり向いてないです。一通り構文を理解したけど、どのように使えばゲームづくりに活かせるのか分からないという方の参考になればと思います。

思いつきで記事を書いてるので、内容が途中で途切れることもありますが、基本的には前回までの記事の知識や内容を前提に進めてくと思いますので上から順に読んでいくことをおすすめします!


旧スクリプト講座(頓挫)


スクリプトで画像表示(Sprite/Bitmap)


この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

[講座]スプライトの表示範囲の指定

一言進捗

ここのところのPixiV5の移行テストやパーティクルシステムの作成は
ずっと空のプロジェクト上で行っていたのですが
現在制作中のダンジョン探索ゲームでも同様の実装を行いました。

エディタも動いて一安心👍

(昨日のツイートが多少反応あったので、いつか販売することも
見据えて左下に設定項目の説明みたいのも加えてみてます。)




いつか講座になるかもしれない何か

前回はスプライトの表示でアイコン画像の全体を表示させるとこまでやりましたね!


今回は前回に引き続き、アイコン画像の任意の部分だけを表示させてみようと思います!

フォロワー以上限定無料

無料プラン限定特典を受け取ることができます

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事を検索