RPGゲームを作ろうと思ってるんですが…。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ルルシア

RPGゲームを作ろうと思ってるんですが…。

#1

投稿記事 by ルルシア » 16年前

現在RPG作成中なんですがキャラ移動などはこちらのサイトの内容を参考して作らせていただきましたが会話イベント中の「はい」「いいえ」などの分岐はどのようなプログラムで考えればよろしいでしょうか?

array

Re:RPGゲームを作ろうと思ってるんですが…。

#2

投稿記事 by array » 16年前

キャラ移動は、できているみたいなので、文字列の描画や画像の描画は大丈夫だと思います。

> 「はい」「いいえ」などの分岐はどのようなプログラムで考えればよろしいでしょうか?
分岐のプログラムはswitch文で分岐するのが大半みたいです。

分岐させるにはどちらを選択しているか判断する必要があるので「ポイント」を用意します

まず描画するのは以下の3つで良いと思います。
1.「はい」
2.「いいえ」
3.どちらを選択してるか判断するポイント

画像、もしくは文字を描画する際、どの位置に表示させるか座標(X,Y)を指定しますよね。
その一例として書いておきます
例)
「はい」 (0、 0)←(10、0)
「いいえ」(0、10)
矢印(←)がどちらを指定しているかのポイントです。
キャラ移動と同じ要領で、ポイント(←)を動かします。

上記の状態から、キーボードから[↓]を入力してポイントを移動させます。
例)
「はい」 (0、 0)
「いいえ」(0、10)←(10、10)

このポイントの位置で処理を分岐させればいいと思います。

ルルシア

Re:RPGゲームを作ろうと思ってるんですが…。

#3

投稿記事 by ルルシア » 16年前

なるほど、switch文を使うんですね。ありがとうございます!

Dixq (管理人)

Re:RPGゲームを作ろうと思ってるんですが…。

#4

投稿記事 by Dixq (管理人) » 16年前

サンプル作ってみました。
ファイルわけしたらもっと効率的になるんですけどねぇ。
サンプル実行して上下キー及びZキーを押したりしてサンプルの動作を見てみて下さい。
#include "DxLib.h"

/* セレクト項目の最大数 */
#define SELECT_ELEMENT_MAX 10

/* セレクト項目の要素 */
typedef struct{
    int iX, iY;
    char cName[128];
}Element_t;

/* セレクト項目要素の親 */
typedef struct{
    int iNum;    //今選択されている番号
    int iMax;        //登録されている数
    Element_t Element[ SELECT_ELEMENT_MAX ];
}Select_t;

/* キー状態格納変数 */
int Key[256];

/* キー入力管理関数 */
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++)
    {
        if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
        else                            GetHitKeyStateAll_InputKey=0;
    }
    return 0;
}

/* 呼ぶ関数を制御する変数 */
int FunctionState;

/* セレクト要素にメニュー情報を登録する */
void EnterSelectString( Select_t *Sel, int iX, int iY, char cStr[/url] ){
    strcpy( Sel->Element[ Sel->iMax ].cName, cStr );    //文字列格納
    Sel->Element[ Sel->iMax ].iX = iX;                  //座標格納
    Sel->Element[ Sel->iMax ].iY = iY;
    Sel->iMax++;                                        //今いくつ要素が入っているかカウント
}

/* セレクト情報初期化 */
void SelectIni( Select_t *Sel ){
    memset ( Sel, 0, sizeof(Select_t) );                //全て0に
    EnterSelectString( Sel , 100, 100, "メニュー0" );
    EnterSelectString( Sel , 100, 150, "メニュー1" );
    EnterSelectString( Sel , 100, 200, "メニュー2" );
    EnterSelectString( Sel , 100, 250, "メニュー3" );
    EnterSelectString( Sel , 100, 300, "メニュー4" );
    EnterSelectString( Sel , 400, 450, "メニューA" );
    FunctionState=1;                                    //次の関数を呼ぶ
}

/* キー入力などからセレクト状況を計算する */
void SelectCalc( Select_t *Sel){
    /* 上下キーが押されたら現在選択されている番号を表す->iNumを変化させる */
    if( Key[ KEY_INPUT_UP ] == 1 )
    {
        Sel->iNum--;
        if( Sel->iNum < 0 )
        {
            Sel->iNum = Sel->iMax - 1 ;
        }
    }
    if( Key[ KEY_INPUT_DOWN ] == 1 )
    {
        Sel->iNum = (++Sel->iNum) % Sel->iMax ;
    }
}

/* セレクト項目と現在のセレクト状況描画 */
void SelectGraph( Select_t Sel){
    int i, Col = GetColor(255,255,255) ;
    for(i=0; i<Sel.iMax; i++)
    {
        DrawFormatString( Sel.Element[ i ].iX, Sel.Element[ i ].iY, Col, "%s", Sel.Element[ i ].cName );
    }
    DrawCircle( Sel.Element[ Sel.iNum ].iX-20, Sel.Element[ Sel.iNum ].iY+7, 7, Col, TRUE );
}

/* セレクトメイン */
void SelectMain( Select_t *Sel ){
    SelectCalc( Sel );    //計算
    SelectGraph( *Sel );//描画
    if( Key[ KEY_INPUT_Z ] == 1 )
    {
        FunctionState = 2;//けって~
    }
}

//決定されて2秒間その項目を表示する
void Decided( Select_t Sel ){
    int Col = GetColor( 255, 255, 255 );
    static int cnt=0;
    DrawFormatString( 100, 100, Col, "%sが選択されました。", Sel.Element[ Sel.iNum ].cName );
    cnt++;
    if( cnt > 120 )//60FPSのモニタで2秒たったら
    {
        cnt = 0;
        FunctionState = 0;
    }
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    
    Select_t Select;
    
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
        switch(FunctionState){
            case 0:
                //初期化
                SelectIni( &Select );
                break;
            case 1:
                //メイン計算
                SelectMain( &Select );
                break;
            case 2:
                //決定した瞬間その項目を表示->0に戻る
                Decided( Select );
                break;
        }
        ScreenFlip();
    }

    DxLib_End();
    return 0;
}
 

Dixq (管理人)

Re:RPGゲームを作ろうと思ってるんですが…。

#5

投稿記事 by Dixq (管理人) » 16年前

あ、DXライブラリじゃなかったらごめんなさい。
なんかちょうどmixiのDXライブラリコミュでRPGの記事見てたのでDXライブラリだと思ってしまいました^^;
別にDXライブラリじゃなくてもアルゴリズム的には何にでも使えると思います。
もし処理の流れがよくわからなかったら補足するので遠慮なく言って下さい。
ただこれは私がやってる方法だというだけでいい方法かどうか知りませんのでその辺はご了承下さい・・。

バグ

Re:RPGゲームを作ろうと思ってるんですが…。

#6

投稿記事 by バグ » 16年前

いっそのこと、メッセージボックスを使うというのはどうでしょ?(^_^;)

閉鎖

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