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;
		}
	};
};

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