キャラの上にピクチャを常に乗せたい

シミユー
記事: 4
登録日時: 2019年4月03日(水) 23:09

キャラの上にピクチャを常に乗せたい

投稿記事by シミユー » 2021年3月04日(木) 08:30

VXAceの質問なのですが、キャラの上に常にピクチャを表示させる方法を教えていただきたいです。

自分は今キャラクリ要素のあるゲームを作りたいと思っていて、
手始めに透明度の高い赤、緑、青の画像をキャラに重ねてそれぞれの枚数を調節することで
RGBのカラチェンをすることを思いつきました。

そこで試しに32×32の単純な赤、緑、青のピクチャを作り、主人公の座標の中心を原点に表示させました。
トリガーを決定ボタンにするとそれでうまくいったのですが、
常に主人公の上に画像を表示させなければ意味がないのでトリガーを並列処理にして、主人公の座標の中心を原点に表示させると、

 スクリプト 'Sprite_Picture' の50行目でNoMethodErrorが発生しました。
 undefined method`width' for nil:NilClass

というエラーが表示されてしまいました。
並列処理でも主人公の座標の左上を原点にして表示させるとこのエラーは発生しませんでした。
何か解決方法があれば教えていただきたいです。
最後に編集したユーザー シミユー on 2022年8月20日(土) 10:31 [ 編集 1 回目 ]

名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: キャラの上にピクチャを常に乗せたい

投稿記事by 名無し蛙 » 2021年3月04日(木) 12:02

どうもこんにちは。
正確なイベント内容が分からないと具体的な助言は出来ませんがある程度推測は可能です。
まずエラーメッセージですが、これは
NilClass(未設定オブジェクト)にはwidthメソッドが存在しません、という意味(①)です。
そしてSprite_Pictureの50行目というのは

コード: 全て選択

  #--------------------------------------------------------------------------
  # ● 原点の更新
  #--------------------------------------------------------------------------
  def update_origin
    if @picture.origin == 0
      self.ox = 0
      self.oy = 0
    else
      self.ox = bitmap.width / 2
      self.oy = bitmap.height / 2
    end
  end

bitmap.widthの部分を指します。(②)

①②から画像を未設定の状態で原点を中心にして「ピクチャの表示」を設定すると
参照するべき元画像の原点を計算できない為、同様のエラーが起こる事が分かります。
普通ならやらない事ですが、並列処理で監視イベント作って変更って作りならばあり得る事ですね。
ちなみにMV/MZではpixi.jsに表示処理を任せている都合で同じ設定にしてもエラーは発生しないようです。

対応処置に関してはまぁ、色々。
i.エラー条件を満たす上記のイベントを含まないように監視イベントを組みなおす
ii.何も表示しない時は未設定ではなく透明なdummy.pngを用意する
iii.適当な対応スクリプトを組む
bitmapがnilの時にwidth(height)の参照を回避すれば良いだけなら適当なセクションに

コード: 全て選択

class Sprite_Picture < Sprite
  #--------------------------------------------------------------------------
  # ○ 原点の更新
  #--------------------------------------------------------------------------
  def update_origin
    if @picture.origin == 0 || bitmap.nil?
      self.ox = 0
      self.oy = 0
    else
      self.ox = bitmap.width / 2
      self.oy = bitmap.height / 2
    end
  end
end

を追加するだけでエラーは回避出来ると思います

“VX / Ace:質問” へ戻る