【解決済み】VXAceRGSS3スクリプトでの画像表示

aiueo
記事: 50
登録日時: 2016年5月09日(月) 23:33

【解決済み】VXAceRGSS3スクリプトでの画像表示

投稿記事by aiueo » 2019年6月16日(日) 16:59

VXAceRGSS3スクリプトでの画像表示

RPGツクールVXAceのマップ画面で
イベントコマンドの「スクリプト」を用いて
画像を表示させる方法をいくつか試しました。

\Graphics\Picturesに
表示させたい画像ファイルを入れます。
マップイベントで
イベントコマンドの「スクリプト」にスクリプトを書きます。
マップイベントA(画像表示)、
マップイベントB(画像消去)を作成します。

方法1 #####################################################

イベントコマンドの「ピクチャの表示」「ピクチャの消去」と同じ?

マップイベントA
screen.pictures[1].show("画像111", 0, 0, 0,
100, 100, 255, 0)

マップイベントB
screen.pictures[1].erase

方法2 #####################################################

ウィンドウを生成し、
画像を取り込んだキャッシュを生成し、
キャッシュと同サイズの矩形を生成し、
ウィンドウを透明にして、
ウィンドウにキャッシュを矩形で表示する。

マップイベントA
$window222 = Window_Base.new(0, 0, 640, 480)
cache222 = Cache.picture("画像222")
rect222 =
Rect.new(0, 0, cache222.width, cache222.height)
$window222.opacity = 0
$window222.contents.blt(0, 0, cache222, rect222)

マップイベントB
$window222.dispose

方法3 #####################################################

画像ファイルへのパスを設定し、
スプライトを生成し、
パスの画像でビットマップを生成し、スプライトに表示する。

マップイベントA
filename333 = "Graphics/Pictures/画像333"
$sprite333 = Sprite.new
$sprite333.bitmap = Bitmap.new(filename333)

マップイベントB
$sprite333.dispose

方法4 #####################################################

画像でキャッシュを生成し、
スプライトを生成し、
スプライトにキャッシュを表示する。

マップイベントA
$cache444 = Cache.picture("画像444")
$sprite444 = Sprite.new
$sprite444.bitmap = $cache444

マップイベントB
$sprite444.dispose
$cache444.dispose

方法5 #####################################################

画像ファイルへのパスを設定し、
ビューポートを位置と大きさを指定して生成し、
スプライトをビューポート参照で生成し、
ビューポート内のスプライト位置を指定し、
パスの画像でビットマップを生成し、スプライトに表示する。

マップイベントA
bitmap555 = "Graphics/Pictures/画像555"
$viewport555 = Viewport.new(50, 50, 100, 100)
$sprite555 = Sprite.new($viewport555)
$sprite555.x = 0
$sprite555.y = 0
$sprite555.bitmap = Bitmap.new(bitmap555)

マップイベントB
$sprite555.dispose
$viewport555.dispose

イベントAに話しかけると画像が表示され、
表示中主人公がマップを移動可能で、
イベントBに話しかけると画像が消えます。

質問1:
画像表示後、キャンセルキーでメニュー画面など表示すると、
開いたウィンドウの下で画像は表示され続けますが、
その後キャンセルキーでウィンドウを閉じてマップ画面に戻ると、
方法1 2 の画像は表示され続けますが、
方法3 4 5 の画像は消えます。
どうすれば消えないように出来ますか?

質問2:
画像の消去の方法は、上記のもので正しく出来ているのでしょうか?
なるべくnewで生成したものをdisposeするようにしてみましたが、
表示されないだけで画像読み込みが続いてたり、
データが消えずに蓄積しているのではと思ったので。

以上よろしくお願いいたします。

導入済スクリプト素材
CACAO氏
http://cacaosoft.webcrow.jp/
RPGツクールVX Ace Fan Patch
添付ファイル
20190616a.jpg
最後に編集したユーザー aiueo on 2019年6月17日(月) 21:12 [ 編集 1 回目 ]

ecf5DTTzl6h6lJj02
記事: 450
登録日時: 2018年12月23日(日) 13:55

Re: VXAceRGSS3スクリプトでの画像表示

投稿記事by ecf5DTTzl6h6lJj02 » 2019年6月16日(日) 20:20

質問1:
画像表示後、キャンセルキーでメニュー画面など表示すると、
開いたウィンドウの下で画像は表示され続けますが、
その後キャンセルキーでウィンドウを閉じてマップ画面に戻ると、
方法1 2 の画像は表示され続けますが、
方法3 4 5 の画像は消えます。
どうすれば消えないように出来ますか?

スプライトのZ座標が関係しています。
画像を描画する場合、Z座標の大きいものほど上に描かれるようになっています。
Sprite.newで新しいスプライトを作成したとき、スプライトのZ座標は0になっています。
マップ画面のZ座標も0(だったはず)です。
Z座標が同一の場合、後から描画(作成)されたものが上になります。
スプライトが描画されたタイミングでは、マップの画像よりスプライトのほうが後から描画されていますので、スプライトがマップより上になります。
しかし、メニュー画面を表示して、マップ画面に戻ると、マップ画面の書き直しが行われます。
マップ画面が、スプライトよりも後から描画されることになるので、スプライトはマップ画面の下になってしまい、結果スプライトは見えなくなってしまうわけです。
screen.picture や ウィンドウはマップ画面より上にかかれるようにZ座標が設定されている(ちなみにウィンドウの場合デフォルトのZ座標は100)ので、
マップ画面に戻っても消えません。
$sprite333.z = 1 等とスプライトのZ座標を1以上にすれば、マップ画面に戻っても消えなくなります。

質問2:
画像の消去の方法は、上記のもので正しく出来ているのでしょうか?
なるべくnewで生成したものをdisposeするようにしてみましたが、
表示されないだけで画像読み込みが続いてたり、
データが消えずに蓄積しているのではと思ったので。


基本的に問題ないと思いますが、
キャッシュに関して、ちょっとだけ。
png画像は他の画像に比べて、読み込みの際に時間がかかり、メモリも余分に消費します。
そのため、頻繁にpng画像の読み込みをすると、動作が重くなったり、メモリに負担がかかったりすることがあります。
これを防ぐために、頻繁に使う画像はキャッシュに画像データを登録しておき、同じ画像を読み込もうとした際に、このデータを返すようにしています。
なので、キャッシュデータは、本当にいらなくなった場合に削除すべきで、
スプライトを削除するタイミングで、キャッシュも一緒に削除する必要は無いと思います。
aiueo
記事: 50
登録日時: 2016年5月09日(月) 23:33

Re: VXAceRGSS3スクリプトでの画像表示

投稿記事by aiueo » 2019年6月16日(日) 23:59

ecf5DTTzl6h6lJj02様、ありがとうございます。


質問1について:
方法3 #####################################################
filename333 = "Graphics/Pictures/画像333"
$sprite333 = Sprite.new
$sprite333.z = 1             # ←追加
$sprite333.bitmap = Bitmap.new(filename333)
方法4 #####################################################
$cache444 = Cache.picture("画像444")
$sprite444 = Sprite.new
$sprite444.z = 1 # ←追加
$sprite444.bitmap = $cache444
方法5 #####################################################
filename555 = "Graphics/Pictures/画像555"
$viewport555 = Viewport.new(50, 50, 100, 100)
$sprite555 = Sprite.new($viewport555)
$sprite555.x = 10
$sprite555.y = 0
$viewport555.z = 1 # ←追加
$sprite555.bitmap = Bitmap.new(filename555)

無事消えない様になりました。
ありがとうございます。



質問2について:
https://blog.jikkuri.info/2012/09/13/うわっ私のrpgのメモリ、使いすぎ%EF%BC%9F/
http://rpgmaker-script-wiki.xyz/banishpic_vxace.php
上記の記事を読んだ後、方法2~5は生成したオブジェクトを明確に消してないものが多く不安に思ったためです。

方法4 #####################################################
マップイベントB
$sprite444.dispose
$cache444.dispose ← キャッシュはここですぐに消さず、本当に不要になった際に消すという事ですね。

ところでキャッシュはいずれ自分で消す必要があると思うのですが
方法2 #####################################################
マップイベントA
$window222 = Window_Base.new(0, 0, 640, 480)
cache222 = Cache.picture("画像222")       ←
rect222 =
Rect.new(0, 0, cache222.width, cache222.height)
$window222.opacity = 0
$window222.contents.blt(0, 0, cache222, rect222)

この方法2のキャッシュcache222はローカル変数なので、
マップイベントBでcache222.disposeとやるとエラーになります。
ウィンドウ$window222をdisposeするとキャッシュも消えているのでしょうか?

以上よろしくお願いいたします。
ecf5DTTzl6h6lJj02
記事: 450
登録日時: 2018年12月23日(日) 13:55

Re: VXAceRGSS3スクリプトでの画像表示

投稿記事by ecf5DTTzl6h6lJj02 » 2019年6月17日(月) 04:23

ウィンドウ$window222をdisposeするとキャッシュも消えているのでしょうか?

ウィンドウのdisposeコマンドにはキャッシュを削除する機能はないので、キャッシュは残っているはずです。
Cache.picture("画像ファイル名").dispose
で、削除できるはずです。
aiueo
記事: 50
登録日時: 2016年5月09日(月) 23:33

Re: VXAceRGSS3スクリプトでの画像表示

投稿記事by aiueo » 2019年6月17日(月) 21:10

ecf5DTTzl6h6lJj02様、ありがとうございます。

方法2 #####################################################
マップイベントB
$window222.dispose
Cache.picture("画像222").dispose # ←追加

エラー無く動作いたしました。

ありがとうございました!

“VX / Ace:質問” へ戻る