画像の上に文字を表示させたいです

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

画像の上に文字を表示させたいです

#1

投稿記事 by ちょびっツ » 8年前

ノベルゲームのように文字を表示しようとしているのですが、それ自体は正しくできました。
ですが、メッセージウィンドウなどの画像の上に文字を表示しようとして色々と書き換えたりLoadGraph()の場所を変えたりしましたが、
未だに文字だけが表示されて画像が一向に表示されません。
メッセージウィンドウなどの画像の上に文字を表示するようにするためにはどうしたらよいですか?

OS:Windows Vista
コンパイラ:VisualStudio 2010
ライブラリ:DXライブラリ


コード:


#include "DxLib.h"

int i=0,j,ch_i=0,counter=0,White;
char Key[256],oldKey[256]={},disp[80]="",ch[20][80]={
        "(ぐきゅぅぅ・・・・・・)",
        "腹減った、腹が減った・・・・・・(ガクッ",
        "・・・・・・・・・・・・・・・おい、ちょっと待て",
        "目の前におなかを空かせた可愛い子猫ちゃんがいるんだぞ?",
        "シカトは良くないぜ",
        "んっ? お前、その手に持ってるのって・・・・・・",
        "キ、キノコだ、キノコじゃないか!",
        "それくれ!!!",
        "・・・・・・あ? よこさねぇって、さっきも言ったとおり私は腹が減ってるんだよ",
        "理由はそれで十分だと思うんだけどなぁ",
        "えっ、理不尽だって?",
        "まったく、肝っ玉の小さい奴だなお前は",
        "でも、たかるってのは私の性に合わない気がするんだよな",
        "・・・・・・よし、絵札録で勝負だ!!",
        "幻想郷で今、はやってるんだぜ?それぐらい知ってるだろ",
        "私が勝ったら、そのキノコと身包み全部いただくぜ",
        "・・・・・えっ、私が負けたら?",
        "う~ん・・・・ そうだ、私の身包みをくれてやるよ!",
        "これで同じ条件なんだ、文句はないはずだぜ?",
        "よっしゃ、いっちょ勝負だ!!!",
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
        if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;  //ウインドウ化と初期化
        SetDrawScreen( DX_SCREEN_BACK );  //描画先を裏画面に設定	
		
        int image, Sound;

        Sound = LoadSoundMem("Impulsive Fly.mp3");  //mp3ファイルを読み込み、ハンドルをint型変数へ格納
		
        int White = GetColor(255,255,255);  //白色の取得

        PlaySoundMem(Sound, DX_PLAYTYPE_BACK);  //バックグラウンド再生
		
        while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
        {
                   image = LoadGraph("メッセージウインド.png");  //pngファイルを読み込み、ハンドルをint型変数へ格納
                   DrawGraph( 0, 225, image, FALSE );  //画像を表示
				
                   for(j=0;j<256;j++)
	      {
	                   if(oldKey[j]==0 && Key[j]==1)
		      Key[j]=2;
		      oldKey[j]=Key[j];
	      }
				
	      if(Key[KEY_INPUT_RETURN]==2)  //前回押されてなくて、今回押されていたら
	      {
	                   i=0;  //iを初期値に戻し
	                   ch_i++;  //表示する配列を1つずらす
		      if(ch_i==20)  //これ以上表示する配列がなくなったらbreak;
			   break;
	      }
 
	        //配列の終端-2以下で、今回コピーするiまでの配列要素のi番目が\0じゃなくカウンターが5の倍数なら
	      if(i<=80-2 && ch[ch_i][i]!='\0' && counter%5==0)
	      {
		      i+=2;  //全角文字なので配列要素2つずつカウントアップ
		      strncpy(disp,ch[ch_i],i);  //iバイトまでの配列要素をdisp配列にコピー
		      disp[i]='\0';  //終端記号を代入
	      }
  	      DrawFormatString(10,420,White,"%s",disp);  //disp配列の文字データを表示
	      counter++;

   	      ScreenFlip();  //裏画面を表画面に反映
	      }
                  DxLib_End() ;
	     return 0 ;
}


アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: 画像の上に文字を表示させたいです

#2

投稿記事 by h2so5 » 8年前

画像ファイルが正常に読み込まれているかがまず怪しいです。
LoadGraphの戻り値を確認してみてください。

ちょびっツ

Re: 画像の上に文字を表示させたいです

#3

投稿記事 by ちょびっツ » 8年前

> h2so5さん

LoadGraph()の戻り値はint型になっているので、DrawGraph()で大丈夫だと思うのですが・・・・
どうなのでしょう?

文字表示よりも画像表示が先ですし、そっちの影響はないと考えられますし

UN
記事: 18
登録日時: 8年前
住所: 神奈川県

Re: 画像の上に文字を表示させたいです

#4

投稿記事 by UN » 8年前

DXLib使ったことがないペーペーなので、答えていいかわからなかったのですが

image = LoadGraph("メッセージウインド.png"); //pngファイルを読み込み、ハンドルをint型変数へ格納
↑メインループでよんでいることが気になります。

現状メインループをいくらよんでも落ちないのですよね?
LoadGraphとかうたっているくらいなので、基本的には画像読み込み時に
メモリを消費するわけで、普通は数秒もすれば、いくらメモリの多いPCでも枯渇することが予想されますが、
そうはならないことを考えると、

1:LoadGraphに以前読み込んだ画像がきた場合、image にエラー値がかえっている
2:imageには1,2...と適正な値が入ったとしても、既に読み込んだことのある画像はすっとばすので
imageだけがインクリメントされている

とか色んなことを考えてしまいます。
image = LoadGraph("メッセージウインド.png"); //pngファイルを読み込み、ハンドルをint型変数へ格納
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
{
とかで、メインループ外にだすとかどうでしょうか。
あとファイル名が日本語なのも若干気になりました。
DXLib未経験者が答えてすいませんでした。

アバター
MNS
記事: 35
登録日時: 9年前

Re: 画像の上に文字を表示させたいです

#5

投稿記事 by MNS » 8年前

ちょびっツ さんが書きました:LoadGraph()の戻り値はint型になっているので、DrawGraph()で大丈夫だと思うのですが・・・・
どうなのでしょう?

文字表示よりも画像表示が先ですし、そっちの影響はないと考えられますし
それ(int)は戻り値の型であって、戻り値自体は具体的な値です。
開発環境のデバッグ機能を使ってみたり、printfDx("値:%d\n",image); 等で値を出力してみてください。
その値が-1なら、それは読み込まれていないということです。
画像が読み込まれていなければ、画像のファイル名を確認したり、ある場所が正しいか確かめてみてください。

ちょびっツ

Re: 画像の上に文字を表示させたいです

#6

投稿記事 by ちょびっツ » 8年前

> UNさん
詳しいご回答ありがとうございます。
確かにファイル名が日本語でしたので、変更後デバッグしたところ
表示はされませんでしたが、やはり戻り値が-1になっていたので
メインループからimage = LoadGraph()を出しましたら成功しました。
ありがとうございます。

> MNSさん
デバッグ時に"imageファイルが読み込まれませんでした"と出ていまして
戻り値自体の値が-1になっていましたので、UNさんのご説明にあったようにしたところ
正しく表示することができました。
ありがとうございました。
printfDX()もずいぶんと役に立ちました、ありがとうございます。

ちょびっツ

Re: 画像の上に文字を表示させたいです

#7

投稿記事 by ちょびっツ » 8年前

コード:



#include "DxLib.h"

int i=0,j,ch_i=0,counter=0,White;
char Key[256],oldKey[256]={},disp[80]="",ch[20][80]={
        "(ぐきゅぅぅ・・・・・・)",
        "腹減った、腹が減った・・・・・・・(ガクッ",
        "・・・・・・・・・・・・・・・おい、ちょっと待て",
        "目の前におなかを空かせた可愛い子猫ちゃんがいるんだ",
        "シカトは良くないぜ",
		"んっ? お前、その手に持ってるのって・・・・・・",
		"キ、キノコだ、キノコじゃないか!",
		"それくれ!!!",
		"・・・・・あ? よこさねぇって、さっきも言ったが私は腹が減ってるんだよ",
		"理由はそれで十分だと思うんだけどな",
		"えっ、理不尽だって?",
		"まったく、肝っ玉の小さい奴だぜ",
		"でも、たかるってのは私の性に合わない気がするんだよな",
		"・・・・・・よし、絵札録で勝負だ!!",
		"幻想郷で今、はやってるんだぜ?それぐらい知ってるだろ",
		"私が勝ったら、そのキノコと身包み全部いただくぜ",
		"・・・・・えっ、私が負けたら?",
		"う~ん・・・・ そうだ、私の身包みをくれてやるよ!",
		"これで同じ条件なんだ、文句はないはずだぜ?",
		"よっしゃ、いっちょ勝負だ!!!",
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
        if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;//ウインドウ化と初期化
		SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定	
		
		int image, Sound;
		image = LoadGraph("MessageWindow2.png");//pngファイルを読み込み、ハンドルをint型変数へ格納
		Sound = LoadSoundMem("Impulsive Fly.mp3");//mp3ファイルを読み込み、ハンドルをint型変数へ格納
		
		int Black = GetColor(0, 0, 0);//白色の取得
			
		PlaySoundMem(Sound, DX_PLAYTYPE_BACK);//バックグラウンド再生
		
		while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
		{
			DrawGraph( 0, 350, image, TRUE );//画像を表示
			for(j=0;j<256;j++)
	
			{
					if(oldKey[j]==0 && Key[j]==1)
							Key[j]=2;
					oldKey[j]=Key[j];
			}
				
			if(Key[KEY_INPUT_RETURN]==2)// 前回押されてなくて、今回押されていたら
			{
				i=0;// iを初期値に戻し
				ch_i++;// 表示する配列を1つずらす
				if(ch_i==20)// これ以上表示する配列がなくなったらbreak;
					break;
			}
 
			// 配列の終端-2以下で、今回コピーするiまでの配列要素のi番目が\0じゃなくカウンターが5の倍数なら
			if(i<=80-2 && ch[ch_i][i]!='\0' && counter%5==0)
			{
				i+=2;// 全角文字なので配列要素2つずつカウントアップ
				strncpy(disp,ch[ch_i],i);// iバイトまでの配列要素をdisp配列にコピー
				disp[i]='\0';// 終端記号を代入
			}
			DrawFormatString(10, 400, Black, "%s", disp);//disp配列の文字データを表示
			counter++;

			ScreenFlip();//裏画面を表画面に反映
		}
		DxLib_End() ;
		return 0 ;
}




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

Re: 画像の上に文字を表示させたいです

#8

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

入力状態の計算がややこしそうなので、
http://dixq.net/g/02_09.html
こちらの関数を使われてはいかがでしょう?
gpUpdateKeyをループの中で呼べば、Keyのデータが常に更新され、使用出来ます。

閉鎖

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