Dear!くろうどぃあ!

このブログでは、私、くろうどの趣味に関する事を記述します。
当面は、「RPGツクールMV」をメインにします。

ソースコード解説「隣接時フキダシ表示プラグイン」

2022-07-23 21:45:33 | RPGツクールMZ
こんばんは。くろうどです。
今回は、「隣接時フキダシ表示プラグイン」を作ったので、そのソースコードの解説をしたいと思います。

 

今回の機能はマップイベント(Game_Event)を基準にプレイヤーの位置を取得して隣接しているか判断します。

ソースコードの上から順に見ていくと、まずは、Game_Event の refresh です。
これはプレイヤーから隣接してきた時の処理です。

const KRD_Game_Event_refresh = Game_Event.prototype.refresh;
Game_Event.prototype.refresh = function() {
	KRD_Game_Event_refresh.apply(this, arguments);
	this.doNeighborBalloon();
};

次に updateStop です。
これはマップイベントの移動でプレイヤーに隣接した時の処理です。
ここは、毎フレームかなんかのタイミング(よく知らない)で実行されるので注意が必要です。
const KRD_Game_Event_updateStop = Game_Event.prototype.updateStop;
Game_Event.prototype.updateStop = function() {
	KRD_Game_Event_updateStop.apply(this, arguments);
	this.doNeighborBalloon();
};

実際の処理は次からです。
マップイベントのメモ欄に書いたタグ(balloonId)を取得して、requestBalloon でフキダシを表示させます。
他の部分は、updateStop が繰り返し実行されるので、プレイヤーが移動してなければフキダシを表示させないようにしています。
あと、マップイベントが出現条件を満たしていない時はフキダシを表示させないようにしています。

Game_Event.prototype.doNeighborBalloon = function() {
	if (this._pageIndex < 0) {
		return;
	}

	const balloonId = Number(this.event().meta.balloonId);
	if (!isNaN(balloonId)) {
		this._oldPosition = this._oldPosition ? this._oldPosition : 0;
		const newPosition = this.neighborPlayer();
		if (this._oldPosition !== newPosition && newPosition > 0) {
			$gameTemp.requestBalloon(this, balloonId);
		}
		this._oldPosition = newPosition;
	}
};

次の処理はプレイヤーとマップイベントが隣接しているかのチェックです。
プレイヤーのX座標、Y座標とマップイベントのX座標、Y座標を比較しています。
プレイヤーは $gamePlayer で取得できますし、マップイベントは今回は Game_Event の中なので this で取得できます。
Game_Event.prototype.neighborPlayer = function() {
	if (this.x === $gamePlayer.x && this.y === $gamePlayer.y + 1) {
		// console.log("プレイヤーの下にイベントあるよ!");
		return 2;
	}
	if (this.x === $gamePlayer.x - 1 && this.y === $gamePlayer.y) {
		// console.log("プレイヤーの左にイベントあるよ!");
		return 4;
	}
	if (this.x === $gamePlayer.x + 1 && this.y === $gamePlayer.y) {
		// console.log("プレイヤーの右にイベントあるよ!");
		return 6;
	}
	if (this.x === $gamePlayer.x && this.y === $gamePlayer.y - 1) {
		// console.log("プレイヤーの上にイベントあるよ!");
		return 8;
	}
	return 0;
};

というわけで、「隣接時フキダシ表示プラグイン」はこれだけです。

このプラグインにどんどん機能追加していくと、「近づいた時にメッセージ表示するプラグイン」になるとは思いますが、うちは満足したのでココまでです。

それでは~。


ダメージポップアップ位置を真ん中にしてみた

2022-07-19 08:06:27 | RPGツクールMZ
さて皆さん。こんにちは。

今回は、RPGツクールMZでダメージポップアップ位置を修正したので、その方法を書いてみたいと思います。

修正すると以下の画像のように、真ん中辺りにダメージポップアップするようになります。

以下のソースコードをプラグインとして登録すればOKです。

Sprite_Battler.prototype.damageOffsetY = function() {
	return -Math.floor(this.height / 3);
};

何をやっているかと言うと……。

「Sprite_Battler」がバトル時のキャラクター画像です。
このキャラクター画像の高さ(height)を割る 3 した値をマイナスにしています。
(分かりにくいと思いますが、「Math.floor」の左側に「マイナス記号」が付いています)

そうすることで、キャラクター画像の下側からこの値が引かれて、だいたい真ん中辺りに表示されるようになっています。

値を変えると表示位置がズレていくのが分かると思います。

今回はこの辺で……。
それでは、また~。


くるくる回転

2022-07-15 02:39:02 | RPGツクールMZ
こんばんは。くろうどです。

まずはこのTweet内の動画を見てください。
最後の場面で、船がくるくる回転してると思います。
 

このくるくる回転は、
「移動ルートの設定」で、
「右に90度回転」を繰り返す設定にすれば簡単です。

回転速度は「ウェイト」で調整しましょう。

 

今回はこれだけでお仕舞いです。
それでは~。


多言語プラグイン&くろうどゲッターパターン

2022-07-13 03:09:31 | RPGツクールMZ
さて皆さん。
お久しぶりです。

今回は、久しぶりの投稿テストを兼ねて、私の「多言語プラグイン」の紹介を少しだけ。

このプラグインでは、オプション等から言語の切替ができるようになります。

↓ダウンロードはGitHub↓

GitHub - kuroudo119/RPGMZ-Plugin: RPGツクールMZ用プラグイン置き場。

RPGツクールMZ用プラグイン置き場。. Contribute to kuroudo119/RPGMZ-Plugin development by creating an account on GitHub.

GitHub


以下は、「くろうどゲッターパターン」と勝手に呼んでいる処理の記述方法です。
ゲッターを含むオブジェクトを戻り値にしています。
車輪の再発明なのかどうかは分かりませんが、この処理のおかげで、他のプラグインとの競合が減っているはずです。

Game_System.prototype.resetDatabase = function(database) { database.forEach(data => { if (data) { data.name_0 = data.name_0 ? data.name_0 : data.name; data.desc_0 = data.desc_0 ? data.desc_0 : data.description; Object.defineProperties(data, { name: { get: function() { return KRD_MULTILINGUAL.getData(data).name; }, configurable: true }, description: { get: function() { return KRD_MULTILINGUAL.getData(data).description; }, configurable: true } }); } }); };

KRD_MULTILINGUAL.getData = function(data) {
	return {
		get name() {
			return KRD_MULTILINGUAL.getReturnData(data, "name_", "name");
		},
		get nickname() {
			return KRD_MULTILINGUAL.getReturnData(data, "nickname_", "nickname");
		},
		get profile() {
			return KRD_MULTILINGUAL.getReturnData(data, "profile_", "profile_1st", "profile_2nd");
		},
		get description() {
			return KRD_MULTILINGUAL.getReturnData(data, "desc_", "desc_1st", "desc_2nd");
		},
		get message1() {
			return KRD_MULTILINGUAL.getReturnData(data, "message1_", "message1");
		},
		get message2() {
			return KRD_MULTILINGUAL.getReturnData(data, "message2_", "message2");
		},
		get message3() {
			return KRD_MULTILINGUAL.getReturnData(data, "message3_", "message3");
		},
		get message4() {
			return KRD_MULTILINGUAL.getReturnData(data, "message4_", "message4");
		},
		get iconIndex() {
			return data.iconIndex;
		},
		get id() {
			return data.id;
		}
	};
};

それでは今回はこの辺で。
ごきげんよう。

SUMOシステム

2020-03-07 13:44:53 | RPGツクールMV
Twitterの自分のTweetを引用。






フォントを変える方法(OSにインストールされている物を使う)

2020-01-01 20:10:36 | RPGツクールMV
↓RPGツクールMVのフォントについて、Tweetをしました。

RPGツクールMVはJavaScriptで記述され、ブラウザで動作します。
ブラウザはHTMLという物で書かれた内容を表示します。
HTMLの他に、レイアウトなどはCSSという物で記述します。

今回は、RPGツクールMVのプロジェクトデータ内にある、CSSファイルを書き換えました。



(↑)こんな感じで、「local」を追加する事で、OSにインストールされているフォントを使う事が出来ます。
ユーザー端末にそのフォントがインストールされている保証はないので、作者のこだわりフォントが必ず使えるわけではないですが、再配布しているわけではないのでフォントの利用規約を気にする必要はないと思います。たぶん。

「font-family」で名前を指定しているので、これを追加して、プラグインを用意すれば、ゲーム中でのフォント切替も可能です。
スイッチ1番を使って切り替える場合は(↓)こんな感じで。



今回は、Windowsにインストールされていた「Monsters Attack!」というフォントが面白そうだったので使ってみました。


(↓)こんなん驚くわ!!
(↓)スイッチ1番をONにして、フォント切替してみた。

今回は以上です。


強制移動プラグインを作りました。

2019-08-07 11:56:05 | RPGツクールMV
強制移動プラグインを作ったので、GitHubに置きました~。



RPGツクールMVで処理の流れを考えてみようの巻

2019-05-09 19:53:05 | RPGツクールMV
## はじめに

今回は、処理を作る時に考えておく事を簡単に説明します。
説明は、RPGツクールMVを使って行います。

## やりたい処理を考える

まず、やりたい処理を考えます。
今回は、戦闘に勝利した時に得られる経験値を「戦闘参加メンバーと控えメンバーで違いを付ける」処理を考えます。

RPGツクールMVで「控えメンバーも経験値を獲得」という設定をすると、戦闘参加メンバーも控えメンバーも「同じ」経験値を入手します。
これをなんとかして違いを付けるようにします。
今回は、プラグイン(JavaScript)は使いません。

## 処理をどうやって作るか考える

さて、RPGツクールMVの機能の中で経験値に関する物がありますね。
そうです。以下の3つですね。

1. 「敵キャラ」の「経験値」の設定
2. 「イベント」の「経験値の増減」コマンド
3. 「特徴」の「経験値獲得率」の設定

1つ目は、最もメインとなる経験値の設定ですね。
今回、ここは設定しますが、設定出来る値が1個なので違いを出す事は出来なさそうです。

2つ目は、イベントで経験値を与えるコマンドですね。
変数を使って増減値を指定出来るので、使おうと思えば使えそうですが、具体的な値をどうやって決めるのか、戦闘終了時にこのイベントを実行するにはどうするのか、といった点が難しそうです。

3つ目は、1つ目の敵キャラに設定する経験値の値を割合で変更する物です。
これを戦闘参加メンバーと控えメンバーで割合を変えれば、なんとか出来そうです。
今回は、この「経験値獲得率」を使います。

## 処理を作ってみる

では、「経験値獲得率」をどのように使うのか、処理を考えましょう。
やりたい事は

戦闘勝利時に得られる経験値を戦闘参加メンバーと控えメンバーで違いを付ける。

なので、戦闘参加メンバー全員に「経験値獲得率」を設定すれば良さそうですね。

ここで、RPGツクールMVの仕様の話になりますが、イベントコマンドで「パーティ全体」という処理を行った場合、マップ画面では控えメンバーも含みますが、戦闘中では戦闘参加メンバーのみが対象になります。
つまり、戦闘中であれば、『戦闘参加メンバー全員に「経験値獲得率」を設定』するには「パーティ全体」を指定すれば、簡単そうに見えます。

そして、戦闘参加メンバーは戦闘ごとに変わる可能性があるので、「経験値獲得率」は付与・解除が簡単に出来るように「ステート」に「経験値獲得率アップ」として用意するのが良さそうです。



次に、処理の流れを考えます。
以下の図を描いてみました。



さあ、この図を元に実装してみましょう。

1. 戦闘開始時に経験値獲得率アップを付与します。
バトルイベントでターン0の時に、パーティ全体に経験値獲得率アップを付与します。
2. 戦闘終了時に経験値獲得率アップを解除します。
コモンイベントの並列処理で戦闘終了時の処理を行います。
(戦闘開始時に戦闘発生スイッチをONに、この処理の中でOFFにして管理します。この処理の記述は省略します)

戦闘に勝利したら経験値が得られるのは元々の処理なので、この2つを追加します。

尚、ステートの「戦闘終了時に解除」を使うと、戦闘終了時の経験値獲得の前にステートが解除されてしまうようなので、わざわざコモンイベントを使用しています。




## 例外処理を考える

ところで、この処理では考慮されていない物があります。
RPGツクールMVでは、戦闘不能になると「全てのステートが解除されてしまう」事です。
この解除には、プレイヤーに見えないステートも含まれます。

そこで、戦闘不能から復活する時(アイテムの効果など)に経験値獲得率アップを再付与します。

尚、戦闘不能のまま戦闘終了すると経験値が得られませんが、これは戦闘不能ステートに経験値獲得率があるためです。必要に応じて変更しましょう。



## おわりに

このように、処理の流れを考える時には図を描いたり、状態が変わる処理が別に存在しないかをチェックしましょう。

それではまた。


JavaScriptの基礎っぽい物【2のつづき】

2018-11-18 18:22:41 | RPGツクールMV

こんにちは。くろうどです。

前回のじゃんけん関数を実際にRPGツクールMVで使ってみました。

これをそのままプラグインとして登録しました。

(即時関数では囲っていないです)

 

マップイベントは以下のようになっています。

画像だと一部しか表示されていないので、テキストにしたのが以下です。

じゃんけん関数は、真ん中辺りの変数の操作(スクリプト)で、

「◆変数の操作:#0003 [じゃんけん結果] = janken($gameVariables.value(1), $gameVariables.value(2))」

こんな感じで使っています。


◆変数の操作:#0002 [対戦相手の手] = 乱数 0..2
◆条件分岐:[対戦相手の手] = 0
◆名前の変更:対戦相手の手, グー

:分岐終了
◆条件分岐:[対戦相手の手] = 1
◆名前の変更:対戦相手の手, チョキ

:分岐終了
◆条件分岐:[対戦相手の手] = 2
◆名前の変更:対戦相手の手, パー

:分岐終了
◆文章:Package1(0), ウィンドウ, 上
:  :\>僕とじゃんけんをしよう。
:  :\>
:  :\>君の手を選んでね。
◆選択肢の表示:グー, チョキ, パー (ウィンドウ, 中, #1, -)
:グーのとき
◆変数の操作:#0001 [あなたの手] = 0
◆名前の変更:あなたの手, グー

:チョキのとき
◆変数の操作:#0001 [あなたの手] = 1
◆名前の変更:あなたの手, チョキ

:パーのとき
◆変数の操作:#0001 [あなたの手] = 2
◆名前の変更:あなたの手, パー

:分岐終了
◆変数の操作:#0003 [じゃんけん結果] = janken($gameVariables.value(1), $gameVariables.value(2))
◆条件分岐:[じゃんけん結果] > 0
◆文章:Package1(0), ウィンドウ, 上
:  :\>君:\N[1] VS \N[2]:僕
:  :\>
:  :\>君の勝ちだよ。

:分岐終了
◆条件分岐:[じゃんけん結果] = 0
◆文章:Package1(0), ウィンドウ, 上
:  :\>君:\N[1] VS \N[2]:僕
:  :\>
:  :\>あいこだね。

:分岐終了
◆条件分岐:[じゃんけん結果] < 0
◆文章:Package1(0), ウィンドウ, 上
:  :\>君:\N[1] VS \N[2]:僕
:  :\>
:  :\>僕の勝ちだよ。
:  :\>つまり、君の負けって事さ。

:分岐終了


これを実行すると以下のようになります。

 それでは~。


JavaScriptの基礎っぽい物【2】

2018-11-18 08:01:23 | RPGツクールMV

こんにちは。くろうどです。

今回は、RPGツクールMVをやってる人向けに JavaScript の基礎っぽいソースコードをお見せする第2弾を書きたいと思います。

今回紹介する関数は「じゃんけん」です。

 

①まず、このじゃんけん関数の仕様をコメント部分(/* と */ の間)に書いていますが、書ききれていないですね……。

今回は前提として、2人でじゃんけんします。

「あなた」と「対戦相手」の2つのじゃんけんの手を引数として与えます。

「0:グー、1:チョキ、2:パー」としました。

※今回、配列を使うので0からの連番としました。

そして、じゃんけんの対戦結果が戻り値として戻ってきます。

「-1:あなたの負け、0:引き分け、1:あなたの勝ち」としました。

※0を基準に大小比較する方がソースコードが分かりやすくなると思い、こうしました。


②「janken = function(you, opponent)」の部分は、関数の宣言です。

引数を2つ受け取ります。


③「var game =」の部分は、じゃんけんの入力と結果を二次元配列を使用して表現しています。

配列は1列だけではなく、表として使う二次元配列という使い方が出来ます。

(三次元以上の配列は分かりにくいので使わない方がイイかと思います)

今回は、あなたと対戦相手の2人のじゃんけんなので、表で表すことが出来ます。

表を使う事で、if文を使わずにじゃんけんの結果を出す事が出来ます。


④「return game[you][opponent];」の部分でじゃんけん結果を戻します。

配列gameに引数で得た値をそのまま与え、配列gameに設定されている「-1、0、1」の値をもらい、そのまま return で戻します。


⑤この「じゃんけん関数」を使う時は、「あなた」の手を入力してもらい、「相手」の手をランダム等で決定し、その値を関数に与えます。

そして戻り値を判定し「勝ち、負け、あいこ」等のメッセージを出す事になります。

つまり、この関数ではプレイヤーの入力や、メッセージの表示は行わないという事です。


↓↓画像じゃないソースコード


/*
* じゃんけん関数
*
* 引数に0~2の値を入れる。
* 0:グー
* 1:チョキ
* 2:パー
*
* 戻り値
* -1:あなたの負け
* 0:あいこ
* 1:あなたの勝ち
*/
janken = function(you, opponent) {
// ↓you / opp→ rock scissors paper
// rock draw win lose
// scissors lose draw win
// paper win lose draw
var game = [[ 0, 1, -1],
[-1, 0, 1],
[ 1, -1, 0]];

return game[you][opponent];
};

// テスト実行
console.log(janken(0, 0));
console.log(janken(1, 0));
console.log(janken(2, 0));
console.log(janken(0, 1));
console.log(janken(1, 1));
console.log(janken(2, 1));
console.log(janken(0, 2));
console.log(janken(1, 2));
console.log(janken(2, 2));

それでは~。