【解決済み】RGSS3draw_textについて

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

【解決済み】RGSS3draw_textについて

投稿記事by aiueo » 2017年3月08日(水) 21:03

【解決済み】RGSS3draw_textについて

こんにちは。

RPGツクールVXAce オンラインマニュアルの
RGSS組み込みクラスの
Bitmapのメソッド draw_text(rect, str[, align]) の説明に

この処理には時間がかかるため、1 フレームごとに文字列を再描画するような使い方は推奨されません。

とあります。
どうも自分はそういう使い方をしている気がします。

自分は
矢印キー操作を変数111に格納するコモンを作り、
マップイベントで、

ループ
  変数111を加減算し、変数222に代入

  文章aaa表示

  条件分岐でもし変数222の中身が1なら
   文章bbbを表示
   イベントコマンドの文章の表示(空白)
   文章bbbを消す

  条件分岐でもし変数222の中身が2なら
   文章cccを表示
   イベントコマンドの文章の表示(空白)
   文章cccを消す
  ・・・
以上繰り返し

というのを組んでいます。
画面表示の文章
aaa
がキー操作によって
aaa
bbb
になったり
aaa
ccc
になったりします。

  上記の詳細
   キー操作を変数111に格納するコモン
    ひとつのループのなかに
    Input.trigger?(:UP)で上ボタンが新たに押されたら変数111に1を代入
    というのを各パターン作る
   文章の表示   
    スクリプト
    $zzz = Window_Base.new(0, 40, 200, 50)
    $zzz.opacity = 0
    $zzz.draw_text_ex(0, 0, "あああああいいいいい")
    (X0Y40の位置にX200Y50の矩形を生成し、透明にして、あああああいいいいいを表示する)
   文章の消去
    $zzz.dispose
    $zzz=nil
   文章を表示してプレイヤーの操作で消す方法
    プレイヤーの操作で表示を消す方法が分からなかったため
    イベントコマンドの文章の表示のボタン操作を利用


これはすべてイベントコマンドのループの中にある訳ですが、
これがいわゆる1 フレームごとに文字列を再描画という状態になるのでしょうか?

もしそうならどのように改善した方がいいでしょうか?
コモンイベントに逃がす部分を増やすことも考えましたが、どこかでそれは重さに関係ない、
というのを見ましたので、修正案が思いつきません。

以上よろしくお願いします。
最後に編集したユーザー aiueo on 2017年3月11日(土) 18:03 [ 編集 1 回目 ]

faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: RGSS3draw_textについて

投稿記事by faida » 2017年3月08日(水) 23:46

こんばんは。

どこかしらでループを抜け出したり処理を中断させたいということであれば、
「変数111が変数222と一致した場合」に処理を中断させればいいと思います。
例えば、変数111が0の時、かつ変数222も0の時、等ですね。

これはデフォルトスクリプトや素材スクリプトでも一般的に使われている方法で、
デフォルトだと「Window_EquipItem(装備できるアイテム表示)」の「装備スロット ID の設定」なんかで使われています。
通常、「Window_EquipItem」には1フレームごとに現在選択されている装備スロットが代入されますが、
処理を中断しないと、全フレームで再描画が行われてとんでもなく重たくなります。
要はそういう風に、1フレームごとに代入しているのなら、同じ数値を代入する前に中断すればいいわけです。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
aiueo
記事: 50
登録日時: 2016年5月09日(月) 23:33

Re: RGSS3draw_textについて

投稿記事by aiueo » 2017年3月09日(木) 21:23

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

上手く説明出来ないのでプロジェクトをアップ致しました。
お手数ですがDLして頂ければ幸いです。
※すみません修正版あげました
https://www.axfc.net/u/3784545.zip
DLキーワード
v9hka3q0

スクリプトエディタ画面で
スクリプト素材を入れた他、
ゲーム変数の短縮と( $game_variables から $abc  に)、
イベントコマンドでロード画面を開く(イベントコマンド「スクリプト」で load123 )、
為の記述をしています。

コモンイベントに
キー操作を取得して変数に代入するもの、
常時表示するテキストをセーブ、ロードの際消すもの
を設定しました。

文字列”能力値”
数値”100”
カーソル初期位置
セーブ
ロード
空白
文章1
文章2
文章3(能力値-10)
となっています。

常時表示される”能力値”(不変)と”100”(変更される)が、
キーを動かすごとに濃くなってまた元に戻ります。表示が重ねて実行され続けている感じです。
またセーブ、ロード画面に遷移すると消えるのが遅く、かぶって表示されてしまいます。
このへんから1フレーム毎に表示が実行され重くなっているのだと考えました。

faida様が仰ったのは
変更前と変更後を変数に取得して比較して変更自体を検出し、
条件分岐で
変更があった場合のみ再表示し、
変更があった場合は処理しない、ということだと思います。

色々やってみましたがうまくいきません。
セルフスイッチONならテキスト描写してセルフスイッチOFF、セーブロードが実行されたらセルフスイッチON
とかやりましたが動作せず、
処理をループの外に持っていこうとするとセーブロードでエラー(定義されていないdispose)が出たりします。
必要な場合のみ実行するというのは何とか分かるのですが方法が分かりません。
これはどうすればいいでしょう。

以上よろしくお願いします。
aiueo
記事: 50
登録日時: 2016年5月09日(月) 23:33

Re: RGSS3draw_textについて

投稿記事by aiueo » 2017年3月10日(金) 21:14

色々やって動作する物が出来ました。
スイッチと変数で
画面遷移直後、セーブ・ロード画面遷移後、数値に変更があった場合、
にのみ書き換えを行うようにすると、キー操作ごとの多重書き込みや遅延が無くなりました。
一時はスクリプトで表示したテキストを消去する際の
$xxxx=nil
の一文があるからロードの際おかしくなってエラーになる、
と思っていましたがそうではなかったようで
一応動くようになりましたが、なぜかはよく分かりません。
このまま作業を進めてみようと思います。
ありがとうございました。

“VX / Ace:質問” へ戻る