動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

アバター
MEIKOI
記事: 168
登録日時: 2018年9月22日(土) 20:13
連絡する:

動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

投稿記事 by MEIKOI »

こんにちは。いつもありがとうございます!

行いたい事は、
トリアコンタン様の動的文字列ピクチャ生成プラグインを使って
イベントが持つ変数に格納された情報をピクチャとして表示しているのですが

そのイベントの画像(イベントエディタ上の歩行キャラ用の画像の事)も表示したいと思っています。

動的文字列ピクチャ生成プラグインでは、イベントの歩行キャラ用の画像を
表示する事はできなさそうなのですが
そのイベントの画像を呼び出して画面上に表示させる方法はありませんでしょうか?
最後に編集したユーザー MEIKOI [ 2019年10月28日(月) 13:53 ], 累計 1 回
ジャングル
記事: 108
登録日時: 2018年12月30日(日) 14:51
お住まい: 自動販売機

Re: クリックしたイベントの歩行画像を取得して表示させる方法

投稿記事 by ジャングル »

はじめましてジャングルと言います

ちょっと書いてみました
(たぶんご希望の動作になると思います)

動的文字列プラグインのプラグインコマンドがあった場合、
キャラをクリックしたらその画像がマップに表示され、イベント終了で消えます

画面左上が動的文字列です
↓スクリーンキャプチャでマウスカーソルが消えてますが、緑のキャラをクリックしてます
スクリーンショット 2019-10-26 18.31.38.png

コード: 全て選択

var _Game_Screen_setDTextPicture = Game_Screen.prototype.setDTextPicture;
Game_Screen.prototype.setDTextPicture = function(value, size) {
	if (TouchInput.isPressed()) {
		var x = 10, y = 10, scale = 5; // ★
	    var bitmap = ImageManager.loadCharacter(this._characterName);
	    var big = ImageManager.isBigCharacter(this._characterName);
	    var pw = bitmap.width / (big ? 3 : 12);
	    var ph = bitmap.height / (big ? 4 : 8);
	    if (!big) {
	    	var n = this._characterIndex;
	    	var sx = (n % 4 * 3 + 1) * pw;
	    	var sy = (Math.floor(n / 4) * 4) * ph;
	    } else {
	    	var n = {2:2, 4:5, 6:8, 8:12}[this._originalDirection];
	    	var sx = n % 3 * Math.floor(bitmap.width / 3);
	    	var sy = Math.floor(n / 4) * Math.floor(bitmap.height / 4);
	    }
	    bitmap = bitmap || big;
	    bitmap.addLoadListener(function() {
		    this._charSprite = new Sprite(bitmap);
		    this._charSprite.setFrame(sx, sy, pw, ph);
		    this._charSprite.scale.x = this._charSprite.scale.y = scale;
		    this._charSprite.x = x; 
		    this._charSprite.y = y; 
		  	SceneManager._scene.addChild(this._charSprite);
		}.bind(this));    
  	}
	_Game_Screen_setDTextPicture.apply(this, arguments);
};
var _Game_Event_lock = Game_Event.prototype.lock;
Game_Event.prototype.lock = function() {
	if (!this._locked) {
		$gameScreen._characterName = this._characterName;
		$gameScreen._characterIndex = this._characterIndex;
		$gameScreen._originalDirection = this._originalDirection;
	}
	_Game_Event_lock.call(this);
};
var _Game_Event_unlock = Game_Event.prototype.unlock;
Game_Event.prototype.unlock = function() {
    if (this._locked && $gameScreen._charSprite) {
		SceneManager._scene.removeChild($gameScreen._charSprite);
    }
    _Game_Event_unlock.call(this);
};
これをプラグインにしてjs/pluginsフォルダに入れてONにすると機能します(※動的文字列プラグインの下に配置)
★の値を変更したら座標とスケールが変わります

※これは一例なので参考までにしてください(3回くらいしか動作確認してません)
※多忙につき返信が遅れる場合があります

※たぶん、タイトルにプラグイン名を入れたら作者様に回答して貰えると思います
アバター
MEIKOI
記事: 168
登録日時: 2018年9月22日(土) 20:13
連絡する:

Re: クリックしたイベントの歩行画像を取得して表示させる方法

投稿記事 by MEIKOI »

ジャングル様

ご返信ありがとうございます!プログラムまで書いていただいて感謝ですm(_ _)m

ちょっと出かけておりまして、返事が遅くなりました。

まさにやりたい事は、コレです!

早速使ってみて、再度報告させていただきます。ありがとうございます!
アバター
MEIKOI
記事: 168
登録日時: 2018年9月22日(土) 20:13
連絡する:

Re: 動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

投稿記事 by MEIKOI »

ジャングル様へ

書いて頂いたソースをjsにして下に配置してみました。

1つイベントを作って、トリガープレイヤーから接触にして以下の処理にしました。

D_TEXT テスト文
D_TEXT_SETTING
ピクチャの表示

このイベントをクリックしてみましたが、歩行グラは表示されませんでした。

プレイヤーから接触したら、テスト文がピクチャ表示されます。

私の方法が違うのだと思いますが^^; まずはご報告させていただきますm( _ _ )m
ジャングル
記事: 108
登録日時: 2018年12月30日(日) 14:51
お住まい: 自動販売機

Re: 動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

投稿記事 by ジャングル »

確認しました
テキスト付きだと思って次のような構成にしてました

コード: 全て選択

D_TEXT テスト文
D_TEXT_SETTING
ピクチャの表示
文章の表示
ピクチャの消去
↑これなら表示されますが


下の3つのみであれば、 コードの下の方をコメントアウト//すれば表示されます★
D_TEXT テスト文
D_TEXT_SETTING
ピクチャの表示

コード: 全て選択

var _Game_Event_unlock = Game_Event.prototype.unlock;
Game_Event.prototype.unlock = function() {
    if (this._locked && $gameScreen._charSprite) {
//★      SceneManager._scene.removeChild($gameScreen._charSprite);
    }
    _Game_Event_unlock.call(this);
};
※ただ、これだと表示されますが、動的文字列が消えませんよね?
会話か何かで止めて、イベント終了時に消すものだと思ってました

どういう風に消すのかが分からないので、これ以上の対応はできないかもしれません

まあ、タイトルを変えられたようで、そのうちご本人がこられると思いますが
至らなくて済みません
ジャングル
記事: 108
登録日時: 2018年12月30日(日) 14:51
お住まい: 自動販売機

Re: 動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

投稿記事 by ジャングル »

もし、クリックするごとに表示非表示を繰り返すなら、これで可能です
間違ってたら済みません

コード: 全て選択

(function() {
var appearFlg = false;
var _Game_Screen_setDTextPicture = Game_Screen.prototype.setDTextPicture;
Game_Screen.prototype.setDTextPicture = function(value, size) {
   if (TouchInput.isPressed()) {
   		if (!appearFlg) {
      var x = 10, y = 10, scale = 5; // ★
       var bitmap = ImageManager.loadCharacter(this._characterName);
       var big = ImageManager.isBigCharacter(this._characterName);
       var pw = bitmap.width / (big ? 3 : 12);
       var ph = bitmap.height / (big ? 4 : 8);
       if (!big) {
          var n = this._characterIndex;
          var sx = (n % 4 * 3 + 1) * pw;
          var sy = (Math.floor(n / 4) * 4) * ph;
       } else {
          var n = {2:2, 4:5, 6:8, 8:12}[this._originalDirection];
          var sx = n % 3 * Math.floor(bitmap.width / 3);
          var sy = Math.floor(n / 4) * Math.floor(bitmap.height / 4);
       }
       bitmap = bitmap || big;
       bitmap.addLoadListener(function() {
          this._charSprite = new Sprite(bitmap);
          this._charSprite.setFrame(sx, sy, pw, ph);
          this._charSprite.scale.x = this._charSprite.scale.y = scale;
          this._charSprite.x = x;
          this._charSprite.y = y;
           SceneManager._scene.addChild(this._charSprite);
           appearFlg = true;
           $gameScreen.clear();
           var spriteset = SceneManager.getSpriteset();
      		spriteset.addChild(spriteset._pictureContainer);
      }.bind(this));   
      } else {
      	SceneManager._scene.removeChild($gameScreen._charSprite);
      	appearFlg = false;
      	var spriteset = SceneManager.getSpriteset();
      	spriteset.removeChild(spriteset._pictureContainer);
      }
     }
   _Game_Screen_setDTextPicture.apply(this, arguments);
};
var _Game_Event_lock = Game_Event.prototype.lock;
Game_Event.prototype.lock = function() {
   if (!this._locked) {
      $gameScreen._characterName = this._characterName;
      $gameScreen._characterIndex = this._characterIndex;
      $gameScreen._originalDirection = this._originalDirection;
   }
   _Game_Event_lock.call(this);
};
})();
この3つの指定で動きます
D_TEXT テスト文
D_TEXT_SETTING
ピクチャの表示
アバター
MEIKOI
記事: 168
登録日時: 2018年9月22日(土) 20:13
連絡する:

Re: 動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

投稿記事 by MEIKOI »

こんにちは! コードありがとうございます!

早速試してみました所

マップ上にキャラクターの歩行画像は表示されました。ありがとうございます!


1つ気になった部分です。

D_TEXT テスト文のコマンドが5つあると、歩行画像も5枚表示されている。
※トリアコンタン様のGUI画面デザインプラグインを入れているのでこれをONにした状態で
試しに表示された歩行画像をドラッグで動かしてみたらD_TEXTのコマンドの数だけ歩行画像が
裏に隠れてありました。
たくさん表示されていても重なっているので1枚にしかみえませんので見た目は問題ないです。

消し方については、コマンドで消せたら一番いいのですが、
クリックで表示、クリックで非表示でも大丈夫かなと思います。

新規プロジェクトで動かして、歩行画像の表示は、うまく行っているのですが
実際に使うゲームに入れると何かと干渉しているのか、
can not read property 'match' of undefinedがでるので
こちらは、調査中しながら組み込んでみたいと思います。
ジャングル
記事: 108
登録日時: 2018年12月30日(日) 14:51
お住まい: 自動販売機

Re: 動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

投稿記事 by ジャングル »

これでも、複数枚表示されますか?

2枚目以降を追加しないためのフラグがありましたが、その位置を上げて2枚目以降の追加を即否定するようにしました

コード: 全て選択

(function() {
	var appearFlg = false;
	var erasePict = function() {
		SceneManager._scene.removeChild($gameScreen._charSprite);
	  	appearFlg = false;
	  	var spriteset = SceneManager.getSpriteset();
	  	spriteset.removeChild(spriteset._pictureContainer);
	};
	var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
	Game_Interpreter.prototype.pluginCommand = function(command, args) {
	_Game_Interpreter_pluginCommand.call(this, command, args);
		if (command === 'erasePictT') { erasePict(); } // ◆
	};
	var _Game_Screen_setDTextPicture = Game_Screen.prototype.setDTextPicture;
	Game_Screen.prototype.setDTextPicture = function(value, size) {
	   if (TouchInput.isPressed()) {
	   		if (!appearFlg) {
	   		appearFlg = true;
	      var x = 10, y = 10, scale = 5; // ★
	       var bitmap = ImageManager.loadCharacter(this._characterName);
	       var big = ImageManager.isBigCharacter(this._characterName);
	       var pw = bitmap.width / (big ? 3 : 12);
	       var ph = bitmap.height / (big ? 4 : 8);
	       if (!big) {
	          var n = this._characterIndex;
	          var sx = (n % 4 * 3 + 1) * pw;
	          var sy = (Math.floor(n / 4) * 4) * ph;
	       } else {
	          var n = {2:2, 4:5, 6:8, 8:12}[this._originalDirection];
	          var sx = n % 3 * Math.floor(bitmap.width / 3);
	          var sy = Math.floor(n / 4) * Math.floor(bitmap.height / 4);
	       }
	       bitmap = bitmap || big;
	       bitmap.addLoadListener(function() {
	          this._charSprite = new Sprite(bitmap);
	          this._charSprite.setFrame(sx, sy, pw, ph);
	          this._charSprite.scale.x = this._charSprite.scale.y = scale;
	          this._charSprite.x = x;
	          this._charSprite.y = y;
	           SceneManager._scene.addChild(this._charSprite);
	           $gameScreen.clear();
	           var spriteset = SceneManager.getSpriteset();
	      		spriteset.addChild(spriteset._pictureContainer);
	      }.bind(this));   
	      } else {
	      	erasePict();
	      }
	     }
	   _Game_Screen_setDTextPicture.apply(this, arguments);
	};
	var _Game_Event_lock = Game_Event.prototype.lock;
	Game_Event.prototype.lock = function() {
	   if (!this._locked) {
	      $gameScreen._characterName = this._characterName;
	      $gameScreen._characterIndex = this._characterIndex;
	      $gameScreen._originalDirection = this._originalDirection;
	   }
	   _Game_Event_lock.call(this);
	};
})();
※プラグインコマンドも追加しました◆
(単純すぎるので他とバッティングしないように末尾にTを入れました。ツクマテのT)
erasePictT

※エラーについてですが、それが出たときにF8キーを押してDeveloperToolを立ち上げて、赤文字をクリックしていけばエラー箇所の特定ができますが...
これは、クリックした後の画像もほしいので、相当の数の画像が必要になります...
手元にプロジェクトがないと、エラー箇所の特定は大変だと思います
済みません
※こちらも後で別プロジェクトに入れて試してみます
アバター
MEIKOI
記事: 168
登録日時: 2018年9月22日(土) 20:13
連絡する:

Re: 動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

投稿記事 by MEIKOI »

ありがとうございます。デバックの方法をしらなかったので、これからとても助かりそうです!^^;

早速、いただいた最新のコードをJSにしてそのまま新規プロジェクトで動かしてみました。

結果は、

D_TEXTが1つの時は、正常に表示されました。(消すコマンドも正常に動作しました。)

D_TEXTが2つの時は、何も表示されませんでした。

画像の貼り方がわからないのですが・・・
https://drive.google.com/file/d/1L9NmWk ... sp=sharing

なんども書き直して頂いて、恐縮ですm(_ _)m申し訳ないです。
アバター
MEIKOI
記事: 168
登録日時: 2018年9月22日(土) 20:13
連絡する:

Re: 動的文字列プラグインでクリックしたイベントの歩行画像を表示させる方法

投稿記事 by MEIKOI »

色々、試していたのですが

} else {
//erasePict();

タッチの処理のelseの処理をコメントアウトしたら
複数のD_TEXTも表示されるようになりました。

コマンドで消せるので、クリックで消える処理を無くしてみようと思ったら
思った動作になったようです。

処理がどのように変わって、表示されるようになったのかは、私には・・・^^;わかりません・・・><

まずは、これで自分のゲームに組み込んで見てもう一度やってみたいと思います。
返信する

“MV:質問”に戻る