東方のような会話文の作成

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

Re: 東方のような会話文の作成

#101

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました: うーん。
もう少しC言語をちゃんと勉強したほうが良いでしょう。

例えfileにstrArrayを代入できても何も起こりません。fgetsを使ってください。
DrawIndexの件はforループで行います。
すいません、大学に入ったらC言語の基礎からちゃんと学びます。

ここからどうやってstrにある文字列をstrArrayにコピーすればいいか分かりません。
strcpyの引数としてstrArrayを使おうとしてみたものの二次元配列のため(?)によって引数にもできません。

コード:

char str[READ_STRING_LEN_MAX];

void talk_Load(char*text)
{
	FILE *file;
	file=fopen(text,"r");
	fgets(str,sizeof(str),file);

	fclose(file);
	Nowline=-1;
	for(int i=0;i<4;i++) 
	{
		DrawIndex[i]=-1;
	}
}

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

Re: 東方のような会話文の作成

#102

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

すいません、大学に入ったらC言語の基礎からちゃんと学びます。
厳しく書きますが、そんな何年も先の話ではなくて今困る話しなんです。
この先も龍神録を改造するのなら避けて通れる話でありません。
今やるか、改造しないか、どっちかでしか無いと私は思います。
それに未来の保証のない話をされても今の問題は解決しないです。

この掲示板は、お手伝いしますであって代わりに作りますでは無いのですから作るのはTakumiさん自身ですよ。
ここからどうやってstrにある文字列をstrArrayにコピーすればいいか分かりません。
strcpyの引数としてstrArrayを使おうとしてみたものの二次元配列のため(?)によって引数にもできません。
もう少し調べてみてください。苦Cにも書いてあるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#103

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました: 厳しく書きますが、そんな何年も先の話ではなくて今困る話しなんです。
この先も龍神録を改造するのなら避けて通れる話でありません。
今やるか、改造しないか、どっちかでしか無いと私は思います。
それに未来の保証のない話をされても今の問題は解決しないです。
この掲示板は、お手伝いしますであって代わりに作りますでは無いのですから作るのはTakumiさん自身ですよ。
もう少し調べてみてください。苦Cにも書いてあるはずです。
そうですよね、そう言われるのを分かっていながらもつい弱音が出てしまいました。

しかし苦Cをもう一度必要なところを読み直してみて改善したつもりなのですがまだうまくいきません。デバッグすると「str!==NULL」と出てきます。

コード:

char str[READ_STRING_LEN_MAX];

void talk_Load(char*text)
{
	FILE *file;
	file=fopen(text,"r");
	fgets(str,sizeof(str),file);
	memcpy(strArray,str,sizeof(str));
	fclose(file);
	Nowline=-1;
	for(int i=0;i<4;i++) 
	{
		DrawIndex[i]=-1;
	}
}
memcpyはやっぱり使いますよね?

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

Re: 東方のような会話文の作成

#104

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

大変ですが、後少しのことまで来ています。がんばりましょう。

問題点ですが次のことが問題です。
1.念のためオープンエラーをチェックしましょう。
2.fgetsは複数行処理しますのでループが必要となります。メッセージは複数行ですから。
http://hitorilife.com/fgets.php
3.複数行の都合で現在行を数える必要が出てきます。仮にnとします。
4.char str[READ_STRING_LEN_MAX];は不要でmemcpyも不要になります。
char str[READ_STRING_LEN_MAX];のstrとstrArray[n]は同等なのです。※nは行を表す変数。
5.最後にMaxLineにロードした行数を代入します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#105

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:大変ですが、後少しのことまで来ています。がんばりましょう。

問題点ですが次のことが問題です。
1.念のためオープンエラーをチェックしましょう。
2.fgetsは複数行処理しますのでループが必要となります。メッセージは複数行ですから。
http://hitorilife.com/fgets.php
3.複数行の都合で現在行を数える必要が出てきます。仮にnとします。
4.char str[READ_STRING_LEN_MAX];は不要でmemcpyも不要になります。
char str[READ_STRING_LEN_MAX];のstrとstrArray[n]は同等なのです。※nは行を表す変数。
5.最後にMaxLineにロードした行数を代入します。
まだ同じエラーが出てきます。
デバッガで調べたところwhileの部分を矢印で示していました。whileの条件式としてこれは何かいけないのでしょう?

コード:

void talk_Load(char*text)
{
	FILE *file;
	file=fopen(text,"r");
	int n=0;
	while(fgets(strArray[n],sizeof(strArray[n]),file)!=NULL)
	{
	      fgets(strArray[n],sizeof(strArray[n]),file);
	       n++;
	}
	fclose(file);
	lineMax=n;
	Nowline=-1;
	for(int i=0;i<4;i++) 
	{
		DrawIndex[i]=-1;
	}
}

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

Re: 東方のような会話文の作成

#106

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

whileで止まるなら、fopenに失敗していませんか?
紹介したリンク先にあるのと同じ様なエラー処理を搭載してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#107

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:whileで止まるなら、fopenに失敗していませんか?
紹介したリンク先にあるのと同じ様なエラー処理を搭載してください。
ファイルを読み込める様になったものの今度はなぜか表示されない文字列があったり「/」が表示されたり4行ずつ表示されませんでした。
talk_Loadはmainの一番最初(while外)に書いてあります。

コード:

void talk_Load(char*text)
{
	FILE *file;
	file=fopen(text,"r");
	int n=0;
	while(fgets(strArray[n],sizeof(strArray[n]),file)!=NULL)
	{
	   fgets(strArray[n],sizeof(strArray[n]),file);
	   n++;
	}
	fclose(file);
	lineMax=n;
	Nowline=-1;
	for(int i=0;i<4;i++) 
	{
		DrawIndex[i]=-1;
	}
}

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

Re: 東方のような会話文の作成

#108

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

fgetsが2つ有るのがマズイと思います。
strArray配列の中身をデバッガで確認してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#109

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:fgetsが2つ有るのがマズイと思います。
strArray配列の中身をデバッガで確認してみてください。
デバッガで調べてみようとしたもののstrArrayとその他変数の項目が見当たりませんでした、エラー時はいつも表示されるのですが・・・

ご指摘の通り改善してみました、しかし今度は一行ずつ勝手に改行されてまだ「/」も表示されてしまいます、そのため改行も含めた八行ごと表示されてしまいます。
こんにちわ

/

/

暑いですね

こんな感じです。
lineMaxもnに設定しNowlineもDrowIndexも初期化してあるのになぜこうなるのか分かりません。

コード:

void talk_Load(char*text)
{
	FILE *file;
	file=fopen(text,"r");
	int n=0;
	while(fgets(strArray[n],sizeof(strArray[n]),file)!=NULL)
	{
	   n++;
	}
	fclose(file);
	lineMax=n;
	Nowline=-1;
	for(int i=0;i<4;i++) 
	{
		DrawIndex[i]=-1;
	}
}

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

Re: 東方のような会話文の作成

#110

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

デバッガで内容を見るにはプログラムが動いてないといけませんから、ブレークポイントで自主的に止める必要があります。

あと改行してしまう件ですが、fgetsだと目に見えませんが0x0a="\n"が文字列の最後に付いてしまいます。ごめんなさい忘れていました。
これは削るしか無いので、strArray[n][strlen(strArray[n]) - 1] = '\0';で最後の一文字を削ります。
strArray[n][strlen(strArray[n]) - 1] = '\0';の意味は考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#111

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:デバッガで内容を見るにはプログラムが動いてないといけませんから、ブレークポイントで自主的に止める必要があります。

あと改行してしまう件ですが、fgetsだと目に見えませんが0x0a="\n"が文字列の最後に付いてしまいます。ごめんなさい忘れていました。
これは削るしか無いので、strArray[n][strlen(strArray[n]) - 1] = '\0';で最後の一文字を削ります。
strArray[n][strlen(strArray[n]) - 1] = '\0';の意味は考えてみてください。
試してみたところ他は良かったのですが最後の文字が「・」になってしまいます。
例えば「終わり」なら「終わ・」となります。
さすがにこれはもうなぜこうなるのか分かりません・・・

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

Re: 東方のような会話文の作成

#112

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

Takumi さんが書きました:
softya(ソフト屋) さんが書きました:デバッガで内容を見るにはプログラムが動いてないといけませんから、ブレークポイントで自主的に止める必要があります。

あと改行してしまう件ですが、fgetsだと目に見えませんが0x0a="\n"が文字列の最後に付いてしまいます。ごめんなさい忘れていました。
これは削るしか無いので、strArray[n][strlen(strArray[n]) - 1] = '\0';で最後の一文字を削ります。
strArray[n][strlen(strArray[n]) - 1] = '\0';の意味は考えてみてください。
試してみたところ他は良かったのですが最後の文字が「・」になってしまいます。
例えば「終わり」なら「終わ・」となります。
さすがにこれはもうなぜこうなるのか分かりません・・・
あっテキストファイルのの最後が改行で終わってないんですね。
だとすると改行判定が必要です。

strArray[n][strlen(strArray[n]) - 1] が"\n"なら"\0"を代入にする変えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#113

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました: あっテキストファイルのの最後が改行で終わってないんですね。
だとすると改行判定が必要です。

strArray[n][strlen(strArray[n]) - 1] が"\n"なら"\0"を代入にする変えてください。
すいません、「/」と「\」を見間違えて焦ってました。
おかげさまでうまくできました!

コード:

void talk_Load(char*text)
{
	FILE *file;
	file=fopen(text,"r");
	int n=0;
	while(fgets(strArray[n],sizeof(strArray[n]),file)!=NULL)
	{
	    if(strArray[n][strlen(strArray[n]) - 1]=='\n')
	    {
	         strArray[n][strlen(strArray[n]) - 1]='\0';
		}
	    n++;
	}
	fclose(file);
	lineMax=n;
	Nowline=-1;
	for(int i=0;i<4;i++) 
	{
		DrawIndex[i]=-1;
	}
}

Takumi

Re: 東方のような会話文の作成

#114

投稿記事 by Takumi » 13年前

あとブレークポイントも使えるようになりました!

Takumi

Re: 東方のような会話文の作成

#115

投稿記事 by Takumi » 13年前

次は「 龍神録に組みこみ。メッセージ表示をDrawFormatString()に切り替える」ですよね?
まずなにから始めればいいでしょうか?

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

Re: 東方のような会話文の作成

#116

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

Takumi さんが書きました:次は「 龍神録に組みこみ。メッセージ表示をDrawFormatString()に切り替える」ですよね?
まずなにから始めればいいでしょうか?
大分進みましたね。
全部私が答えても勉強にならない気がするので自分でまず方針を立ててみてください。
問題があれば、それを指摘する形にしたいと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#117

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました: 大分進みましたね。
全部私が答えても勉強にならない気がするので自分でまず方針を立ててみてください。
問題があれば、それを指摘する形にしたいと思います。
すいません、考えていたらある事を思い出して遅くなりました。

フラグが立ったら龍神録のmainでswitch文で切り替えてここで作ったmainを処理させる、ここで作ったmainだけを処理させたら他のいろいろな処理が止まってしまうのでここで作ったmainのwhileループの中に切り替える前に行っていた処理を追加する。
フラグは戦闘を始める前のカウントに立てる。会話が終わったら切り替える前の処理に戻す。
DrawFormatStringとFileRead_openとFileRead_getsを使った形式にする。

こんな感じでいいでしょうか?

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

Re: 東方のような会話文の作成

#118

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

このmainは色々マズイので捨てます。2つもメインループがあるのは後々良くないです。
talk.cppはそのまま移植ですね。
>DrawFormatStringとFileRead_openとFileRead_getsを使った形式にする。
これを行なってください。

>フラグは戦闘を始める前のカウントに立てる。会話が終わったら切り替える前の処理に戻す。

たしか、talkフラグって用意してませんでしたか?
それで龍神録のメインループからtalkフラグが有効な間はtalk_Main()とtalk_Graph()を呼び出すように切り替えます。
talkフラグが有効な間、従来の龍神録の関数のはどれを呼び、どれを呼ばないべきなのかは龍神録を完全把握していないのでよく分かりません。
talkフラグ無効になれば元に戻します。

なお、talkフラグが有効になる瞬間にtalk_Load()を行なってください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#119

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:このmainは色々マズイので捨てます。2つもメインループがあるのは後々良くないです。
talk.cppはそのまま移植ですね。
>DrawFormatStringとFileRead_openとFileRead_getsを使った形式にする。
これを行なってください。

>フラグは戦闘を始める前のカウントに立てる。会話が終わったら切り替える前の処理に戻す。

たしか、talkフラグって用意してませんでしたか?
それで龍神録のメインループからtalkフラグが有効な間はtalk_Main()とtalk_Graph()を呼び出すように切り替えます。
talkフラグが有効な間、従来の龍神録の関数のはどれを呼び、どれを呼ばないべきなのかは龍神録を完全把握していないのでよく分かりません。
talkフラグ無効になれば元に戻します。

なお、talkフラグが有効になる瞬間にtalk_Load()を行なってください。
mainを捨てるとなると今までmainで行っていたリアルタイムキー入力や画面クリアはどこで処理すればいいのでしょうか?

アバター
結城
記事: 52
登録日時: 14年前
連絡を取る:

Re: 東方のような会話文の作成

#120

投稿記事 by 結城 » 13年前

Takumi さんが書きました: なぜか入力されたキーが表示されるだけなんですがどうすればいいでしょうか?

コード:

printf("%s\n",strArray[i]);
此方が原因です
strArrayは配列ですので、それに対して添え字を与えると”i番目の文字”が取り出されることになります

ですのでこの場合strArrayを指定するのが正解です。

またコードはインデントした方が見通しがよく、バグも見つけやすくなります。
是非にインデントしてくださいな。
ANGE;ART

Takumi

Re: 東方のような会話文の作成

#121

投稿記事 by Takumi » 13年前

Hinari さんが書きました: またコードはインデントした方が見通しがよく、バグも見つけやすくなります。
是非にインデントしてくださいな。
はい、これからもインデントには心懸けたいと思います。

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

Re: 東方のような会話文の作成

#122

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

Takumi さんが書きました: mainを捨てるとなると今までmainで行っていたリアルタイムキー入力や画面クリアはどこで処理すればいいのでしょうか?
それは龍神録のmainにあります。キーはその情報を貰ってください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#123

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました: それは龍神録のmainにあります。キーはその情報を貰ってください。
ProcessLoop内にあるClearDrawScreenとGetHitKeyStateAll_2がその役割をしているという事ですか。
すいません野暮な質問をしてしまい・・・

Takumi

Re: 東方のような会話文の作成

#124

投稿記事 by Takumi » 13年前

とりあえずDXライブラリの関数は使わずfopenとfgetsとprintfのままで文字を表示させようと思ったのですが文字が表示されません。なぜでしょうか?
main.cpp

コード:

int key=' ';
			case 100:
				calc_ch();
				ch_move();
				if(talk.flag==0)
				{
				    cshot_main();
				    enemy_main();
				    out_main();
				    shot_main();
					effect_main();
				}
				calc_main();
				boss_shot_main();
				graph_main();
				if(talk.flag==1)
				{
					if(stateKey[KEY_INPUT_Z]==1)
					{
						key='z';
					}
				    talk_Main(key);
					talk_Graph();
				}
				if(boss.flag==0&&talk.flag==0)
				{
					stage_count++;
				}
                           break;
boss_shot.cpp

コード:

	if(stage_count==talk.cnt[0]&&boss.flag==0&&talk.flag==0)
	{
	    talk.flag=1;
	    talk_Load("test.txt");
	    talk.boss=1;
	    enter_boss2(0);
	}
	if(boss.flag==2)
	{
	    calc_boss();
	    if(boss.phy.flag==1)
		{
	        calc_phy();
		}
    }
function.h

コード:

int talk_Main(int key);
void talk_Graph();
void talk_Load(char*text);

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

Re: 東方のような会話文の作成

#125

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

printfはコンソールにしか出力できません。
DXライブラリのウィンドウはDirectXグラフィックウィンドウですので出力対象外です。
つまり、何処にも出力されません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#126

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:printfはコンソールにしか出力できません。
DXライブラリのウィンドウはDirectXグラフィックウィンドウですので出力対象外です。
つまり、何処にも出力されません。
え?そうなんですか!?
前にprintfで出力できたと思ったのですがprintfDXと勘違いしてました。

Takumi

Re: 東方のような会話文の作成

#127

投稿記事 by Takumi » 13年前

行き詰ってしまいました。
指定したカウントになるとほんの一瞬文字らしきものが表示されて待機状態になります。そしてキーを押すとキャラの画像が消えて戦闘が始まります。
talk.cpp

コード:

void talk_Main(int key)
{
	if(Nowline>=lineMax-1)
    {
        if(key=='z')
        {
            talk.flag=0;
			boss.flag=0;
			return;
        }
    }
    if(Nowline==-1)
    {
        Nowline=0;
        DrawIndex[0]=0;
		return;
    }
    if(Nowline<lineMax-1)
    {
        if(strcmp(strArray[Nowline+1],"/")==0)
        {
            Nowline++;
            DrawIndex[Nowline%4]=-1;
			return;
        }
    }
    if(Nowline<lineMax-1)
    {
        if(key=='z')
        {
            Nowline++;
            DrawIndex[Nowline%4]=Nowline;
            if(Nowline%4==0)
            {
                DrawIndex[1]=-1;
                DrawIndex[2]=-1;
                DrawIndex[3]=-1;
            }
        }
    }
}

void talk_Graph()
{
    for( int i=0 ; i<4 ; i++ ) 
	{
        if( DrawIndex[i]!=-1 )
		{
			y+=16;
            int index = DrawIndex[i];
            DrawFormatString( x,y,Cr,"%s", strArray[index] );
        } 
		else 
		{
            y+=16;
        }
    }
	if(y==430)
	{
	    y=350;
	    if(talk.ch==1)
		{
		    talk.boss=1;
		    talk.ch=0;
		}
	    else
	    {
		    talk.ch=1;
		    talk.boss=0;
	    }
	}
}

void talk_Load(char*text)
{
	int file;
	file=FileRead_open(text);
	int n=0;
	while(FileRead_gets(strArray[n],sizeof(strArray[n]),file)!=-1)
	{
	    n++;
	}
	FileRead_close(file);
	lineMax=n;
	Nowline=-1;
	for(int i=0;i<4;i++) 
	{
		DrawIndex[i]=-1;
	}
}
main.cpp

コード:

			case 100:
				calc_ch();
				ch_move();
				if(talk.flag==0)
				{
				    cshot_main();
				    enemy_main();
				    out_main();
				    shot_main();
					effect_main();
				}
				calc_main();
				boss_shot_main();
				graph_main();
				if(talk.flag==1)
				{
					if(stateKey[KEY_INPUT_Z]==1)
					{
						key='z';
					}
				    talk_Main(key);
					talk_Graph();
				}
				if(boss.flag==0&&talk.flag==0)
				{
					stage_count++;
				}
                break;

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

Re: 東方のような会話文の作成

#128

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

問題点1。

コード:

if(stateKey[KEY_INPUT_Z]==1)
                    {
                        key='z';
                    }
これだと一度'z'になると戻らない気が。elseを書きましょう。

あとキャラ切り替えを描画でやってますが、talk_Mainで行うべきです。
おかしいのは、こちらも原因では?

コード:

    if(y==430)
    {
        y=350;
        if(talk.ch==1)
        {
            talk.boss=1;
            talk.ch=0;
        }
        else
        {
            talk.ch=1;
            talk.boss=0;
        }
    }
これってデバッガで動作を追えばすぐ原因が分かりそうなものなのですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#129

投稿記事 by Takumi » 13年前

やっと完成しました!
何か問題があればご指摘お願いします。
main.cpp

コード:

			case 100:
				calc_ch();
				ch_move();
				if(talk.flag==0)
				{
				    cshot_main();
				    enemy_main();
				    out_main();
				    shot_main();
					effect_main();
				}
				calc_main();
				boss_shot_main();
				graph_main();
				if(talk.flag==1)
				{
					if(stateKey[KEY_INPUT_Z]==1)
					{
						key='z';
					}
					else
					{
						key=' ';
					}
					if(talk_Main(key)){
					talk_Graph();
					}
				}
				if(boss.flag==0&&talk.flag==0)
				{
					stage_count++;
				}
                break;
talk.cpp

コード:

#define READ_LINE_MAX (30)
#define READ_STRING_LEN_MAX (100)

char strArray[READ_LINE_MAX][READ_STRING_LEN_MAX];

int Cr=GetColor(255,255,255);
int x=150;
int y=350;

static int lineMax=0;
static int DrawIndex[4] = {-1,-1,-1,-1};
static int Nowline=-1;

int talk_Main(int key)
{
	if(Nowline>=lineMax-1)
    {
        if(key=='z')
        {
            talk.flag=0;
			boss.flag=0;
			return 0;
        }
		else
		{
		    return 1;
		}
    }
    if(Nowline==-1)
    {
        Nowline=0;
        DrawIndex[0]=0;
		return 1;
    }
    if(Nowline<lineMax-1)
    {
        if(strcmp(strArray[Nowline+1],"/")==0)
        {
            Nowline++;
            DrawIndex[Nowline%4]=-1;
			return 1;
        }
    }
    if(Nowline<lineMax-1)
    {
        if(key=='z')
        {
            Nowline++;
            DrawIndex[Nowline%4]=Nowline;
            if(Nowline%4==0)
            {
                DrawIndex[1]=-1;
                DrawIndex[2]=-1;
                DrawIndex[3]=-1;
				if(talk.boss==1)
	            {
		            talk.ch=1;
		            talk.boss=0;
	            }
				else
				{
				   talk.ch=0;
				   talk.boss=1;
				}
            }
        }
		return 1;
	}
	return 0;
}

void talk_Graph()
{
    for( int i=0 ; i<4 ; i++ ) 
	{
        if( DrawIndex[i]!=-1 )
		{
			y=350+i*16;
            int index = DrawIndex[i];
            DrawFormatString( x,y,Cr,"%s", strArray[index] );
        } 
    }
}

void talk_Load(char*text)
{
	int file;
	file=FileRead_open(text);
	int n=0;
	while(FileRead_gets(strArray[n],sizeof(strArray[n]),file)!=-1)
	{
	    n++;
	}
	FileRead_close(file);
	lineMax=n;
	Nowline=-1;
	for(int i=0;i<4;i++) 
	{
		DrawIndex[i]=-1;
	}
}

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

Re: 東方のような会話文の作成

#130

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

ざっと見る限りは大丈夫です。
完成おめでとうございます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Takumi

Re: 東方のような会話文の作成

#131

投稿記事 by Takumi » 13年前

softya(ソフト屋) さんが書きました:ざっと見る限りは大丈夫です。
完成おめでとうございます。
ありがとうございます!!
ここまで来れたのもsoftya(ソフト屋)さんのおかげです。
しかしまだこれだけではSTG作成は終わりじゃないのでこれからもよろしくお願いします。
それでは失礼します。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 東方のような会話文の作成

#132

投稿記事 by ISLe » 13年前

いちおうこんなものをブログで公開してます。
禁則処理付き折り返し文字列描画【ShiftJIS版/改行付き】: ISLeのビデオゲーム工房
一文字ずつ表示するサンプルコードもあります。
良かったら参考にしてください。

閉鎖

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