ページ 11

DrawString関数とchar型配列について

Posted: 2011年7月24日(日) 04:04
by cola119
お世話になっています。

DrawString関数でchar配列に格納した文字を1つずつ取り出して、描画させたいのですが、
うまくいきません・・。
コードの一部です

コード:

int COPENING::Title()
{
  char *str = "WelcomeABCDEFG\0";
  int Cr = GetColor(0, 255, 255);
  int i = 0;
  int x = 10;
  int y = 10;

  SetFontSize(FONTSIZE);

  while(CheckHitKeyAll() == 0 && ProcessMessage() == 0){
    WaitTimer(20);
    DrawString(x, y, &str[i], Cr);
    ScreenFlip();
    if(i > 13){
      i = 0;
    }
    else {
      i++;
    }
    x += FONTSIZE;
  }

  return 0;
};

/************ main関数 *********************/
Opening.Title();
//ScreenFlip();
これを実行するとなぜか一文字ずつ表示されません・・・
なぜでしょうか。

Re: DrawString関数とchar型配列について

Posted: 2011年7月24日(日) 08:45
by box
cola119 さんが書きました: うまくいきません・・。
これを実行するとなぜか一文字ずつ表示されません・・・
一文字ずつ表示せずにどう表示するのか、具体的に説明してください。

上記のような書き方ですと、実質的には「何も言っていない」のと同じです。

Re: DrawString関数とchar型配列について

Posted: 2011年7月24日(日) 09:54
by softya(ソフト屋)
文字列と文字の表示を混同していると思われます。
それとScreenFlip()があるとバッファが切り替わるので思ったような表示にはなりませんよ。
漢字コードの処理も行わないと行けません。

参考。
「DXライブラリ置き場 サンプルプログラム」
http://homepage2.nifty.com/natupaji/DxL ... am.html#N6

Re: DrawString関数とchar型配列について

Posted: 2011年7月24日(日) 12:28
by Dixq (管理人)
よくあるサウンドノベルみたいなことがしたいんですね。
cola119さんのコードを見るに、DXライブラリの基本的な考え方が違う気がします。
DXライブラリは毎フレーム全消し全描きをするのが一般的です。
しなくても出来ますが、今後の拡張性を考えると裏画面処理をして全描きするのがよいでしょう。
DXライブラリの基礎については http://dixq.net/g/ こちらを参考にして下さい。

サンプル作ってみました。こんなのでどうでしょう。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	int counter = 0, pos = 0;
	char *buf = "WelcomeABCDEFGDEFGWelcomeABCDEFGDEFG";
	char str[256]={};

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		
		DrawString( 0, 0, str, GetColor(255,255,255) );

		if( counter % 3 == 0 ){			// 1/20秒に一度(3カウントに一度)
			if( buf[ pos ] != '\0' ){	// 終端じゃなければ
				str[ pos ] = buf[ pos ];// 1文字コピー
				str[ pos + 1 ] = '\0';	// 終端付ける
				pos++;					// 文字位置進める
			}
		}

		counter++;
	}

	DxLib_End();
	return 0;
} 
あくまでサンプルなので、実際はバッファオーバーランなどに気を配ったコードにして下さい。
逆に1文字ずつ消したいのであれば・・。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	int Counter = 0, pos = 0, x = 0;
	char *str = "WelcomeABCDEFGDEFGWelcomeABCDEFGDEFG";

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		
		DrawString( x, 100, &str[pos], GetColor(255,255,255) );

		if( Counter % 5 == 0 ){			// 1/12秒に一度(5カウントに一度)
			if( str[ pos+1 ] != '\0' ){	//次が終端記号じゃなければ
				pos++;					//文字位置を進める
				x += 9;					//表示位置を進める
			}
		}

		Counter++;
	}

	DxLib_End();
	return 0;
} 
こんな感じでしょうか。
softyaさんが仰るように多バイト文字があれば、その処理は別にしないといけません。

Re: DrawString関数とchar型配列について

Posted: 2011年7月24日(日) 12:47
by cola119
ありがとうございます><

もっとDxLib勉強します。ありがとうございました!