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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cola119

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

#1

投稿記事 by cola119 » 14年前

お世話になっています。

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();
これを実行するとなぜか一文字ずつ表示されません・・・
なぜでしょうか。

box
記事: 2002
登録日時: 15年前

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

#2

投稿記事 by box » 14年前

cola119 さんが書きました: うまくいきません・・。
これを実行するとなぜか一文字ずつ表示されません・・・
一文字ずつ表示せずにどう表示するのか、具体的に説明してください。

上記のような書き方ですと、実質的には「何も言っていない」のと同じです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 14年前

文字列と文字の表示を混同していると思われます。
それとScreenFlip()があるとバッファが切り替わるので思ったような表示にはなりませんよ。
漢字コードの処理も行わないと行けません。

参考。
「DXライブラリ置き場 サンプルプログラム」
http://homepage2.nifty.com/natupaji/DxL ... am.html#N6
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

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

#4

投稿記事 by Dixq (管理人) » 14年前

よくあるサウンドノベルみたいなことがしたいんですね。
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さんが仰るように多バイト文字があれば、その処理は別にしないといけません。

cola119

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

#5

投稿記事 by cola119 » 14年前

ありがとうございます><

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

閉鎖

“C言語何でも質問掲示板” へ戻る