汎用的にこれを使えるようにするため、下記コード(http://dxlib.o.oo7.jp/dxprogram.html 参照)の
MOJI_SIZE と STRBUF_WINDTH と STRBUF_HEIGHT の値を
引数によって変えたいと思っています(メイン関数は自作関数にします)
しかし、それらは#defineによって定義されているので、値を引数によって変えられません。
また、その定数は配列の添字に使ってることもあり、なかなかうまくいきません。
ちなみにグローバル変数をなくすため、無理やりKaigyou関数をメインの中に入れて、
StringBufはmallocを使って動的確保をしようとも試しましたが、”char * は int * 型に変換できない”、大量に”無効な間接参照”などとエラーをはかれられました
(自分がmallocに関して知識が浅薄すぎただけかもしれませんが…)
どうすれば解決できるでしょうか。よろしくお願いします。言葉足らずでしたらもうしわけありません。
環境:windows 10 , コンパイラ:BCCDevoper
#include "DxLib.h"
#include <math.h>
// 文字のサイズ
#define MOJI_SIZE 24
// 仮想テキストバッファの横サイズ縦サイズ
#define STRBUF_WIDTH 24
#define STRBUF_HEIGHT 20
char StringBuf[ STRBUF_HEIGHT ][ STRBUF_WIDTH * 2 + 1 ] ; // 仮想テキストバッファ
int CursorX , CursorY ; // 仮想画面上での文字表示カーソルの位置
int SP , CP ; // 参照する文字列番号と文字列中の文字ポインタ
int EndFlag ; // 終了フラグ
int KeyWaitFlag ; // ボタン押し待ちフラグ
int Count ; // フレームカウンタ
char String[][ 256 ] =
{
" ゲームプログラムを習得するための一番の近道はとにかく沢山プログラムを組む",
"ことである。B" ,
"@ プログラムの参考書にはゲームのプログラムの方法なんて何も書かれていない、B",
"変数、B配列、B関数、Bループ、B条件分岐…Bこれらすべての説明はゲームで何に使うか",
"なんてどこにも書いていない、Bせいぜい住所録を題材にした例がある程度である。B" ,
"C プログラムは習うより慣れろなのでプログラムを組むに当たって少しでも知識が",
"つけば後はそこからは掘り下げ、広げていけば良いわけで、Bプログラムの参考書を",
"読んでいて少しでも何か出来るような気がしたらそこでとにかくプログラム",
"を打ってみることが大事である。E",
} ;
void Kaigyou( void ) ; // テキストバッファの改行処理関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow ) //ここは自作関数化する
{
char OneMojiBuf[ 3 ] ; // 1文字分一時記憶配列
int i , j ;
SetGraphMode( 640 , 480 , 16 ) ;
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
// 描画位置の初期位置セット
CursorX = 0 ;
CursorY = 0 ;
// 参照文字位置をセット
SP = 0 ; // 1行目の
CP = 0 ; // 0文字
// フォントのサイズセット
SetFontSize( MOJI_SIZE ) ;
// 描画先を裏画面にセット
SetDrawScreen( DX_SCREEN_BACK ) ;
// フレームカウンタ初期化
Count = 0 ;
// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// サウンドノベル風文字列描画処理を行う
// ただし終了フラグが1だった場合は処理をしない
if( EndFlag == 0 )
{
char Moji ;
// ボタン押し待ちフラグがたっていた場合はボタンが押されるまでここで終了
if( KeyWaitFlag == 1 )
{
if( ProcessMessage() == 0 && CheckHitKeyAll() != 0 )
{
// ボタンが押されていたら解除
KeyWaitFlag = 0 ;
}
}
else
{
// 文字の描画
Moji = String[ SP ][ CP ] ;
switch( Moji )
{
case '@' : // 改行文字
// 改行処理および参照文字位置を一つ進める
Kaigyou() ;
CP ++ ;
break ;
case 'B' : // ボタン押し待ち文字
// ボタンが離されるまで待つ
while( ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
// ボタン押し待ちフラグをたてる
KeyWaitFlag = 1 ;
CP ++ ;
break ;
case 'E' : // 終了文字
// 終了フラグを立てるおよび参照文字位置を一つ進める
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 ;
}
}
}
// 画面のクリア
ClearDrawScreen() ;
// 背景エフェクトの描画
{
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 ) ) ;
}
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
// 改行関数
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 -- ;
}
}