文字表示について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
マスダ
記事: 3
登録日時: 13年前

文字表示について

#1

投稿記事 by マスダ » 13年前

はじめまして。


今私は学校のグループ製作で音楽ゲームを作っています。
私は曲選択プログラムの担当になったのですが、プログラムを組んでいる最中に詰まってしまい、こちらで質問をさせていただくことにしました。

分からないのは、曲名を表示する部分です。
プログラムを起動した際一瞬だけ文字(曲名)が表示されるのですが、すぐに消えてしまうのです。

以下ソースコードです

コード:

 #include "DxLib.h"
#include <stdio.h>
#include "musicsel.h"

#define StrH 30;//文字幅
#define mSIZE 60;//カーソルサイズ

typedef struct{
	char name[1000];//曲タイトル用
}MUSIC;


int FLoad(MUSIC l[1000]);

//画像
int MBACK;
int NOW;

MUSIC list[1000];
int n=0;//曲項目数
int i=0;//ループ用
int X=20;//曲選択X
int Y=100;//曲選択Y
int SY=100;//文字用
int push=0;//連続押し防止用

int White=GetColor( 255 , 255 , 255 );
int BLACK=GetColor( 0 , 0 , 0 );


// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine, int nCmdShow )
{

	if( DxLib_Init() == -1 ) return -1;
	SetDrawScreen( DX_SCREEN_BACK ) ;
	ChangeWindowMode( TRUE ) ;



	GLoad();//画像読み込み
	FLoad(list);//曲名ファイル読み込み


	while( 1 )
	{
		keymove();//選択枠移動
		Draw();//画像描画
                          Music();//曲名を書く

		ScreenFlip() ;
		if( ProcessMessage() < 0 ) break ;
		if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ;
	}

	DxLib_End() ;				

	return 0 ;				}

void GLoad(){
	MBACK = LoadGraph("pict/musicsel/曲選択.png");
	NOW = LoadGraph("pict/musicsel/選択枠.png");
}

void Draw(){
	DrawExtendGraph( 0 , 0 , 640 , 480, MBACK , TRUE ) ;//背景
	DrawBox( X , 100 , X+280 , 400 , White , TRUE) ;//曲名を表示する枠
	DrawExtendGraph( X , Y , X+280 , Y+60, NOW , TRUE ) ;
	Music();
}

void keymove(){
	{
		
		if(push==0){
				if( CheckHitKey( KEY_INPUT_UP ) == 1 ) Y -= mSIZE ;
				if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) Y += mSIZE ;
			push=1;
		}
		else{
				push=0;
		}

	}
int FLoad(MUSIC l[1000]){

	FILE *fp;
	int rt;//ファイルリード
	
	fp=fopen("music.txt","r");
	rt=fscanf(fp,"%s",l[n].name) ;
	while(rt!=EOF){
		n++;
		rt=fscanf(fp,"%s",l[n].name) ;
	}
	fclose(fp);
	return n;

}


void Music(){
	SetFontSize( 15 ) ;
	while(i<5){
		DrawFormatString( X+10, SY+15, BLACK, "%s", list[i].name ) ;
		i++;
		SY+=60;
	}
}
きっと背景を毎回描画しているので、それで文字が隠されてしまっているのだと思います。
ためしに関数MUSICの位置を色々変えてみたのですが、変化がありませんでした。
処理の順番以外に、何か問題があるのでしょうか。

作業環境は
OS:Windows Vista
言語:C++
使用ライブラリ:DXライブラリ
です。

私自身のC履歴ですが、C言語は3年ほど勉強しました。
C++に関しては半年程度です。

至らない点など多いかと思いますが、ご指導のほどよろしくお願いいたします。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 文字表示について

#2

投稿記事 by beatle » 13年前

Music関数の中でiを初期化しましょう。

アバター
マスダ
記事: 3
登録日時: 13年前

Re: 文字表示について

#3

投稿記事 by マスダ » 13年前

>beatleさん

お返事遅れてしまいすみません。
アドバイスありがとうございます。

ご指摘のとおりに直してみたのですが、変化がありませんでした…
他に何かまずいところがあるのでしょうか。

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

Re: 文字表示について

#4

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

iをグローバル変数にする意味はないのでローカル変数にしてwhileじゃなくてforループで回しましょう。
あと5固定ではなくnに従うのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 文字表示について

#5

投稿記事 by ISLe » 13年前

今回の件には関係ないかもしれませんが。

GetColorはDxLib_Initを呼び出したあとでないと正しい(環境に適合した)値を返しません。
外部変数の初期化で使うと直ちに呼び出されてしまいますけど。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 文字表示について

#6

投稿記事 by beatle » 13年前

よく見たらiの他にSYもwhileループの中で変更していますから、iと同様にMusic関数の中で初期化する必要がありますね。

マスダさんが直面しているバグを直すには、まず「本当にMusic関数本体、そしてMusic関数の中のDrawFormatStringの呼び出しは実行されているのだろうか?」という疑問を抱くことが重要です。そして、その疑問の真偽をどうやったら確かめられるかを考えて行動します。

そして、DrawFormatStringがちゃんと呼び出されていることが分かったら、今度は「DrawFormatStringの引数は正常なのだろうか?」という疑問を抱くようにします。そして、再度この疑問の解決を目指しましょう。

バグを直そうとしたときに、「バグがあるなあ。どっかが悪いはずだ」という漠然とした思いでソースコードを眺めても中々解決しないものです。漠然とした思いではなく、特定の疑問を頭に思い描き、その疑問を解消するように行動します。
例えば、「この行は実行されているのだろうか?」という疑問に対しては、その行の前後でprintfを呼び出し、メッセージが出力されるかどうかを確かめます。
「引数は正しいのだろうか?」という疑問に対してもprintfが使えますね。

以上、今回だけではなく、いつでも使えるデバッグの考え方を書いてみました。

アバター
マスダ
記事: 3
登録日時: 13年前

Re: 文字表示について

#7

投稿記事 by マスダ » 13年前

>softyaさん
アドバイスありがとうございます。
nでなくて5なのは、曲名を5つずつ表示するためです。



>ISLeさん
アドバイスありがとうございます。
GetColorはDXライブラリを読み込むだけではちゃんと使えないのですね。
修正しておきます。



>beatleさん
2度もありがとうございます。
SYをMusic関数内で初期化したら上手くいきました。

そうですね…確かに自分であまり深く考えずに質問してました。
身にしみるお言葉ありがとうございます。
今度何かあったら(何も起こらないのが一番ですが…)この方法で解決してみます。

閉鎖

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