独学ツクールブログ

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

<< RGSS奮闘記68:プリセットを読み解く16(Game_Screenクラスその1) | main | べっ、別に(ry >>

[ - ] スポンサーサイト

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

| 2018.05.23 Wednesday | - | - |

[ RGSS奮闘記 ] RGSS奮闘記69:プリセットを読み解く17(Game_Screenクラスその2)

〜前回のあらすじ〜
変数に値を渡すだけの簡単なお仕事です

前回に引き続きGame_Screenクラス。


def update
  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 @flash_duration >= 1
    d = @flash_duration
    @flash_color.alpha = @flash_color.alpha * (d - 1) / d
    @flash_duration -= 1
  end
  if @shake_duration >= 1 or @shake != 0
    delta = (@shake_power * @shake_speed * @shake_direction) / 10.0
    if @shake_duration <= 1 and @shake * (@shake + delta) < 0
      @shake = 0
    else
      @shake += delta
    end
    if @shake > @shake_power * 2
      @shake_direction = -1
    end
    if @shake < -@shake_power * 2
      @shake_direction = 1
    end
    if @shake_duration >= 1
      @shake_duration -= 1
    end
  end
  if @weather_duration >= 1
    d = @weather_duration
    @weather_max = (@weather_max * (d - 1) + @weather_max_target) / d
    @weather_duration -= 1
    if @weather_duration == 0
      @weather_type = @weather_type_target
    end
  end
  if $game_temp.in_battle
    for i in 51..100
      @pictures[i].update
    end
  else
    for i in 1..50
      @pictures[i].update
    end
  end
end

まず、@tone_durationが1以上の場合は「色調変更」。
RGBとグレースケールの現在の値から@tone_targetの値まで@tone_durationフレームかけて変更する。
計算式が少々入り組んでいるので解説。
@tone.red(以下R)と@tone_target.red(以下r)の差は単純に「r - R」で表される。
dフレームかけて色調変更するので、1フレームあたりの変更値は「(r - R)/d」だ。
これをRに毎フレーム加算していくわけだから、「R + (r - R)/d」となる。
Rを括弧の中に入れ「(Rd + r - R)/d」。
括弧の中でRでくくり「(R(d - 1) + r)/d」。
ということで「(@tone.red * (d - 1) + @tone_target.red) / d」の式が導き出される。
red、green、blue、grayのすべてについて計算を行ったあと@tone_durationを1減らして終了。
あとは、このupdateメソッドが毎フレーム実行されることによって色調変更が行われる。

続いて@flash_durationが1以上の場合は「フラッシュ」。
Colorクラスの変数alphaは不透明度を示す。イベントコマンド上では「強さ」として設定している部分だ。
updateメソッドが実行された時点でまずイベントコマンドに設定された不透明度と色で画面が覆われる。ここにはViewportクラスがかかわってくるが、それはまた後日。
@flash_color.alphaは毎フレーム「1/d」ずつ減少させているので(「* (d - 1) / d)」の部分)、画面を覆う塗りつぶしは@flash_durationフレームかけて透明になっていく。

次は@shake_durationが1以上もしくは@shakeが0でないの場合の「シェイク」。
ちなみに@shakeはこの節の中で設定される変数で、まあ「揺れっぷり」と思えばいいだろう。この値はSpriteset_Mapクラスで参照され、マップの表示位置をずらすことでシェイクを実装している。
まずはdeltaを算出。なぜデルタなのかはわからない。
強さ、早さ、方向(初期値は1)を掛け合わせ10.0で割る。
@shake_durationが1以下、かつ@shake * (@shake + delta)が0未満の場合は@shakeを0に。これはイベントコマンドで設定した時間だけのシェイクが終了したときの処理だ。
上記条件を満たさない場合、@shakeにdeltaを加算する。前述したとおり、これによってマップタイルの表示位置がdelta分だけ移動し、画面が揺れている効果を表現する。
続いて、@shakeが@shake_powerの2倍より大きい場合。これはイベントコマンドで設定した「強さ」の2倍に相当するピクセル数だけ横にずれたときという意味になる。このとき@shake_directionを-1に、つまり揺れ方向を逆転させる。
同様に、@shakeが@shake_powerの-2倍未満の場合には@shake_directionを1にする。
最後に、@shake_durationが1以上なら1減算して処理終了。
まとめると、このメソッドでは@shakeの値がdeltaずつ増減していき、それに伴いSpriteset_Mapクラスでマップタイルの表示位置が移動するというわけである。

そして@weather_durationが1以上の場合「天候の設定」。
といっても中の処理は「色調変更」と同じような計算だ。なので詳細は割愛。

さて、最後にピクチャを更新する。
戦闘中は51から100番を、そうでない場合1から50番を更新。


以上がGame_Screenクラスである。
直接的に動作を行うクラスではないので少しわかりにくいかもしれないが、全体的な動作にかかわっているのでかなり重要なクラスだということは分かってもらえると思う。

次回はGame_Pictureクラス。
ツクールXPのあらゆる挙動にかかわる重要なクラスである。
とはいえこのクラス内に限ればややこしい処理はないので、なるべく早く記事にする予定。


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

| 2011.06.07 Tuesday 21:59 | comments(0) | trackbacks(0) |

[ - ] スポンサーサイト

| 2018.05.23 Wednesday 21:59 | - | - |

コメント

コメントする






この記事のトラックバック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