ページ 11

ノベル風文字列表示

Posted: 2011年7月20日(水) 23:42
by longlanddrive95
DXlibで

コード:

char ou_speak1[]="この剣をひきたまえ";
char yuusya_speak1[]="えっ?";
char ou_speak2[]="これを引くことができたら勇者として認める";
char yuusya_speak2[]="まじで!?";
っというようなやりとりをノベル風に一文字ずつ表示させようといろんなサイトを調べたのですが、どれも意味がよくわかりません。載っているサンプルコードもいろいろいじったりしたのですが、どう処理すればいいのかさっぱりです。
具体的に書くと
”この剣をひきたまえ”を一文字ずつ描写したあとにENTERキーを押したら、その前の文章を消し次の”えっ?”を一文字ずつ描写。っていうように実行させたいです。
できればわかりやすい解説もつけてくだされば嬉しいです。

Re: ノベル風文字列表示

Posted: 2011年7月21日(木) 00:09
by softya(ソフト屋)
解説サイトを見ても分からなかったのなら、ここでコードを書いても理解は難しいと思いますので一つずつ積み重ねて作ってみませんか?
まず、どこの解説サイトを三鷹見たか教えてください。[訂正]誤字でした。
boxさん、私は気にしませんがその手の書き込みは気分を害する人もいるので注意してくださいね。トピックが荒れる原因になりますので。

[追記]
こちらのサイトとかは読まれましたか? コードとしては問題がある部分もありますが参考にはなります。
「ゲーム作りで学ぶ! 実践的C言語プログラミング - karetta.jp」
http://karetta.jp/book-cover/game-programming
もし、ここなら分からなくなったところを教えてください。

Re: ノベル風文字列表示

Posted: 2011年7月21日(木) 00:11
by box
三鷹、っていうのに思わず吹いてしまった。

Re: ノベル風文字列表示

Posted: 2011年7月21日(木) 00:41
by longlanddrive95
softya(ソフト屋) さんが書きました:解説サイトを見ても分からなかったのなら、ここでコードを書いても理解は難しいと思いますので一つずつ積み重ねて作ってみませんか?
まず、どこの解説サイトを三鷹見たか教えてください。[訂正]誤字でした。
boxさん、私は気にしませんがその手の書き込みは気分を害する人もいるので注意してくださいね。トピックが荒れる原因になりますので。

[追記]
こちらのサイトとかは読まれましたか? コードとしては問題がある部分もありますが参考にはなります。
「ゲーム作りで学ぶ! 実践的C言語プログラミング - karetta.jp」
http://karetta.jp/book-cover/game-programming
もし、ここなら分からなくなったところを教えてください。

http://karetta.jp/book-node/game-programming/235056
http://homepage2.nifty.com/natupaji/DxL ... m.html#N20
http://homepage2.nifty.com/natupaji/tem ... nuTest.cpp
http://detail.chiebukuro.yahoo.co.jp/qa ... 1460205264
http://dixq.net/g/50.html
これらのサイトを見ました

はい、そちらのサイトも読みました
疑問点を書くと

コード:

#include "DxLib.h"

int isJapaneseCharacter(unsigned char code);
void writeSubstring(char* message, int start, int len, int posX, int posY, int color);

//メッセージのフォントの大きさ
#define MESSAGE_FONT_SIZE 20
//仮想バッファの最大文字数
#define MESSAGE_MAX_LENGTH 30
//仮想バッファの最大行数
#define MESSAGE_MAX_LINE 5

//表示したいメッセージ
char g_message[MESSAGE_MAX_LENGTH * MESSAGE_MAX_LINE] = "はろーhelloわーるど";

//画面にメッセージを表示する際にしようする仮想テキストバッファ
char g_messageBuffer[MESSAGE_MAX_LINE][MESSAGE_MAX_LENGTH];


//code が日本語であるか判定する
//戻り値 1:日本語 0:日本語ではない
int isJapaneseCharacter(unsigned char code)
{
        //省略(前回と同じ)
}


//messageで指定した文章を start の位置から len 文字分表示する
//文字列左側の座標は(posX, posY), 文字の色をcolorとする
void writeSubstring(char* message, int start, int len, int posX, int posY, int color)
{
        //省略(前回と同じ)
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                                 LPSTR lpCmdLine, int nCmdShow )
{
        //ウィンドウモードで起動
        ChangeWindowMode( TRUE );
        //画面の大きさは640 * 480
        SetGraphMode( 640 , 480 , 16 ) ;
        //DxLib初期化
        if( DxLib_Init() == -1 ) {
                 return -1;
        }

        // 描画先を裏画面にセット
        SetDrawScreen( DX_SCREEN_BACK ) ;
        
        //現在何文字目までを表示しているか
        int currentCursor = 0;
        int whiteColor = GetColor(255,255,255);

        //メインループ
        while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
                if( g_message[currentCursor] != '\0' ) {
                        currentCursor++;
                }

                writeSubstring( g_message, 0, currentCursor, 50,100, whiteColor );
                Sleep( 100 );
                ScreenFlip();
        }

        DxLib_End();
        return 0;
}

1.

コード:

//表示したいメッセージ
  char g_message[MESSAGE_MAX_LENGTH * MESSAGE_MAX_LINE] = "はろーhelloわーるど";
  今の場合「王」と「勇者」の二人の会話が続いています。話が進むにつれて会話文が膨大になってくると思うんですが、こ  れらはどう対処したらいいんでしょうか?
2. 登場するキャラクターも増えればそれぞれの会話文も増えていきますが、毎回毎回このソースを書くとプログラムがもの   すごい桁数になると思います。これらを1つの関数として扱うことはできないのでしょうか?

今のところここで一番つまずいています

Re: ノベル風文字列表示

Posted: 2011年7月21日(木) 00:56
by softya(ソフト屋)
1.に関しては普通は会話文などはシナリオテキストファイルの形でファイルからmallocで確保したメモリなどに読み込みます。
このメモリから一行一行取り出して表示するわけです。
文章が変わってもシナリオテキストファイルを修正するだけってことになります。

2.もちろん関数化出来ますよ。
表示や読み込む関数を作って、どのテキストファイルの何行目の文字列を表示するといった関数モジュール群を作ることなどが定番だと思います。

それと「ゲーム作りで学ぶ! 実践的C言語プログラミング」の方法なら画像表示コマンドなどをシナリオファイルに埋め込むシナリオスクリプトの形式まで解説されてますね。
[追記]ここら辺は、吉里吉里やNScripterなどでも使われている利用率の高い手法でしょう。
まぁ、「ゲーム作りで学ぶ! 実践的C言語プログラミング」ほど真面目にやらなくても色々手はあります。

Re: ノベル風文字列表示

Posted: 2011年7月21日(木) 01:39
by longlanddrive95
softya(ソフト屋) さんが書きました:1.に関しては普通は会話文などはシナリオテキストファイルの形でファイルからmallocで確保したメモリなどに読み込みます。
このメモリから一行一行取り出して表示するわけです。
文章が変わってもシナリオテキストファイルを修正するだけってことになります。

2.もちろん関数化出来ますよ。
表示や読み込む関数を作って、どのテキストファイルの何行目の文字列を表示するといった関数モジュール群を作ることなどが定番だと思います。

それと「ゲーム作りで学ぶ! 実践的C言語プログラミング」の方法なら画像表示コマンドなどをシナリオファイルに埋め込むシナリオスクリプトの形式まで解説されてますね。
[追記]ここら辺は、吉里吉里やNScripterなどでも使われている利用率の高い手法でしょう。
まぁ、「ゲーム作りで学ぶ! 実践的C言語プログラミング」ほど真面目にやらなくても色々手はあります。

なるほど。mallocは初めて聞いたのでとりあえず、テキストファイルから文字列を読み込むことから始めようと思います。
なんかできるような気がしてきました!ありがとうございます!!