Archive for the ‘流動指向ゲームエンジン『Fooo』’ Category

合成モードを指定する

前回はフェードインを実装した。
白い幕がうっすらと消えていき「霞の中から景色が現れる」ような演出だったが
今回はそれを「まばゆい光の中から景色が現れる」カンジにしてみよう。

なんだか難しいことを言ってるかんじだが…
まったく難しくはない。

『合成モード』を変更するだけだ。

合成モードとは画像をどのように画面に合成するかという指定である。
画像処理ソフトとして有名なAdobe Photoshopのレイヤーのブレンドモードとほぼ同じものだ。

合成モードを指定するには blend パラメータを使う。
合成モードの指定はイメージデーカーだけでなく、
何かを表示する機能を持つ全てのデーカーに対して行うことができる。


CreateColor(name="幕", color=white, w=1280, h=720, blend="Add");

blend パラメータには合成モードの名前を指定する。
いままでイメージデーカーを作る際に特に合成モードの指定などはしていなかったが
自動的に通常合成(Normal)で合成が行われていた。

通常合成は、画像をそのままの見た目で画面に合成する合成モードだ。
他に加算合成、乗算合成などなど様々な合成モードがある。
FoooではPhoshopのレイヤーのブレンドモードに相当する全てのモードをサポートしている。
いくつか紹介しておこう。

Blend_Normal Blend_Add Blend_Sub
Normal
(通常)
Add
(加算)
Sub
(減算)
Blend_Multiply Blend_Screen Blend_Overlay
Multiply
(乗算)
Screen
(スクリーン)
Overlay
(オーバーレイ)

このように同じ画像でも合成モードを変えると印象ががらっと変わる。
幕をまばゆい光のようにするには、合成モードを”Add”(加算合成)に変更すれば良さそうだ。
それでは組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);

  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0
    , outline_shape="Fade", outline_color=RGBA(0,0,0,64), outline_thick=8);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65
    , outline_shape="Vivide", outline_color=white, outline_thick=8);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%
    , outline_shape="Vivide", outline_color=black, outline_thick=8);

  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=585, y=65, shape="Dumpling", w=300, h=185, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=470, y=520, shape="Rock", w=220, h=125, tail=160);

  CreateColor(name="幕", color=white, w=1280, h=720, blend="Add");

  Enter(to="背景");
  Enter(to="コマ1");
  Enter(to="幕");
  wait 500;

  Opaque(to="幕", time=1000, alpha=0%, step="DecSin");
  WaitDecor();

  Enter(to="コマ2");
  Move(to="コマ2", time=800, x=780, step="Dec3");
  WaitDecor();

  Enter(to="台詞1", effect="Bound");
  WaitDecor();

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%, step="AccSig");
  WaitDecor();

  Enter(to="台詞2", effect="Expand");
  WaitDecor();
}
YouTube Preview Image

幕がまばゆい光のようになった!
背景の絵がテキトーなのでちょっとわかりにくいけど…


フェードインする

画面がぱっと現れるのは味気ないので
白い画面からフェードインするようにしてみよう。
どのようにすればよいだろうか。
ここまで説明してきた内容を把握していれば簡単だろう。

画面サイズの真っ白な画像を用意し、
イメージデーカーを作成して表示させ、
Opaque命令でだんだん透明にするだけでいい。

しかしたかだかフェードインさせるためだけに
画像を用意しなくちゃいけないのは、いささか大きすぎる手間だ。
もうちょっと楽をしたい。

カラーデーカー

そんな時は『カラーデーカー』を使う。
カラーデーカーは、指定色で塗りつぶされた四角形を表示するデーカーだ。
フェードイン、フェードアウトなどの演出などを作りたい場合や
背景が単色でかまわない場合などに便利なデーカーである。

またプログラムの実行速度の面において、
イメージデーカーよりもずっと高速に動作するという特徴がある。
イメージデーカーと違って画像データを持たないからだ。
そういった理由から、使える場面ではできるだけカラーデーカーを使うことが望ましい。
実際カラーデーカーは非常によく使うデーカーの1つである。

CreateColor命令

カラーデーカーはCreateColor命令で作成する。


CreateColor(name="幕", color=white, w=1280, h=720);

color パラメータには塗りつぶし色を指定する。
w パラメータには横幅をピクセル単位で指定する。
h パラメータには縦幅をピクセル単位で指定する。

では組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);

  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0
    , outline_shape="Fade", outline_color=RGBA(0,0,0,64), outline_thick=8);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65
    , outline_shape="Vivide", outline_color=white, outline_thick=8);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%
    , outline_shape="Vivide", outline_color=black, outline_thick=8);

  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=585, y=65, shape="Dumpling", w=300, h=185, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=470, y=520, shape="Rock", w=220, h=125, tail=160);

  CreateColor(name="幕", color=white, w=1280, h=720);

  Enter(to="背景");
  Enter(to="コマ1");
  Enter(to="幕");
  wait 500;

  Opaque(to="幕", time=500, alpha=0%);
  WaitDecor();

  Enter(to="コマ2");
  Move(to="コマ2", time=800, x=780, step="Dec3");
  WaitDecor();

  Enter(to="台詞1", effect="Bound");
  WaitDecor();

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%, step="AccSig");
  WaitDecor();

  Enter(to="台詞2", effect="Expand");
  WaitDecor();
}
YouTube Preview Image

フェードインするようになった!


適当に待つ

演出にだいぶ手を入れたので、ここいらで演出のタイミングを調整しておこう。
まずはコマの表示速度を調整しよう。
やることは各命令のtimeパラメータを修正していくだけだ。

しかしこの時注意すべきことがある。
直後のwaitの値も同じように修正しなくてはいけないのだ。
そうしないと動きの後に意図しない変な間が入ってしまったりする。
1つの動きを直すのに2箇所も直さないといけないなんて…

めんどくさい!

WaitDecor命令

こんな時はWaitDecor命令を使う。
WaitDecor命令は、指定したデーカーの動作の完了を待つ命令だ。
WaitDecor命令を使うと、どのくらい待つかを細かく考えずに済む。

動きの時間を修正した場合に、待ち時間をいちいち書き換える必要もなくなるといった寸法だ。
また文章や吹きだしなどは、表示の完了までにかかる時間がわかりにくいので
そういった場合にもWaitDecor命令が便利だ。


Opaque(to="コマ1", time=1000, alpha=100%, step="AccSin");
WaitDecor(to="*");

toパラメータには待つ対象となるデーカーの名前を指定する。
上のサンプルでは対象に “*” を指定しているが、ちょっと変なかんじだ。
“*” は名前ではなく特殊な意味を持つ表記で『全てのデーカー』を表している。
つまりこのように書くと、対象がどのデーカーかすらも考える必要がなくなるのだ。

WaitDecor命令のtoパラメータのデフォルト値(省略した場合に使われる値)は “*” なので、
もっと単純に…


Opaque(to="コマ1", time=1000, alpha=100%, step="AccSin");
WaitDecor();

と書いてもいい。

ちなみにWaitDecor命令は対象のデーカーに対する命令ではなく、
スクリプトを実行しているエンジンに対する命令なので
即座には終わらず、命令の実行が完了してから次に進む。

では組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);

  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0, alpha=0%
    , outline_shape="Fade", outline_color=RGBA(0,0,0,64), outline_thick=8);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65
    , outline_shape="Vivide", outline_color=white, outline_thick=8);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%
    , outline_shape="Vivide", outline_color=black, outline_thick=8);

  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=585, y=65, shape="Dumpling", w=300, h=185, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=470, y=520, shape="Rock", w=220, h=125, tail=160);

  Enter(to="背景");
  wait 1000;

  Enter(to="コマ1");
  Opaque(to="コマ1", time=500, alpha=100%, step="AccSin");
  WaitDecor();

  Enter(to="コマ2");
  Move(to="コマ2", time=800, x=780, step="Dec3");
  WaitDecor();

  Enter(to="台詞1", effect="Bound");
  WaitDecor();

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%, step="AccSig");
  WaitDecor();

  Enter(to="台詞2", effect="Expand");
  WaitDecor();
}
YouTube Preview Image

スッキリ~


速度変化をつける

今度はコマの動きを工夫してみよう。
とはいえコマの動き方を大きく変えようという話ではない。
コマの動きに『速度変化』をつけようというお話だ。

今までコマが移動したり拡大したりしていたが、その動きその速度は常に一定だった。
よくよく考えてみると、現実において一定の速度で動くものというものはあまり目にしない。
一定速度で動くなんて自然ではない。不自然だ。
そのあたりが関係しているのかはよくわからないが…

確信を持ってこれだけは言える。

速度変化をつけるとキモチイイ

キモチイイ!
大事!

論より証拠。
実際に速度変化をつけてみよう。
動きに速度変化をつけるには step パラメータを使う。


Zoom(to="コマ3", time=1000, sx=100%, sy=100%, step="AccSig");

step パラメータは time パラメータをとる全ての命令で使うことができる。
step パラメータには速度変化の名前を指定する。
いくつか紹介しておこう。

Linear Step_Linear
AccSin Step_AccSin
Acc2 Step_Acc2
Acc3 Step_Acc3
DecSin Step_DecSin
Dec2 Step_Dec2
Dec3 Step_Dec3
AccSig Step_AccSig

では実際に組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);

  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0, alpha=0%
    , outline_shape="Fade", outline_color=RGBA(0,0,0,64), outline_thick=8);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65
    , outline_shape="Vivide", outline_color=white, outline_thick=8);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%
    , outline_shape="Vivide", outline_color=black, outline_thick=8);

  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=585, y=65, shape="Dumpling", w=300, h=185, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=470, y=520, shape="Rock", w=220, h=125, tail=160);

  Enter(to="背景");
  wait 1000;

  Enter(to="コマ1");
  Opaque(to="コマ1", time=1000, alpha=100%, step="AccSin");
  wait 1000;

  Enter(to="コマ2");
  Move(to="コマ2", time=1000, x=780, step="Dec3");
  wait 1000;

  Enter(to="台詞1", effect="Bound");
  wait 2000;

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%, step="AccSig");
  wait 1000;

  Enter(to="台詞2", effect="Expand");
  wait 1000;
}
YouTube Preview Image

キモチイイ!


コマの枠を指定する

『漫画のコマ』に相当するフレームデーカーには、
画像に自動的に「枠」をつけてくれるという機能がある。
今まで画像の周りにぼやーっと黒い枠がついていたと思うが、ソレだ。

けれどもただ単に枠がつくだけにすぎないので…
「だったら最初から画像自体に枠をつけてしまえばいいんじゃないの?」
「わざわざフレームデーカーなんて使う必要ないんじゃないの?」
「イメージデーカーで十分なんじゃないの?」
と思うかもしれない。

実際のところ画像自体に枠をつけてしまっても良いのだが
フレームデーカーを使って枠をつけることによる利点がいくつかある。
画像からコマを切り出す作業をする際に、枠のことをいちいち考えなくてよくなることも大きいが
最大の利点は、枠の形をスクリプトで調整することができるという点だ。

枠を指定するにはCreateFrame命令の
outline_shape、outline_color、outline_thickパラメータを使う。


CreateFrame(name="コマ2", image="コマ2.png"
  , x="OutRight", y=65
  , outline_shape="Vivide", outline_color=white, outline_thick=8);

outline_shape パラメータには枠の種類の名前を指定する。
“Fade”,”Vivide”,”Shadow”,”Emboss”などいくつか種類がある。
outline_color パラメータには枠の色を指定する。
outline_thick パラメータには枠の太さを指定する。

では組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);

  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0, alpha=0%
    , outline_shape="Fade", outline_color=RGBA(0,0,0,64), outline_thick=8);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65
    , outline_shape="Vivide", outline_color=white, outline_thick=8);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%
    , outline_shape="Vivide", outline_color=black, outline_thick=8);

  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=585, y=65, shape="Dumpling", w=300, h=185, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=470, y=520, shape="Rock", w=220, h=125, tail=160);

  Enter(to="背景");
  wait 1000;

  Enter(to="コマ1");
  Opaque(to="コマ1", time=1000, alpha=100%);
  wait 1000;

  Enter(to="コマ2");
  Move(to="コマ2", time=1000, x=780);
  wait 1000;

  Enter(to="台詞1", effect="Bound");
  wait 2000;

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%);
  wait 1000;

  Enter(to="台詞2", effect="Expand");
  wait 1000;
}
YouTube Preview Image

枠を変えたことでまたガラッと雰囲気が変わった!


吹きだしに動きをつける

漫画において、吹きだしの「形」は台詞の意味を視覚的に表す上で非常に重要な要素だ。
しかし『動く漫画』においては、ソレと双璧をなす重要な要素がもう1つある。
それは…

吹きだしの「出し方」だ。

普通の漫画と違い『動く漫画』には実際に動きがある。
それはコマや文章だけの話ではない。
吹きだしにだって動きをつけられる。
吹きだしの「出し方」を工夫すれば、さらに表現の幅を広げられるのだ。

吹きだしの出し方はEnter命令のeffectパラメータで指定することができる。
Opaque、Zoomなどの命令を使って吹きだしに直接演出をつけても良いのだが、
effectパラメータを使うととても簡単だ。


Enter(to="台詞1", effect="Bound");

effectパラメータには表示の仕方を名前で指定する。
いくつか紹介しよう。

Enter_Fade Enter_Tap Enter_Expand Enter_Bound Enter_Shock
Fade Tap Expand Bound Shock

では組み込んで見よう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);
  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0, alpha=0%);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%);
  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=585, y=65, shape="Dumpling", w=300, h=185, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=470, y=520, shape="Rock", w=220, h=125, tail=160);

  Enter(to="背景");
  wait 1000;

  Enter(to="コマ1");
  Opaque(to="コマ1", time=1000, alpha=100%);
  wait 1000;

  Enter(to="コマ2");
  Move(to="コマ2", time=1000, x=780);
  wait 1000;

  Enter(to="台詞1", effect="Bound");
  wait 2000;

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%);
  wait 1000;

  Enter(to="台詞2", effect="Expand");
  wait 1000;
}
YouTube Preview Image

吹きだしの動きには台詞の意味を視覚的に表す効果の他に『視線誘導』の効果もある。
吹きだしが出てくる演出が視線を引きつけるため
「台詞の出だし」が目に入りやすくなり、結果として台詞を読みやすくするのである。


吹きだしの形を指定する

今度は吹きだしに手を加えよう。
漫画において吹きだしは台詞を入れる単なる枠ではない。

吹きだしは台詞の意味を視覚的に表す記号である。

その上で特に重要なのが、吹きだしの『形』だ。
吹きだしの形を使い分けることで、より豊かな表現が可能になるのだ。

『動く漫画』においても、吹きだしの形はやはり重要である。
バルーンデーカーは様々な形状の吹きだしを作り出す高度な機能を備えている。
吹きだしをどんな形状にするかは、CreateBalloon命令のshapeパラメータで指定できる。


  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=588, y=75, shape="Dumpling", tail=-30);

shapeパラメータには吹き出しの形状の名前を指定する。
用意されている形状はざっと90種類。
いくつか例を挙げておこう。

Balloon_Dumpling Balloon_Potato Balloon_Rock Balloon_PolyRect Balloon_Bale
Dumpling Potato Rock PolyRect Bale
Balloon_FlickerRect Balloon_FatStar Balloon_Punch Balloon_Burst Balloon_Gas
FlickerRect FatStar Punch Burst Gas

吹きだしのサイズは台詞が収まるように自動的に調整されるが、
形と文章量の相性によっては吹きだしの大きさがイマイチになる場合もある。
そんな時はw, hパラメータで吹きだしのサイズを直接指定する。


  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=588, y=75, shape="Dumpling", w=300, h=185, tail=-30);

w パラメータには吹きだしの横幅をピクセル単位で指定する。
h パラメータには吹きだしの縦幅をピクセル単位で指定する。
ではさっそく組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);
  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0, alpha=0%);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%);
  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=585, y=65, shape="Dumpling", w=300, h=185, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=470, y=520, shape="Rock", w=220, h=125, tail=160);

  Enter(to="背景");
  wait 1000;

  Enter(to="コマ1");
  Opaque(to="コマ1", time=1000, alpha=100%);
  wait 1000;

  Enter(to="コマ2");
  Move(to="コマ2", time=1000, x=780);
  wait 1000;

  Enter(to="台詞1");
  wait 1500;

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%);
  wait 1000;

  Enter(to="台詞2");
  wait 1000;
}
YouTube Preview Image

グッと表情が豊かになった!


文章に緩急をつける

漫画の吹きだしの中の文章は、ただの文章ではなく台詞である。
何をあたり前のことを…と思うかもしれないが、改めてそう認識することが重要なのだ。

人が言葉を発する時、一定の速度で淡々と喋ることはまずない。
それが台詞であっても同様だ。

台詞には必ず緩急がある。

しかしアドベンチャーゲームのメッセージは
例えそれが台詞であったとしても一定速度で表示することが多い。
アドベンチャーゲームの多くが小説の延長線上にあるせいかもしれないが…
ざっと見の読みやすさを重視している部分や、伝統的にそうなってる部分もある。

しかしFoooの実現する『動く漫画』の吹きだしは
感覚的に小説のソレより人間の言葉に近い。
そのため一定速度で一様に文章を表示すると違和感が出る場合がある。
緩急があって然るべき、なのだ。

そこでFoooには文章に緩急をつけるための機能が用意されている。

WAITタグ


それにしても<WAIT time=800><BR>腹(はら)が減(へ)った

WAITタグは文章中に待ちを埋め込むタグだ。
timeで待ち時間をミリ秒単位で指定する。

しかしやはりタグを書くのは長ったらしい…
そこでもっと簡単に待ちを指定する方法が用意されている。

待ち文字


それにしても,...<BR>腹(はら)が減(へ)った

何やら . と , がちょこちょこっと書かれている。
これでさっきと同じように800ミリ秒待つという意味になる。
文中において、ピリオド . は100ミリ秒の待ち、カンマ , は500ミリ秒の待ちと解釈されるのだ。
, が1個、. が3個で合せて800ミリ秒の待ちといった具合だ。

最初の”Hello, world”のスクリプトで , が表示されなかったのを覚えているだろうか。
なぜ , が表示されないのか説明を省いたが…そう…
, が表示されなかったのは、待ち文字として解釈されてしまっていたからなのだ。

このような特殊な意味として解釈される文字は < > ( ) などいろいろあるが
特殊な意味として解釈されたくない場合は、文字の前に&記号を書く。


method Main()
{
   CreateText(name="Text", text="hello&, world");
   Enter(to="Text");
}

これで”hello, world”と表示されるようになる。

では組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);
  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0, alpha=0%);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%);
  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=588, y=75, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=485, y=525, tail=160);

  Enter(to="背景");
  wait 1000;

  Enter(to="コマ1");
  Opaque(to="コマ1", time=1000, alpha=100%);
  wait 1000;

  Enter(to="コマ2");
  Move(to="コマ2", time=1000, x=780);
  wait 1000;

  Enter(to="台詞1");
  wait 1500;

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%);
  wait 1000;

  Enter(to="台詞2");
  wait 1000;
}
YouTube Preview Image

台詞にちょっと間が入ったのがわかるだろうか。


文字の出方を指定する

文章の見た目はなんとなく整ったので、今度は文章の『文字の出方』を調整しよう。

今までの動作サンプルを見ればわかるように、
テキストデーカーやバルーンデーカーを作成し表示すると
自動的に文字が打印されるように1文字ずつ表示される。
この様な動作のことをFoooでは…

『タイピング』と呼んでいる。

一般的な呼び方なのかどうかは知らない(何
タイピングの仕方はFONTタグで指定することができる。


<FONT interval=100 speed=250 effect='Rise'>クククク…</FONT>

FONTタグで指定するというのはニアンス的にちょっと変な感じもあるのだが
実際のところ文字サイズなどの指定と一緒に行うことが多いので一緒にしている。

スタイル定義でも指定可能だ。


style つぶやき { interval=100, speed=250, effect="Rise" }

interval にはタイピングする時間間隔をミリ秒単位で指定する。
speed にはタイピング効果にかける時間をミリ秒単位で指定する。
effect にはタイピング効果の種類の名前を指定する。

上の説明にもあるようにタイピング時には
タイピング効果という特殊な演出をつけることができる。
タイピング効果には様々な種類が用意されている。
いくつか挙げておこう。

TypingEffect_Fade TypingEffect_Rise TypingEffect_Bang TypingEffect_OffCenter TypingEffect_Splash
Fade Rise Bang OffCenter Splash

それでは実際に組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);
  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0, alpha=0%);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%);
  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても<BR>腹(はら)が減(へ)った"
    , x=588, y=75, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=485, y=525, tail=160);

  Enter(to="背景");
  wait 1000;

  Enter(to="コマ1");
  Opaque(to="コマ1", time=1000, alpha=100%);
  wait 1000;

  Enter(to="コマ2");
  Move(to="コマ2", time=1000, x=780);
  wait 1000;

  Enter(to="台詞1");
  wait 1500;

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%);
  wait 1000;

  Enter(to="台詞2");
  wait 1000;
}

今回はタグでスタイルを指定してみた。
FONTタグの閉じタグを書いていないが、閉じる必要がない場合は省略できる。

よくよく見るとCreateBalloon命令のstyleパラメータでもスタイルを指定しており
スタイルの指定が重複してしまっている。
こういう場合どうなるのか。

スタイルの指定が複数ある場合、先に指定されたスタイルの指定内容に
後のスタイルの指定内容を付け加える形になる。
また同じ種類の指定があれば上書きされる。
スタイルは組み合わせて使うことが出来るのだ。

実行してみよう。

YouTube Preview Image

文字の出方を細かく調整することで、ぐっと臨場感が増すことがわかるだろう。


ルビを振る

タグについて説明したので、ついでにルビを振る方法についても説明しておこう。

ルビとは漢字の上や横に読み仮名を小さな文字で書くアレだ。
難しい単語の読みをわかりやすくるためや、
通常とはまったく異なった読み方をさせたい時などに主に使う。
・をルビにすることで文章を強調するなんて使い方もある。
少年漫画では、読者層を考慮して全ての漢字にルビを振っていることが多い。

単語にルビを振るにはRUBYタグを使う。


<RUBY text='さんま'>秋刀魚</RUBY>

これで”秋刀魚”に”さんま”とルビが振られる。
振り仮名にはひらがな、カタカナ、英数字、漢字を自由に使用できる。
振り仮名と単語の文字数は一緒でなくてもいい。

…しかしこの書きかたはなんとも大げさだ。
単語より前に振り仮名を書くというのも、ちょっと直感的ではない。

実はもっと簡単にルビを記述する方法がある。


(秋刀魚/さんま)

随分すっきりした。
文中において(~/~)という表記はルビの指定と解釈されRUBYタグと同様の効果がある。

さらにルビを振る対象が漢字だけで構成され、
見た目で対象範囲を特定できる場合はもっと簡単に記述できる。


秋刀魚(さんま)

超スッキリ!

ほとんどの場合、この書き方で事足りる。
実際に組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);
  CreateFrame(name="コマ1", image="コマ1.png"
    , x=440, y=0, alpha=0%);
  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%);
  CreateBalloon(name="台詞1"
    , style="普通", text="それにしても<BR>腹(はら)が減(へ)った"
    , x=588, y=75, tail=-30);
  CreateBalloon(name="台詞2"
    , style="小", text="クククク…"
    , x=485, y=525, tail=160);

  Enter(to="背景");
  wait 1000;

  Enter(to="コマ1");
  Opaque(to="コマ1", time=1000, alpha=100%);
  wait 1000;

  Enter(to="コマ2");
  Move(to="コマ2", time=1000, x=780);
  wait 1000;

  Enter(to="台詞1");
  wait 1500;

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%);
  wait 1000;

  Enter(to="台詞2");
  wait 1000;
}
YouTube Preview Image

修正点が少なすぎて拍子抜けしただろう。
このくらいルビは簡単に使用できるのだ。