独学ツクールブログ

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

<< インターネットエ糞プローラ | main | RGSS奮闘記67:テロップを流すその2 >>

[ - ] スポンサーサイト

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

| 2018.05.23 Wednesday | - | - |

[ RGSS奮闘記 ] RGSS奮闘記66:テロップを流すその1

テロップというのはつまりスタッフロール的なあれであり「文字列がスクロールしていく」あれである。
ようやく形ができたのでついに公開。


まずは定数を定義する。
必要なのは「テロップ表示開始のスイッチ番号」「テロップ速度」「フェイドイン・アウトの幅」「テロップ中も動けるかどうかのフラグ」といったところだろう。
module IK_Telop_Message
  TELOP_SWITCH_ID = 10
  TELOP_SPEED = 4
  OPACIFY_LINES = 5
  FREEZE = true
end


テロップのクラスを定義。
Telopクラスのインスタンスを生成する際には、表示される文章を引数にとることにしよう。

def initialize(text)
  @sprites = Array.new(text.size - 1) { |i|
    sprite = Sprite.new
    sprite.bitmap = Bitmap.new(640, 32)
    sprite.bitmap.draw_text(0, 0, 640, 32, text[i], 1)
    sprite.y = 480 + i * 32
    sprite.opacity = 0
    sprite
  }
  @height = (15 - IK_Telop_Message::OPACIFY_LINES) / 2 * 32
end

ここでは、Array#newにブロックを渡すことでスプライトの生成をまとめて行っている。
newメソッドの引数は配列の大きさなのでtextの大きさを渡す。
ブロックパラメータのiには配列のインデックスが入っていくが、今はスルー。まずはスプライトを準備する。
ブロックの中はRGSSにおける比較的オーソドックスなスプライト生成の手順だ。
まずSpriteクラスのインスタンスを生成。
ビットマップを設定し、draw_textメソッドで文字列を描画。ここでiを使うことで、textに入っている文章を一行ずつ処理している。
y方向の初期位置は下方の画面外にする。ここでもiを使用し、画面外で各行を並べている。
フェイドイン・アウトの処理を入れるために、不透明度の初期値は0にする。
最後にspriteだけ書いてあるのは、「ブロックの戻り値はブロック内で最後に評価された式の値」というルールがあるためだ。これがないと、最後の行の戻り値「0」だけが配列に格納されるという間抜けな事態になるので、設定を済ませたspriteを返すためにここで記述している。
@heightは画面上下でフェイドイン・アウトを行う幅だ。計算式の意図については割愛。

それからupdateメソッド。
ここでスプライトをスクロールさせるわけだ。
def update
  until @sprites.empty?
    @sprites.each {|line|
      line.y -= IK_Telop_Message::TELOP_SPEED
      case line.y
      when -32..0
        line.dispose
        @sprites.delete(line)
      when (1..@height)
        line.opacity -= 255.0 / @height * IK_Telop_Message::TELOP_SPEED
      when (480 - @height..480)
        line.opacity += 255.0 / @height * IK_Telop_Message::TELOP_SPEED
      when 200..280
      end
    }
    break unless IK_Telop_Message::FREEZE
    Graphics.update
  end
  return @sprites.empty?
end

untilは「〜でない間繰り返す」という制御構文。ここでは@spritesが空でない限り処理を行う。
eachメソッドで配列@spritesに入っているスプライト(テロップの一行ごと)をまとめて処理。
まずはy座標を設定した値だけ上に移動。
この時、もしy座標が0未満つまり画面外にあれば、スプライトを破棄し、配列からそのスプライトを削除する。
1から@heightのとき、つまり中央の表示行数から上にある場合は不透明度を下げ、480-@heightから480つまり中央から下にある場合は不透明度を上げる。これで疑似的にフェイドを実現している。
さて、ブロックが終わりすべてのスプライトが移動したあと、「テロップ中は動けないようにするかどうかのフラグ」がfalseならばbreakでこのループを抜けさせる。trueの場合は次の行のGraphics.updateが実行され、@spritesが空になるまでループが継続。
このupdateメソッドはScene_Mapから呼ばれるので、フラグオンならテロップ終了までループ、オフなら一回のupdateで再びScene_Mapに処理が戻るということになる。
最後に、@spritesが空であるかどうかを戻り値にして終了。

そして、全スプライトを解放するdisposeメソッド。
ここまで説明してきた内容には不要な処理だが、あとで活躍してもらう。
def dispose
  @sprites.each {|sprite|
     sprite.dispose
  }
end

eachで回しているだけなので説明は割愛。

次回、InterpreterクラスとScene_Mapクラスを改造する。


タグ:[Ruby] [RGSS] [素材] [テロップ]

| 2011.06.04 Saturday 22:05 | comments(0) | trackbacks(0) |

[ - ] スポンサーサイト

| 2018.05.23 Wednesday 22:05 | - | - |

コメント

コメントする






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