ノベルの文字が表示されない
Posted: 2011年6月04日(土) 18:03
シューティングゲームにノベルを入れたんですけど、どんなに頑張っても文字が表示されません。
誰か教えてください!!
誰か教えてください!!
//main.cpp
#define GLOBAL_INSTANCE
#include "../include/GV.h"
//ループで必ず行う3大処理
int ProcessLoop(){
if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2();//現在のキー入力処理を行う
GetHitPadStateAll(); //現在のパッド入力処理を行う
GetCheckHitKeyAll_2(&MD.AllKeyCount);// 全キーの押下カウント
return 0;
}
void StateChange(GameState_t State){
MD.beforeState=MD.gameState;
MD.gameState=State;
}
void Title()
{
DrawString( 32, 160,GAME_TITLE_STR,GetColor(255,255,255) );
// HIT ANY KEY
DrawString( 20, 240,"HIT ANY KEY",GetColor(155,155,255) );
// 何かキーが押された?
if( MD.AllKeyCount== 1 ) {
StateChange(GAME_STATE_LOAD);
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
SetMainWindowText(GAME_TITLE_STR);//タイトル
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
first_ini();//初回の初期化
while(ProcessLoop()==0){//メインループ
music_ini();
switch(MD.gameState){
case GAME_STATE_TITLE:
Title();
break;
case GAME_STATE_LOAD://初回のみ入る処理
load(); //データロード
StateChange(GAME_STATE_NOVEL_INI);
break;
case GAME_STATE_INI://STGを始める前に行う初期化
ini();
load_story();
MD.gameState=GAME_STATE_MAIN;
break;
case GAME_STATE_MAIN://通常処理
calc_ch(); //キャラクタ計算
ch_move(); //キャラクタの移動制御
cshot_main();//自機ショットメイン
enemy_main();//敵処理メイン
shot_main(); //ショットメイン
boss_shot_main();
out_main(); //当たり計算
effect_main();//エフェクトメイン
graph_main();//描画メイン
if(boss.flag==0)
stage_count++;
break;
case GAME_STATE_NOVEL_INI:
novel_ini();
MD.gameState=GAME_STATE_NOVEL;
break;
case GAME_STATE_NOVEL:
novel_main();
if(novel.EndFlag==1){
if(MD.beforeState==GAME_STATE_LOAD)StateChange(GAME_STATE_INI);
}
break;
default:
printfDx("不明なfunc_state\n");
break;
}
music_play();
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
count++;
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
//novel.cpp
#include "../include/GV.h"
#include <math.h>
char String[100][256];
char StringBuf[STRBUF_HEIGHT][STRBUF_WIDTH*2+1] ; // 仮想テキストバッファ
int CursorX,CursorY; // 仮想画面上での文字表示カーソルの位置
int SP,CP; // 参照する文字列番号と文字列中の文字ポインタ
int KeyWaitFlag; // ボタン押し待ちフラグ
int Count; // フレームカウンタ
//テキスト読み込みの関数
void load_Text();
void novel_ini(){
//テキストの読み込み
load_Text();
// フォントのサイズセット
SetFontSize( MOJI_SIZE );
// 描画位置の初期位置セット
CursorX = 0 ;
CursorY = 0 ;
// フレームカウンタ初期化
Count = 0 ;
// 参照文字位置をセット
SP = 0 ; // 1行目の
CP = 0 ; // 0文字
}
void load_Text(){
char fname[32]={"0.txt"}; //テキストファイルの場所
int fp; //ファイルポインタ
char input; //仮テキスト格納
// 参照文字位置をセット
SP = 0 ; // 1行目の
CP = 0 ; // 0文字
fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
while(1){
input=FileRead_getc(fp);//1文字取得する
if(input==EOF)break;
if(input!='\r'){
String[SP][CP]=input;
CP++;
}
else{
CP=0;
SP++;
}
}
}
void novel_main(){
char OneMojiBuf[ 3 ]; // 1文字分一時記憶配列
int i,j;
if( MD.EndFlag == 0 )
{
char Moji;
// ボタン押し待ちフラグがたっていた場合はボタンが押されるまでここで終了
if( KeyWaitFlag == 1 )
if(CheckHitKeyAll() != 0 )KeyWaitFlag = 0;// ボタンが押されていたら解除
else
{
// 文字の描画
Moji = String[ SP ][ CP ] ;
switch( Moji )
{
case '\n': // 改行文字
// 改行処理および参照文字位置を一つ進める
Kaigyou() ;
CP++;
break ;
case 'B' : // ボタン押し待ち文字
// ボタンが離されるまで待つ
while( ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
// ボタン押し待ちフラグをたてる
KeyWaitFlag = 1 ;
CP ++ ;
break ;
case 'E' : // 終了文字
// 終了フラグを立てるおよび参照文字位置を一つ進める
MD.EndFlag = 1 ;
CP ++ ;
break ;
case 'C' : // クリア文字
// 仮想テキストバッファを初期化して描画文字位置を初期位置に戻すおよび参照文字位置を一つ進める
for( i = 0 ; i < STRBUF_HEIGHT ; i ++ )
for( j = 0 ; j < STRBUF_WIDTH * 2 ; j ++ )
StringBuf[ i ][ j ] = 0;
CursorY = 0 ;
CursorX = 0 ;
CP ++ ;
break ;
default : // その他の文字
// 1文字分抜き出す
OneMojiBuf[ 0 ] = String[ SP ][ CP ] ;
OneMojiBuf[ 1 ] = String[ SP ][ CP + 1 ] ;
OneMojiBuf[ 2 ] ='\0';
// 1文字テキストバッファに代入
StringBuf[ CursorY ][ CursorX * 2 ] = OneMojiBuf[ 0 ] ;
StringBuf[ CursorY ][ CursorX * 2 + 1 ] = OneMojiBuf[ 1 ] ;
// 参照文字位置を2バイト勧める
CP += 2 ;
// カーソルを一文字文進める
CursorX ++ ;
// テキストバッファ横幅からはみ出たら改行する
if( CursorX >= STRBUF_WIDTH ) Kaigyou() ;
break ;
}
// 参照文字列の終端まで行っていたら参照文字列を進める
if(String[ SP ][ CP ] == '\0' )
{
SP ++ ;
CP = 0 ;
}
}
}
// 背景エフェクトの描画
{
int Color ;
Color = ( int )( sin(Count/ 100.0 ) * 80.0 + 125.0 ) ;
DrawBox( 0 , 0 , 640 , 480 , GetColor( Color , 0 , 0 ) , TRUE ) ;
Count ++ ;
}
// テキストバッファの描画
for( i = 0 ; i < STRBUF_HEIGHT ; i ++ )
{
DrawString( 8 , i * MOJI_SIZE , StringBuf[ i ] , GetColor( 255 , 255 , 255 ) ) ;
}
}
// 改行関数
void Kaigyou( void )
{
// 描画行位置を一つ下げる
CursorY ++ ;
// 描画列を最初に戻す
CursorX = 0 ;
// もしテキストバッファ縦幅からはみ出るならテキストバッファを縦スクロールさせる
if( CursorY >= STRBUF_HEIGHT )
{
int i , j ;
for( i = 1 ; i < STRBUF_HEIGHT ; i ++ )
{
for( j = 0 ; j < STRBUF_WIDTH * 2 ; j ++ )
{
StringBuf[ i - 1 ][ j ] = StringBuf[ i ][ j ] ;
}
}
// 描画行位置を一つあげる
CursorY -- ;
}
}