独学ツクールブログ

ツクールでのオリジナル作品の話を中心に創作関係の徒然な語り。

<< 異文化コミュニケーション | main | りぬーある >>

[ - ] スポンサーサイト

一定期間更新がないため広告を表示しています

| 2018.05.23 Wednesday | - | - |

[ RGSS奮闘記 ] RGSS奮闘記70:プリセットを読み解く18(Game_Pictureクラス)

今回解説するのは、ピクチャの表示にかかわる根幹クラス、Game_Pictureである。
これがなければどんな画像も表示されない。重要なクラスだ。


公開インスタンス変数は以下の通り。
number : ピクチャ番号
name : ファイル名
origin : 原点
x : X 座標
y : Y 座標
zoom_x : X 方向拡大率
zoom_y : Y 方向拡大率
opacity : 不透明度
blend_type : ブレンド方法
tone : 色調
angle : 回転角度
これらすべてがattr_readerにて定義されている。

initializeメソッドでは各インスタンス変数に初期値を与えることしかしていないので省略。
続いてののshow、moveメソッドも、引数をインスタンス変数に渡すだけなので割愛。
公開インスタンス変数に含まれていない変数だけ解説する。
@target_とついている変数はピクチャの色調変更時に使用するもので、どちらのメソッドでも初期値として現在の値(@xなど)を渡している。
@rotate_speedはピクチャを回転させる際の回転速度。
@durationはピクチャの移動や色調変更などを行う際の時間。Game_Screenクラスでも同名の変数があったが、要するに用途は同じである。

回転速度の変更rotateメソッドでは、引数を@rotate_speedに渡すだけ。
色調変更start_tone_changeメソッドでは、@tone_targetと@durationに渡すだけ。
処理自体は、Game_Screen同様updateメソッドの中で行われているからだ。
ピクチャの消去eraseメソッドでは@nameを空にする。これは、のちに解説するSprite_Pictureクラスでの処理に影響する。具体的に言うと、nameが空の場合はピクチャを非表示にする処理を行っている。


さて本番。updateメソッドである。

どこかで見たような計算式が並んでいる。
これはGame_Screenクラスと同じだ。
なので式についての説明は簡単に。

def update
  if @duration >= 1
    d = @duration
    @x = (@x * (d - 1) + @target_x) / d
    @y = (@y * (d - 1) + @target_y) / d
    @zoom_x = (@zoom_x * (d - 1) + @target_zoom_x) / d
    @zoom_y = (@zoom_y * (d - 1) + @target_zoom_y) / d
    @opacity = (@opacity * (d - 1) + @target_opacity) / d
    @duration -= 1
  end
  if @tone_duration >= 1
    d = @tone_duration
    @tone.red = (@tone.red * (d - 1) + @tone_target.red) / d
    @tone.green = (@tone.green * (d - 1) + @tone_target.green) / d
    @tone.blue = (@tone.blue * (d - 1) + @tone_target.blue) / d
    @tone.gray = (@tone.gray * (d - 1) + @tone_target.gray) / d
    @tone_duration -= 1
  end
  if @rotate_speed != 0
    @angle += @rotate_speed / 2.0
    while @angle < 0
      @angle += 360
    end
    @angle %= 360
  end
end

@durationは移動にかける時間。これが1以上の場合ピクチャを移動する。
「移動」とはいってもイベントコマンドでは拡大率や不透明ども変更できる。それぞれ@x、@y、@zoom_x、@zoom_y、@opacityを@duration分のフレーム数をかけて変更する。合成方法@blend_typeのみ、moveメソッド内ですでに変更されているため、即時切り替わる点に注意。
@tone_durationが1以上の場合は色調の変更。これについてはGame_Screenクラスと同じ動きだ。
最後に、@rotate_speedが0でない場合は回転を行う。
@angleに毎フレーム@rotate_speedの半分を加算していく。ちなみに@rotate_speedは-90〜90。
さて、もし@angleが負の数になった場合、正の数になるまで360を加算していくループ、その後360で割った余りを求めている。のだが。
この操作にあまり意味はない。正の数にしなくても0以上360未満でなくても表示される。
VXでもここは変更されていないが……いったい何故だろう。


ということでGame_Pictureクラス終了。
次はかなり面倒なGame_Battleクラスにいよいよ突入だ。
セクションも3つ使うほどの大きなクラスなので、長丁場になりそう。
掲載は……来月かなあ(笑)


タグ:[Ruby] [RGSS] [プリセットを読み解く] [Game_Picture]

| 2011.07.13 Wednesday 22:22 | comments(0) | trackbacks(0) |

[ - ] スポンサーサイト

| 2018.05.23 Wednesday 22:22 | - | - |

コメント

コメントする






この記事のトラックバックURL

トラックバック

このページの先頭へ▲

Twitter

WebClap

Blogram

ブログランキングならblogram

calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< October 2019 >>

categories

archives

Amazon

selected entries

recent comment

recent trackback

recent ranking

links

search this site.

sponsored links

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM