2015-11-22

RGSS-移動明かりスクリプト

ShareLink
«RGSS一覧/利用規約

明かりをピクチャで表示すると、
画面を暗くしてもそのまま表示されたままで、ピクチャの移動で同時に透明度を下げる必要があったり、ピクチャだと画面が移動しても画面の同じ位置に留まったままになりますので
イベントやプレイヤーキャラクターが懐中電灯やランプを持って移動する表現はデフォルトのままだと難しいです。

まずはテスト用に円形の明かりの画像を用意して試してみましょう。




【今回の変更点】
・Game_Character 1
・Sprite_Character

【用意するもの】
・明かり画像(png)




■Game_Character 1

他のattr_accessorの下に

attr_accessor :light

を追加し、


def initialize、オブジェクト初期化に

@light = false

を追加します。
これはイベントの明かりのON/OFFスイッチの役目をしており、初期は表示されないようにOFFの状態にします。
テスト時はtrueにして、明かりが表示されるか確認してみるといいかもしれません。


■Sprite_Character

次は本題の明かり表示スクリプトの追加です。

オブジェクトの初期化、
super(viewport)
@character = character

の下に、以下を追加します。

 @light = Sprite.new(viewport)
 @light.bitmap = RPG::Cache.picture("用意した画像ファイル名")
 @light.blend_type = 1
 @light.z = 998
 # キャラクターのlightスイッチがON/OFFで可視/不可視
 character.light ? @light.visible = true : @light.visible = false

明かりにキャラクターと同じビューポートを通す事で画面を黒くフェードアウトさせても画面に残らずに済みます。

blend_type は 1 で画像の合成方法が加算となり、より明るい印象になります。
z座標は設定しない場合、プライオリティが1以上のマップチップ・キャラクターが明かりに被ってしまうので、998以上に設定。
998にしておけば、「最前面に表示」を設定しているイベントが明かりに被り
この花瓶のように浮き出ているように見せる事も可能です。


z座標を998にしたもの
明かりが後ろにいき影になって見える

z座標を999にしたもの
花瓶にも明かりが当たって見える

999以上にすると、最前面に表示しているキャラクターにも明かり画像が被ります。


次に、initialize~endの下に解放命令を追加。
 def dispose
  super
  @light.dispose
 end

それから、def update 内に super よりも下に

@character.light ? @light.visible = true : @light.visible = false

を追加。
lightがtrueの時に可視にして、falseの時は不可視にします。


明かりが懐中電灯で、キャラクターの向きによって明かりの向きも変わる…
といった表示にしたい場合は、
例えば明かり画像のベースを下向きに(↓▲)作ったなら

 @character.light ? @light.visible = true : @light.visible = false
 case @character.direction
 when 2 # 下向き
  @light.angle = 0
  @light.x = self.x - 6 - (@light.bitmap.width / 2)
  @light.y = self.y - 14
 when 4 # 左向き
  @light.angle = 270
  @light.x = self.x
  @light.y = self.y - 120 + (@light.bitmap.height / 4)
 when 6 # 右向き
  @light.angle = 90
  @light.x = self.x
  @light.y = self.y + 88 - (@light.bitmap.height / 4)
 when 8 # 上向き
  @light.angle = 180
  @light.x = self.x + 6 + (@light.bitmap.width / 2)
  @light.y = self.y - 32
 end

数値は132×162pxで作成した画像の、あくまでも見本です。
キャラクター位置、self.x、self.yと画像の大きさ(width、height)を基に数値を調整して作成してみてください。


明かりのON/OFFは
お馴染みイベントコマンドの「移動ルートの設定」でスクリプトを選び

@light = true/false

を挿入するだけです。
場所移動直後に並列処理などでわざわざtrueに設定する手間はありますが、よろしければお試しあれ。




…正直言いますと、Spriteset_Mapでどうにか処理できればわざわざdisposeを追加せずにスマートに済むと思うんですが、力不足でSprite_Characterで処理させています。

とりあえず動けばいいかなーといういつも通りの荒業なので参考になるかどうかはわかりませんが、お役に立てれば幸いです。


そもそもRPGツクールXPを未だに使っている…
愛用しているユーザーさんが見るかはちょっと謎なんですけど…
新しいツクールが出る中、自分だけ遅れてる感があって少々不安ですが
これからもツクールXPを使っていけたらなーと考えるワタクシでありました。
(ツクールXP愛用者の同胞がいたら非常に嬉しい(;v;`))

category: