STGのセリフの入れ方について質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
amgk
記事: 2
登録日時: 11年前
住所: 東京都

STGのセリフの入れ方について質問です

#1

投稿記事 by amgk » 11年前

初めて投稿します
まだ勉強し始めて2~3週間程度なので、的外れなこと言ってるかもしれません。(因みに、勉強したのは「苦しんで覚えるC言語」→「プログラミングの館」で、今は「龍神録プログラミングの館」な感じです。一応50章まで見ましたが、理解しているかどうかは、してるとは言い難いですけど……)

では、質問ですが。
龍神録の館でSTGの勉強をして、50章のプログラムを元にとりあえず形だけは作ってみようと思ったのですが、会話シーンの作り方が解りません
最終的にやりたい事は、
「一定の時間になる(雑魚戦が終わると)と主人公のセリフ開始」→「しゃべっているとボスが出てくる」→「ボスと会話する」→「会話の途中でボス戦BGMがなる」→「会話終了と共にボス戦開始」
というよくあるシチュです。この間、背景などは動きっぱなしでキャラの移動操作も受け付けます。
セリフの入れ方自体はこの館でもさらっと触れていますが、少し思っているのと違うので、こうやって質問しました。

自分で調べた感じでは、DXライブラリのここのページ、
http://homepage2.nifty.com/natupaji/DxL ... ogram.html
の項目20(または6)を使って、switchのcaseに従って立ち絵とか色々変える事ができるのなら便利かなあ、とは思っているのですが……。使い方は、上のプログラムをとりあえずif(count=>100)になったら開始という設定にしClearDrawScreen関数は消しておき、cppファイルにして、そのままGVファイルやmain関数のcase 100に繋ぎたした感じです。
実際に使ってみると、会話シーンになると、ウィンドウの左上のカウントが止まり、絵の描写や弾道計算など、会話以外の処理が会話の処理中、停止ししてしまいます。(また、この会話の処理が行われた後、カウントやfpsの表示の文字サイズが会話処理で設定した文字サイズに従うようになります。)

兎に角訊きたい事は、この会話処理をその他の処理と並行しながら行う為にはどうすればよいでしょうか? と言う事です。
というより、他の処理が停止してしまうのは何故でしょうか? 自分は一度処理を書けば後は流れで適当に処理し続けるものだと思ってたんですが……。
上記にも書いた通り、龍神縁プログラミングの館を参考にして学んでいるので、それに沿って教えてくれれば幸せです

あ、後、一般的(?)にはどういう風にすれば良いか、こういうやり方で正しいのかも教えてくれればうれしいです。
最後に編集したユーザー amgk on 2014年2月26日(水) 00:31 [ 編集 2 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: STGのセリフの入れ方について質問です

#2

投稿記事 by softya(ソフト屋) » 11年前

既に龍神録の作りが一般的では無いかも知れません。
ただ、「DXライブラリのここのページ、」の内容と龍神録の両方をちゃんと理解していれば、融合させることは可能です。
ご自身が書いている通り、理解が浅いのとサンプルに頼り過ぎな面があります。
じっくりと理解するところから始められたほうが良いでしょう。

10章辺りでもよいですが、まだ簡単な章でセリフ表示の挑戦してみてください。
あと、「DXライブラリのここのページ、」は完璧の全命令の動作とつながりを理解してから挑戦されると良いと思います。
わからない所は聞いて下さい。

※ 無闇に記入済みのページの変更や削除は禁止させて頂いております。
変更した場合は、変更理由は変更内容を記載するか、こんなかんじで変更前のものを残しておいて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
せんちゃ
記事: 50
登録日時: 14年前
住所: 江別市東野幌町
連絡を取る:

Re: STGのセリフの入れ方について質問です

#3

投稿記事 by せんちゃ » 11年前

龍神録がどのように会話シーンを作成しているかはわかりませんが、
よくアドベンチャーの実装などで見られる実装方法としては一つ一つの動作をコマンド化して処理させるドライバを作る方法です。

ものすごく昔に書いたコードですがこんな風にやっていました。

コード:

char CMD_BUF[] = {
    "<open>"
        "<PL_ON><PL_255><PL_Serif>"
        "<WAIT>"
        "<PL_127>"
        "<Serif++>"
        "<BS_ON><BS_255><BS_Serif>"
        "<WAIT>"
        "<PL_127>"
        "<BS_255><Serif++>"
        "<WAIT>"
        "<BS_127>"
        "<PL_255><PL_Serif><PLG_1><Serif++>"
        "<WAIT>"
        "<PL_127>"
        "<BS_255><BSG_1><BS_Serif><Serif++>"
        "<WAIT>"
        "<Serif++>"
        "<WAIT>"
        "<BS_127>"
        "<PL_255><PLG_0><PL_Serif><Serif++>"
        "<WAIT>"
        "<PL_127>"
        "<BS_255><BSG_2><BS_Serif><Serif++>"
        "<WAIT>"
    "<end>"
};

コード:

void txt_Analyze( void )
{
    //キーの入力フラグがtrueのときは命令なし
    if( WAIT == true ){
        return;
    }
    //文末に着いたら処理しない
    if( CMD_BUF[txt_index] == '\0' ){
        return;
    }
    //読み込みの開始と終了
    ///////////////////////////////////////////////////////////////
    if( strncmp( &CMD_BUF[txt_index] , "<open>" , 6 ) == 0 ){
        txt_index += 6;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<end>" , 5 ) == 0 ){
        DrawFormatString( 0 , 60 , GetColor(255,255,255) , "読み込み終了" );
        return;
    }
    ///////////////////////////////////////////////////////////////
 
    //立ち絵の表示フラグ
    ///////////////////////////////////////////////////////////////
    if( strncmp( &CMD_BUF[txt_index] , "<PL_ON>" , 7 ) == 0 ){
        txt_index += 7;
        show_flag.player = 1;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<BS_ON>" , 7 ) == 0 ){
        txt_index += 7;
        show_flag.boss_1 = 1;
        return;
    }
    ///////////////////////////////////////////////////////////////
    //立ち絵の表示番号
    ///////////////////////////////////////////////////////////////
    if( strncmp( &CMD_BUF[txt_index] , "<PLG_0>" , 7 ) == 0 ){
        txt_index += 7;
        g_point.player = 0;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<PLG_1>" , 7 ) == 0 ){
        txt_index += 7;
        g_point.player = 1;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<PLG_2>" , 7 ) == 0 ){
        txt_index += 7;
        g_point.player = 2;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<BSG_0>" , 7 ) == 0 ){
        txt_index += 7;
        g_point.boss_1 = 0;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<BSG_1>" , 7 ) == 0 ){
        txt_index += 7;
        g_point.boss_1 = 1;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<BSG_2>" , 7 ) == 0 ){
        txt_index += 7;
        g_point.boss_1 = 2;
        return;
    }
    ///////////////////////////////////////////////////////////////
    //吹き出しの位置
    ///////////////////////////////////////////////////////////////
    if( strncmp( &CMD_BUF[txt_index] , "<PL_Serif>" , 10 ) == 0 ){
        txt_index += 10;
        ball_x     = 200;
        ball_y     = 300;
        ball_point =   0;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<BS_Serif>" , 10 ) == 0 ){
        txt_index += 10;
        ball_x     =  50;
        ball_y     = 300;
        ball_point =   1;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<Serif++>" , 9 ) == 0 ){
        txt_index += 9;
        Serif_cnt++;
        return;
    }
    ///////////////////////////////////////////////////////////////
    //アルファブレンド値
    ///////////////////////////////////////////////////////////////
    if( strncmp( &CMD_BUF[txt_index] , "<BS_255>" , 8 ) == 0 ){
        if( b_alpha >= 255 ){
            txt_index += 8;
        }
        if( b_alpha <= 255 ){
            b_alpha += 10;
        }
        b_x     = 200;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<BS_127>" , 8 ) == 0 ){
        if( b_alpha <= 127 ){
            txt_index += 8;
        }
        if( b_alpha >= 127 ){
            b_alpha -= 10;
        }
        b_x     = 250;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<PL_255>" , 8 ) == 0 ){
        if( p_alpha >= 255 ){
            txt_index += 8;
        }
        if( p_alpha <= 255 ){
            p_alpha += 10;
        }
        pl_x = -50;
        return;
    }
    if( strncmp( &CMD_BUF[txt_index] , "<PL_127>" , 8 ) == 0 ){
        if( p_alpha <= 127 ){
            txt_index += 8;
        }
        if( p_alpha >= 127 ){
            p_alpha -= 10;
        }
        pl_x = -100;
        return;
    }
    ///////////////////////////////////////////////////////////////
    //<WAIT>がきたらフラグをtrueに
    if( strncmp( &CMD_BUF[txt_index] , "<WAIT>" , 6 ) == 0 ){
        txt_index += 6;
        WAIT = true;
        return;
    }
 
}
<PL_ON>というコマンドを見つけると特定の立ち絵を表示したり
<WAIT>というコマンドを見つけるとキー入力待ちになったりします。
このコマンドをベタベタ書いていってイベントを制御するわけです。
上記の例はあまり実装としては参考になりませんがニュアンス的にはそんな感じです。
ちなみにこういったイベント制御をするためのコマンド処理を「スクリプト」って呼んだりします
ヽ(*゚д゚)ノ カイバー

amgk
記事: 2
登録日時: 11年前
住所: 東京都

Re: STGのセリフの入れ方について質問です

#4

投稿記事 by amgk » 11年前

解りました。もっと自分の練度を上げなおしてから質問しなおします。
ありがとうございましたm(_ _)m

閉鎖

“C言語何でも質問掲示板” へ戻る