パラパラ文字列表示(吹き出し)
1999.10.18

ゲームの会話のシーンで、漫画にある吹き出しのような会話(文字列)の表示を実現します。最初は、単純な機能を作り、少しずつ機能を追加してゆきます。
なお、プログラムは以下に述べる条件で開発します。

1.画面は(横)640×(縦)480×16(カラーモード)
2.吹き出しに表示する文章は、倍角で76文字を最大とする。
3.吹き出しには、1行を倍角19文字とし、4行で表示する。

☆単純な表示

例えば、以下の文章を表示する吹き出しに収まるよう表示してみます。

”ゲームの会話のシーンで、漫画にある吹き出しのような会話の表示を実現します。最初は、単純な機能を作り、少しずつ機能を追加してゆきます。


単純に考えると、文章の先頭から倍角19文字毎に区切り、各区切りで行を変えて表示する案が思いつきます。

MOJI$ = "ゲームの会話のシーンで、漫画にある吹き出しのような会話の表示を実現します。最初は、単純な機能を作り、少しずつ機能を追加してゆきます。"
    CH=G@SETUP(640,480,16,1)
    G@CHRCLEAR(CH)
    LINE = 0
    LOOP
      OUT_MOJI$ = MID(MOJI$,LINE*38+1,38)
      IF OUT_MOJI$ == "" THEN
        BREAK
      ENDIF
      G@PRINT( CH , 0 , LINE*32 , OUT_MOJI$)
      LINE = LINE +1
    ENDLOOP
    G@FLIP()
    LOOP;S@WAIT();ENDLOOP

LINE変数は行数(便宜上、1行目を0とし、2行目を1となるようにします)を格納し、LOOP関数の1回のループで1行を処理しています。まずはMID関数を使い、1行文の文字列を切り出しますが、MID関数は半角文字用の機能なので、全角19文字は半角換算で38文字として処理する事を注意してください。後は、G@PRINT関数を使いLINE変数の示す行に切り出した文字を表示します。切り出す文字がない場合にはMID関数はヌルを返すので、これをタイミングに処理を終了します。

☆1文字単位で色を変える

演出で注目してほしい単語を強調するために文字に色を付ける事が考えられます。特定の単語の色を変えるにはどのようなプログラムが考えますか?私は色を変えたい単語の前後に、色の変更を指示する制御コードを入れる方法を考えました。例えば標準の文字色を黒とするとした場合、赤色に変更したい単語の直前に赤色に変更するコード「@C1」を入れ、単語の最後に黒色に変更するコード「@C0」を入れることにします。

「単純な表示」のプログラムでは行単位に文字列を取り扱っていましたが、今回は制御コードを意識しなければならないので、文字単位に文字列を扱うことにします。
まずは、「単純な表示」のプログラムを、文字単位に処理を行うように変更します。
今回は半角3文字で制御コードを構成する事にします。1文字目に「@」がくれば制御コードを示し、2文字目が「C」であれば、色を変更する制御を行うことを示します。2文字目の存在ですが、文字色の変更以外の要求が将来出てきた場合を想定し、処理の種類を示すものとします。先頭2文字が「@C」であれば、3文字目は色の番号を示すことにします。3文字目が「0」であれば黒色、「1」であれば赤色とします。

以下にプログラムを載せますが、処理を簡素化するために、倍角文字の表示のみとし、半角文字の表示はサポートしないこととします。

MOJI$ = "ゲームの会話のシーンで、@C1漫画@C0にある吹き出しのような会話の表示を実現します。最初は、単純な機能を作り、少しずつ@C1機能@C0を追加してゆきます。"
CH=G@SETUP(640,480,16,1)
G@CHRCLEAR(CH)
LINE = 0
CUR = 0
MOJI_CUR = 1
LOOP
  OUT_MOJI$ = MID( MOJI$ , MOJI_CUR , 2 )
  IF OUT_MOJI$ == "" THEN
    BREAK
  ENDIF
  IF OUT_MOJI$ == "@C" THEN
    CNUM = ATOI(MID( MOJI$ , MOJI_CUR+2 , 1 ))
    SWITCH( CNUM )
      CASE 0:
        G@COLOR( 255,255,255 )
        BREAK 
      CASE 1:
        G@COLOR( 255,0,0 )
        BREAK 
    ENDSWITCH
    MOJI_CUR = MOJI_CUR + 3
  ELSE
    G@PRINT( CH , CUR*27 , LINE*27 , OUT_MOJI$)
    CUR = CUR + 1
    IF CUR >= 19 THEN
      CUR = 0
      LINE = LINE +1
    ENDIF
    MOJI_CUR = MOJI_CUR + 2
  ENDIF
ENDLOOP
G@FLIP()
LOOP;S@WAIT();ENDLOOP



LINE変数は表示する行数を、CUR変数は表示するカラム、MOJI_CUR変数は文字列の検索カラムです。LOOPは、文字列の先頭から末尾に向かって半角文字単位に検索を進めるループです。
処理は簡単で、MOJI_CUR変数の示す検索カラムから2文字が制御コード「@C」であれば、3文字目の数字の示す文字色にG@COLOR関数を使い変更します。最後に制御コードの半角3文字を処理を完了したので、文字列の検索かラムであるMOJI_CUR変数に3を加えています。
MOJI_CUR変数の示す検索カラムから2文字が制御コード以外であれば、文字(倍角)であると判断しG@PRINT関数で表示します。最後に倍角文字(半角2文字相当)の処理を完了したので、文字列の検索かラムであるMOJI_CUR変数に2を加えています。

制御コードを工夫すれば、動的にフォントを変えたり、表示する速度を変えたり、効果音を鳴らしたりなど、面白い効果を実現できるでしょう。