今DXライブラリでクイズゲームを作成しようと思っており、
問題を表示する部分をノベルゲーム風に、一文字づつ表示させたいと思っており、
試しにDXライブラリのサンプルプログラムのサウンドノベル風文字列描画を使用し、
switch文でランダムに値を入れて、その番号によってクイズの問題と、
クイズの正解番号を代入する、という形にしたいと思っているのですが、
switch文を使って問題文章を変更するところがうまくいかず、困っております。
とりあえず今はswitch文の値を変更することによって、
問題文章に違うものが表示されれば大丈夫です。
よろしくお願いします。
以下プログラムです。
// サウンドノベル風文字列描画基本
#include "DxLib.h"
// 文字のサイズ
#define MOJI_SIZE 24
int DrawPointX , DrawPointY ; // 文字列描画の位置
int SP , CP ; // 参照する文字列番号と文字列中の文字ポインタ
int mondaibangou = 1;//switch文の変更部分
int seikaibangou;
char String[][ 256 ] =
{
"問題文章 選択肢1 選択肢2 選択肢3 選択肢4 BE"
} ;
// 改行関数
int Kaigyou( void )
{
int TempGraph ;
// 描画行位置を一つ下げる
DrawPointY ++ ;
// 描画列を最初に戻す
DrawPointX = 0 ;
// もし画面からはみ出るなら画面をスクロールさせる
if( DrawPointY * MOJI_SIZE + MOJI_SIZE > 480 )
{
// テンポラリグラフィックの作成
TempGraph = MakeGraph( 640 , 480 ) ;
// 画面の内容を丸々コピーする
GetDrawScreenGraph( 0 , 0 , 640 , 480 , TempGraph ) ;
// 一行分上に貼り付ける
DrawGraph( 0 , -MOJI_SIZE ,TempGraph , FALSE ) ;
// 一番下の行の部分を黒で埋める
DrawBox( 0 , 480 - MOJI_SIZE , 640 , 480 , 0 , TRUE ) ;
// 描画行位置を一つあげる
DrawPointY -- ;
// グラフィックを削除する
DeleteGraph( TempGraph ) ;
}
// 終了
return 0 ;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int EndFlag ; // 終了フラグ
char OneMojiBuf[ 3 ] ; // 1文字分一時記憶配列
SetGraphMode( 640 , 480 , 16 ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 描画位置の初期位置セット
DrawPointX = 0 ;
DrawPointY = 0 ;
// 参照文字位置をセット
SP = 0 ; // 1行目の
CP = 0 ; // 0文字
// フォントのサイズセット
SetFontSize( MOJI_SIZE ) ;
// 終了フラグを倒す
EndFlag = 0 ;
// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
switch(mondaibangou){//switch文
case 1:{
char String[][ 256 ] =
{
"問題文章1 選択肢1 選択肢2 選択肢3 選択肢4 BE"
} ;
seikaibangou=1;
break;
}
case 2:
{
char String[][ 256 ] =
{
"問題文章2 選択肢1 選択肢2 選択肢3 選択肢4 BE"
} ;
seikaibangou=2;
break;
}
case 3:
{
char String[][ 256 ] =
{
"問題文章3 選択肢1 選択肢2 選択肢3 選択肢4 BE"
} ;
seikaibangou=3;
break;
}
}
char Moji ;
// 文字の描画
Moji = String[ SP ][ CP ] ;
switch( Moji )
{
case '@' : // 改行文字
// 改行処理および参照文字位置を一つ進める
Kaigyou() ;
CP ++ ;
break ;
case 'B' : // ボタン押し待ち文字
// ボタン押し待ちおよび参照文字位置を一つ進める
WaitKey() ;
CP ++ ;
break ;
case 'E' : // 終了文字
// 終了フラグを立てるおよび参照文字位置を一つ進める
EndFlag = 1 ;
CP ++ ;
break ;
case 'C' : // クリア文字
// 画面を初期化して描画文字位置を初期位置に戻すおよび参照文字位置を一つ進める
ClearDrawScreen() ;
DrawPointY = 0 ;
DrawPointX = 0 ;
CP ++ ;
break ;
default : // その他の文字
// 1文字分抜き出す
OneMojiBuf[ 0 ] = String[ SP ][ CP ] ;
OneMojiBuf[ 1 ] = String[ SP ][ CP + 1 ] ;
OneMojiBuf[ 2 ] = '\0' ;
// 1文字描画
DrawString( DrawPointX * MOJI_SIZE , DrawPointY * MOJI_SIZE ,
OneMojiBuf , GetColor( 255 , 255 , 255 ) ) ;
// 参照文字位置を2バイト勧める
CP += 2 ;
// カーソルを一文字文進める
DrawPointX ++ ;
// 少し待つ
WaitTimer( 10 ) ;
// 画面からはみ出たら改行する
if( DrawPointX * MOJI_SIZE + MOJI_SIZE > 640 ) Kaigyou() ;
break ;
}
// 終了フラグが1だったら終了する
if( EndFlag == 1 ) break ;
// 参照文字列の終端まで行っていたら参照文字列を進める
if( String[ SP ][ CP ] == '\0' )
{
SP ++ ;
CP = 0 ;
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}