避難所の一つ

RPGツクールMV用の製作補助ツールとかイラストとか音楽とか配布したり、Java, JavaFX, Scalaのプログラミングのこととか書いてるかも。

スポンサーサイト  

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PRGツクールMV 立ち絵描画のチラつき回避  

立ち絵を描画するイベントスクリプトを作成する時のテクニックみたいなものです。
二つほど紹介します。

ツクールVX ACEの時でしたら、ピクチャ番号1を別のピクチャに切り替える時に
そのまま切り替えても特に問題がなかったのですが、
どうもツクールMVでしたら、画像のチラつきが発生するようです。
画像が切り替わる瞬間に一瞬ピクチャが見えなくなって、
そして画像が切り替わる、といった動作をするため、このような現象が起きているんだと思います。

なので、それを回避するために擬似的にダブルバッファもどきの方法をとる
必要があると思います。
次のようにします。

standPict2

最初に画像を表示する時はコモンイベント[画像1を描画]
といった類のものを呼び出し、
画像を切り替える時は、画像を再描画するためのコモンイベントを呼び出す
といった方法をとることです。

何をしているのかというと、
1枚の画像を2つ重ねて描画する際に、下の画像を先に読み込んでおき、
ウエイトを挟んで読み込みが完了し終わったときに、上の画像の見込みを開始する
といった方法です。
こうすると、上の画像が切り替わる瞬間に画像が見えなくなっても
下の画像がプレイヤーには見えるので、画像のチラつきを防ぐことができます。

ただし問題点もあります。
①切り替える前と切り替える後で画像のポーズが同じでないといけない。
つまり、表情差分といった場合にしか使えない手法、ということになります。

②待ち時間が変動する
環境によっては画像を再描画するフレーム数を調整しないといけないかもしれません。

③待ち時間が長い
ウエイト7フレームとしていますが、頻繁に表情を切り替えるシーンでは
やや待ち時間が長いと感じるかもしれません。

④画像の消去は最後に一気に行うようにする
ここが一番の問題点でした。
画像の再描画の時だけ画像を2枚使うので、
再描画が終わった時に下にしいている画像を消去するように
処理をしていたのですが、その方法だとまれにエラーで落ちます。
Uncaught TypeError: Cannot read property 'width' of null
といったエラーメッセージが表示されます。
おそらく画像の横幅がnullになっているのに参照しようとしてエラーになっている、
といった感じでしょう。
ウエイトを長くとっても再現性が取れなかったので、
画像の再描画を行った後は画像を消さずに2枚一緒に処理をするようにして、
画像を消すのを最後の一回だけで全て行うようにすることで、回避しました。多分…。
今のところはこの方法でエラーは発生していません。
ただし、この方法でしたら2枚つねに画像が描画されていることになるので、
画像を移動したり、動かしたりするときも2枚常に動かす必要があります。


もう一つの方法は、先に使用する画像を全て読み込んでおくという方法です。
これはちょっとあまり検証していないんで断言はできないのですが、
1枚の画像を切り替える際にチラつきが発生するのは最初の一回だけのようです。
つまり、2回目以降は画像を切り替えてもチラつかないのです。
あらかじめ使用する予定の立ち絵を一度全て読み込んでしまうことで、
1枚の画像での切り替えを可能にしよう、という方法です。
読み込む方法は一度ピクチャの描画をしてしまうことです。
一度描画してから消せばいいので、
特定のイベントの前にフェードアウトを挟んで、画面が暗転している間に
使用する画像を全て描画してから消すことで、チラつきを回避できます。多分。

ただしこの方法でもやはり問題はあります。
①使用する画像を後から追加した場合、読み込む画像数を増やさないといけない。
コモンイベントでまとめておけばマシですが、やはり手間がかかる。
読み込むのを一つのコモンイベントで管理するのであれば、
画像数が増えれば増えるほど負荷がかかります。
読み込む時間も増えます。
かといって、各キャラクターごとにわけたコモンイベントで管理する場合でしたら、
キャラ数だけコモンイベントも増えますし、呼び出すのも手間です。

②連続して画像を描画することの負荷
描画して切り替えてを連続して行うことの弊害でどうなるかは計り知れません。
予期せぬエラーを吐くことがあるかもしれません。

③イベントごとに読み込みが必要になる。
当然ですが、画像の読み込みはセーブデータには引き継がれないので、
ゲームを終了して再起動して再描画すると、読み込んでいない場合はやはりチラつきます。
なので、立ち絵を描画するイベントごとに、画像の読み込みを事前に行う必要がでてきます。
つまり、そのイベントごとに読み込みをしたり、画面暗転を挟んだりといった
手間が必要になるわけです。

私は一つ目の方法で立ち絵の描画をするようにしています。
若干のウエイトは気になりますが、こちらのほうが安定すると思っています。
二つ目の方法は、ちょっと未知の領域が多いのであまり検証していません。
検証しようにもパソコンを沢山所持しているわけでもありませんし、
画像描画機能を画像の読み込みとして代用する方法が、
どの程度パソコンに負荷をかけるかも未知数です。
ゲームを遊ぶ環境は良くも悪くも人それぞれなので、
危険な描画方法は避けておこうかな、といった考えからです。
スポンサーサイト
コメント
コメントの投稿
Secret

▲Page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。