はじめまして
龍神録プログラミングの支館様の方にある
サウンドノベルのソースに改行処理を追加したいのですが
自分なりに色々と組んでみたのですが
表示されなくなったり、フリーズしたりと思うように結果が出せません。
組み方としては
表示する文字列のある特定の文字があったらそれ以降の文字列を
改行して表示するというものです。
ソースは支館様のソースとほぼ同じですので
できれば支館様のソースに追加という形で教えていただきたいです。
サウンドノベルの改行について
Re: サウンドノベルの改行について
まずFFさんが書いたコードを見せてもらえますか?
1から答えを出すより、そのコードを修正するという形のほうが説明しやすいかもしれません。
1から答えを出すより、そのコードを修正するという形のほうが説明しやすいかもしれません。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: サウンドノベルの改行について
フリーズするのはアクセスしてはいけない領域にアクセスしたりしているのではないでしょうか。
1行目から2行目へ移る処理はどうやっていますか?
1行目から2行目へ移る処理はどうやっていますか?
Re: サウンドノベルの改行について
返答遅れました。
質問した後に試行錯誤した結果以下のソースで
改行的なものはできました。
関数構造体に新たに char story2[256] を追加して
改行以降の文字をtoken[4]として読み込んでいます。
表示も大体同じ感じです。
ただこれでやると一行目と二行目が同時に表示されてしまうので、
一行目がすべて表示されてから二行目の描画をするようにしたいです。
、またこのやり方のほかに良いものがあるのでしたら教えていただきたいです。
質問した後に試行錯誤した結果以下のソースで
改行的なものはできました。
関数構造体に新たに char story2[256] を追加して
改行以降の文字をtoken[4]として読み込んでいます。
表示も大体同じ感じです。
ただこれでやると一行目と二行目が同時に表示されてしまうので、
一行目がすべて表示されてから二行目の描画をするようにしたいです。
、またこのやり方のほかに良いものがあるのでしたら教えていただきたいです。
#include "../include/GV.h"
//ストーリーデータの読み込み
void fantasy_load(const char *file_name)
{
int i, n, s; // カウンタ
int num = 0; // カウンタ
int fp; // ファイルポインタ
char buffer[256]; // 文字バッファ
char token[10][256]; // 文字バッファ
// ファイルオープン
if( ( fp = FileRead_open( file_name ) ) == NULL ) {
// エラー処理
}
// ファイル終端まで読み込む
while(FileRead_eof(fp) == 0 && num < 49) {
// 1行読み込む
if( FileRead_gets( buffer, 256, fp ) == -1 )
continue;
// 先頭文字が「/」ならスキップ
if( buffer[0] == '/' )
continue;
// CSV形式ファイル分割
n = 0; s = 0;
for(i = 0; i < 256; i++) {
if( buffer[i] == ',' ) {
token[n][s] = '\0';
s = 0;
n++;
continue;
}
if( buffer[i] == '\0' ) {
token[n][s] = '\0';
n++;
break;
}
token[n][s] = buffer[i];
s++;
}
// 種類
story[num].type = atoi(token[0]);
// 名前
strcpy_s(story[num].name, 50, token[1]);
// 表情
story[num].look = atoi( token[2] );
// 本文
strcpy_s(story[num].story, 256, token[3]);
//改行本文
strcpy_s(story[num].story2, 256, token[4]);
num++;
}
story[num].story[0] = '\0';
FileRead_close(fp);
}
void fantasy_disp()
{
static int num;
static int len;
char buf[256];
char buf2[256];
static int storyccount = 0;
strcpy_s(buf, 256, story[num].story);
strcpy_s(buf2, 256 , story[num].story2);
if(CheckStatePad(configpad.shot) == 1) {
if( buf[len] == '\0' )
{
len = 0;
++num;
}
}
if(CheckStatePad(configpad.bom)%5 == 4) {
len = 0;
++num;
}
// 本文が無かったら終了
if(buf[0] == '\0') {
num = 0;
len = 0;
func_state = 100;
return;
}
for(int i = 0; i < 2 && buf[len] || buf2[len] != '\0'; ++i) {
switch( buf[len] ) {
case '\0':
break;
default:
++len;
break;
}
switch( buf2[len] ) {
case '\0':
break;
default:
++len;
break;
}
}
buf[len] = '\0';
buf2[len] = '\0';
/* ▼ ラノベ描画 */
//主人公関係の処理
if(story[num].type == 1){
storyccount++;
if(storyccount <= 127){
DrawGraph(FX -30, FY +100, syuzin1,TRUE);}
else if (storyccount >=128 && storyccount<=130){
DrawGraph(FX -30, FY +100, syuzin2,TRUE);}
else if (storyccount >=131 && storyccount<=133){
DrawGraph(FX -30, FY +100, syuzin3,TRUE);}
else if (storyccount >= 134 && storyccount<= 136){
DrawGraph(FX -30, FY +100, syuzin4,TRUE);}
else if (storyccount ==137){
DrawGraph(FX -30, FY +100, syuzin4,TRUE);
storyccount =0;}
}
// if(story[num].type == 101){
// DrawGraph(FX+194,FY+120,tekiganzin,TRUE);}
//↑ここまで
if(story[num].type == 2){
DrawGraph(FX +194 , FY + 150, teki1[0],TRUE);}
DrawGraph(FX , FMY - 95,img_kaiwa[0],TRUE);
// 名前
DrawFormatStringToHandle(FX + 15, FMY - 62, color[5] , font[2], story[num].name);
// 本文
DrawFormatStringToHandle(FX + 15 , FMY - 43, color[5] , font[2], buf);
//改行本文
DrawFormatStringToHandle(FX + 15 , FMY -28, color[5] , font[2], buf2);
}