Dxライブラリのサンプルコードについて
以下のサウンドノベル風ゲームのサンプルコードですが、
ttp://dxlib.o.oo7.jp/dxprogram.html#N20
半角文字を奇数打ち込むと表示がおかしくなってしまいます
他のゲームでも利用できるように改変したものになりますが、どのようにすれば半角文字も使えるようになるでしょうか?
改変内容は、複数の文字列を同時に扱えるようにクラスにまとめたのと、フォント付き文字で使えるようにしたのと
文字を開業するまでの幅を指定できるようにしたのと
改行文字(@)で改行できるので元の文章を複数の行の配列に分ける必要がないと思い、
複数行の文章を読み込めず、一行の文章しか読み込めなくしたぐらいです
描画速度は速いまま保ちたいのですができれば好きな速さに変更できるようにしたいと思っています
// サウンドノベル風文字列描画、テキストバッファ使用バージョン
#include "DxLib.h"
#include <math.h>
class Novel {
private:
//仮想テキストバッファの横サイズ縦サイズの最大値
#define STRBUF_WIDTH_MAX 50
#define STRBUF_HEIGHT_MAX 20
char OneMojiBuf[3]; // 1文字分一時記憶配列
char StringBuf[STRBUF_HEIGHT_MAX][STRBUF_WIDTH_MAX * 2 + 1] = {0}; //仮想テキストバッファ
int CursorX = 0, CursorY = 0; //仮想画面上での文字表示カーソルの位置
int CP = 0; //参照する文字列番号と文字列中の文字ポインタ
int EndFlag = 0; //終了フラグ
int KeyWaitFlag = 0; //ボタン押し待ちフラグ
int font_h; //描画するフォントのハンドル
int x_max; //描画できる文字列の長さ(x)
char String[1024];
void kaigyou() {
CursorY++; //描画行位置を一つ下げる
CursorX = 0; //描画列を最初に戻す
if (CursorY >= STRBUF_HEIGHT_MAX) { //もしテキストバッファ縦幅からはみ出るならテキストバッファを縦スクロールさせる
for (int i = 1; i < STRBUF_HEIGHT_MAX; i++) {
for (int j = 0; j < STRBUF_WIDTH_MAX * 2; j++) {
StringBuf[i - 1][j] = StringBuf[i][j];
}
}
CursorY--; // 描画行位置を一つあげる
}
}
public:
Novel(int X_max, int Font, const char string[]) {
x_max = X_max;
//フォントのサイズセット
font_h = Font;
strcpy_s(String, string);
}
void Calc() {
//サウンドノベル風文字列描画処理を行う
//ただし終了フラグが1だった場合は処理をしない
if (EndFlag == 0){
char Moji;
//ボタン押し待ちフラグがたっていた場合はボタンが押されるまでここで終了
if (KeyWaitFlag == 1){
if (CheckHitKeyAll() != 0){
KeyWaitFlag = 0; //ボタンが押されていたら解除
}
else return;
}
else {
//文字の描画
Moji = String[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 (int i = 0; i < STRBUF_HEIGHT_MAX; i++){//仮想テキストバッファを初期化して描画文字位置を初期位置に戻すおよび参照文字位置を一つ進める
for (int j = 0; j < STRBUF_WIDTH_MAX * 2; j++){
StringBuf[i][j] = 0;
}
}
CursorY = 0;
CursorX = 0;
CP++;
break;
default: //その他の文字
//1文字分抜き出す
OneMojiBuf[0] = String[CP];
OneMojiBuf[1] = String[CP + 1];
OneMojiBuf[2] = '\0';
//1文字テキストバッファに代入
StringBuf[CursorY][CursorX * 2] = OneMojiBuf[0];
StringBuf[CursorY][CursorX * 2 + 1] = OneMojiBuf[1];
//参照文字位置を2バイト進める
CP += 2;
//カーソルを一文字文進める
CursorX++;
//テキストバッファ横幅からはみ出たら改行する
if (GetDrawStringWidthToHandle(StringBuf[CursorY], strlen(StringBuf[CursorY]), font_h) >= x_max) kaigyou();
break;
}
//参照文字列の終端まで行っていたら参照文字列を進める
if (String[CP] == '\0'){
CP = 0;
EndFlag = 1;
}
}
}
}
void Draw(int x, int y, int color) {
//テキストバッファの描画
for (int i = 0; i < STRBUF_HEIGHT_MAX; i++) {
DrawStringToHandle(x, i * GetFontSizeToHandle(font_h) + y, StringBuf[i], color, font_h);
}
}
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow){
ChangeWindowMode(TRUE);
SetGraphMode(640, 480, 16);
if (DxLib_Init() == -1) //DXライブラリ初期化処理
return -1; //エラーが起きたら直ちに終了
//描画先を裏画面にセット
SetDrawScreen(DX_SCREEN_BACK);
Novel novel(630, CreateFontToHandle(NULL, 26, 3, DX_FONTTYPE_ANTIALIASING_EDGE_8X8),
"これは元のDXライブラリ公式サイトのサンプルプログラムを様々なゲームで利用しやすいように\
描画する位置、Bフォント、B色、B改行するまでの横幅などを指定できるようにしたものです。B@\
ただし文字が表示されていくスピードは変更できませんし、いくつかバグが存在します。E");
//ループ
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
novel.Calc();
ClearDrawScreen(); //画面のクリア
DrawBox(0, 0, 640, 480, GetColor(0, 100, 0), TRUE); //背景エフェクトの描画
novel.Draw(0, 100, GetColor(255, 255, 255));
ScreenFlip(); //裏画面の内容を表画面に反映させる
}
DxLib_End(); //DXライブラリ使用の終了処理
return 0; //ソフトの終了
}
あと、上のコードでビルドしたらわかるのですが一部の文字が描画する時におかしくなったり
Bや@などのコードが正常に読み込まれずにそのまま描画されたりするのですが、これも半角文字の問題を修正すれば治ると思っています
ただ直し方が分からないのでご教授願います