ページ 11

画像の読み込みについて

Posted: 2018年2月06日(火) 21:22
by faida
ここでははじめまして。普段はRGSS2/3を作成しています。
最近MVを入手して、素材の移植を始めようかと考えており、勉強中の身です。
そこでどうしても詰まってしまったので、お伺いしたいことがあります。

RGSS3ではCacheからの読み込みが即応的で、以下のようなスクリプトを書いていましたが、
MVでは同じような処理を施しても、初回だけ読み込みに失敗してしまいます。

コード: 全て選択

  def new_line_x
    $game_message.face_name.empty? ? 0 :
    Cache.face($game_message.face_name).width / 4 + 16
  end
そこで以下のような対応策を考えましたが、いずれも失敗しています。
・画像の読み込みが完了するまでウェイト(bitmap.isReadyを利用してシーンクラスのupdateでwhileループを
 かけたが無限ループ、SceneManager._scene.isReadyは効果なし)
・2回読み込む(これはそもそも失敗しています。やはり時間が必要?)

私は画像の幅/高さを取得して処理をするスクリプトをいくつか作成しており、その移植に当たっては
この問題が解決しないとどうしようもなくなってしまいます。
「画像の読み込み」だけをwhileループで使えるようにするにはどうすればよいでしょうか。

Re: 画像の読み込みについて

Posted: 2018年2月06日(火) 22:07
by しぐれん
非同期読み込みに関する問題ですね。
以下の記事を参考にどうぞ。
https://qiita.com/EYN_kenzaki/private/e ... dc7f40b690
原理的には関数を抜けて一定のタイミングで画像のリクエストを行います。
別スレッドで処理が動いているような形になります。

初回だけ失敗するのはこれが原因ですね。(2回目以降は既にrequestが完了しているので正しく動く)
よって読み込みリクエストと読み込み完了時の処理に分ける必要があります。

より低レイヤーを触ってonLoadにイベントハンドラを設定する方法もありますが、自己責任でお願いします。

Re: 画像の読み込みについて

Posted: 2018年2月07日(水) 11:52
by faida
>しぐれん様
返信ありがとうございます。
確かにこの方法なら理論上実現可能ですね。
ですが、素材として見た場合、(RGSS3でいうところの)1つのメソッドに全て処理を含めることで競合確率を低下させる
といったことができないため、少々使い勝手が悪くなるかもしれないという懸念はあります。
とりあえず今はオプションとして含めることにして、使用はユーザーに任せるという形で実装したいと思います。
ありがとうございました。

引き続き、「画像の読み込み処理のみ」をwhileループ内に収める方法を募集しております。
(それができればあまり悩まずに直感的に移植できるのですが……)