DXライブラリのコードについて質問です
Posted: 2013年4月05日(金) 00:51
DXライブラリでスプリプトを読み込むコードを作成したのですが、
実行するとバグって動きません。
おそらくどこかのコードに誤りがあると思います。
何回見返してもわかりません。
バグの原因は何でしょうか?
少し長いコードですみませんがご回答お待ちしております。
DrawString関数のスプリプトコードです。
ファイル.txt
DrawString 0,0,あいうえお
DrawString 0,20,かきくけこ
DrawString 0,40,さしすせそ
実行するとバグって動きません。
おそらくどこかのコードに誤りがあると思います。
何回見返してもわかりません。
バグの原因は何でしょうか?
少し長いコードですみませんがご回答お待ちしております。
DrawString関数のスプリプトコードです。
#include <dxlibp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//スクリプトは最大1000行まで読み込む
#define SCRIPT_MAX_LINE 1000
//スクリプト最大文字数
#define SCRIPT_MAX_STRING_LENGTH 300
typedef struct ScriptInformation_tag {
int maxLineNumber; //スクリプト行数
int currentLine; //現在何行目を実行しているか
const char* filename; //ファイル名
char script[SCRIPT_MAX_LINE][SCRIPT_MAX_STRING_LENGTH];
} ScriptInformation;
//プロトタイプ宣言
int loadScript(const char* filename, ScriptInformation* scriptInfo);
void splitString(const char* src, char* dest[], const char* delim, int splitNum);
char* story_event[100];//実行するイベントのデータ
char Name[128];
int main()
{
if (DxLib_Init()== -1)return(-1);
ScriptInformation script;
while(ProcessMessage() == 0){
int next=0;
int story_eventint[3];
if(script.currentLine==0)next=1;
//DrawString関数
if(strncmp(story_event[0],"DrawString", SCRIPT_MAX_STRING_LENGTH) == 0){
for(int i;i<3;i=i+1)story_eventint[i+1]=atoi(story_event[i+1]);
DrawString(story_eventint[1],story_eventint[2],story_event[3],DX_COLOR_WHITE);
next=1;}
if(next==1){
loadScript("ファイル.txt", &script );
//splitString(分割したい文字列,分割された文字列,区切り文字,最大分割数);(1行の最大文字数は SCRIPT_MAX_STRING_LENGTH)
splitString(script.script[script.currentLine], story_event, " ,", 10);
}
}
return 0;
}
//ファイル読み込み
int loadScript(const char* filename, ScriptInformation* scriptInfo)
{
int pos;
char c;
//スクリプトファイル
int fp;
//スクリプト情報を初期化
memset( scriptInfo , 0, sizeof(ScriptInformation) );
//スクリプトファイルを開く
if(fp=FileRead_open(filename)) ;
//ファイル読み込みに失敗
// if( fp == NULL ){printf("スクリプト %s を読み込めませんでした\n", filename);return -1;}
//script書き込み時に使用
pos = 0;
for( ;; ) {
//一文字読み込み
c = FileRead_getc( fp );
//ファイルの終わりかどうか
if( FileRead_eof( fp ) )break;
//文章先頭の空白部分を読み飛ばす
while( (c == ' ' || c == '\t') && pos == 0 && !FileRead_eof( fp ) )c = FileRead_getc( fp );
//1行の文字数が多すぎる
if( pos >= SCRIPT_MAX_STRING_LENGTH - 1 ) {printf("error: 文字数が多すぎます (%d行目)", scriptInfo->currentLine );return -1;}
//改行文字が出てきた場合,次の行へ移動
if( c == '\n' ) {
//空行は読み飛ばす
if( pos == 0 )continue;
//\0を文字列の最後に付ける
scriptInfo->script[ scriptInfo->currentLine ][ pos ] = '\0';
//次の行に移動
scriptInfo->currentLine++;
//書き込み位置を0にする
pos = 0;
}else {
//書き込み
scriptInfo->script[ scriptInfo->currentLine ][ pos ] = c;
//文字書き込み位置をずらす
pos++;
}
}
FileRead_close(fp);
//最大行数
scriptInfo->maxLineNumber = scriptInfo->currentLine;
//読み込み中の行を0にする
scriptInfo->currentLine = 0;
//スクリプトファイル名を設定
scriptInfo->filename = filename;
return 0;
}
//文字列分割(1行の最大文字数は SCRIPT_MAX_STRING_LENGTH)
//src : 分割したい文字列
//dest: 分割された文字列
//delim: 区切り文字
//splitNum : 最大分割数
void splitString(const char* src, char* dest[], const char* delim, int splitNum){
int i;
char* cp;
char* copySrc;
//元の文章をコピーする
copySrc = (char*)malloc( sizeof(int) * SCRIPT_MAX_STRING_LENGTH + 1);
strncpy( copySrc, src, SCRIPT_MAX_STRING_LENGTH );
cp = copySrc;
//strtokを使って copySrc をdelim区切りで分割する
for( i = 0; i < splitNum ; i++ ) {
//分割対象文字列が無くなるまで分割
if( (dest[i] = strtok(cp, delim)) == NULL ) {
break;
}
//2回目にstrtokを呼び出す時は,cpをNULLにする
cp = NULL;
}
//分割された文字列の最後の要素はNULLとしておく
dest[i] = NULL;
}
DrawString 0,0,あいうえお
DrawString 0,20,かきくけこ
DrawString 0,40,さしすせそ