文字がうまく表示されません

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

文字がうまく表示されません

#1

投稿記事 by アトラス » 16年前

初めての投稿になります。
現在「ゲームプログラミングの館」の解説を参考にRPGを作ろうとしているのですが、
行き詰ってしまったので質問させていただきます。
ちなみにC言語は今回がはじめてです。
--------------------------------------------------------------------------------------------
#include "DxLib.h"

int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}

int title(){
    int Key[256];
	int com=1;
    int color1,color2,color3,white,blue;
    white=GetColor( 255 , 255 , 255 );
	blue=GetColor( 0 , 255 , 255 );

    while(!ProcessMessage() && GetHitKeyStateAll_2(Key)==0 && Key[ KEY_INPUT_RETURN ]!=1 ){
            //↑メッセージ処理       ↑キーボード入力状態保存       
        color1=white; color2=white; color3=white;

		if(Key[ KEY_INPUT_DOWN ] == 1) com++;
		else if(Key[ KEY_INPUT_UP ] == 1) com--;

		if(com==0){
			com=3;
		}else if(com==4){
			com=1;
		}else if(com==1){
			color1 = blue ; 
		}else if(com==2){
			color2 = blue ;
		}else{
			color3 = blue;
		}
        DrawString(280,250, "始めから" ,color1);//文字列表示
        DrawString(280,300, "続きから" ,color2);//文字列表示
        DrawString(280,350, "EXIT" ,color3);//文字列表示
	}


return com;

}

void map(int mapn){
(省略)
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    int f_status=0;
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

	while(1){
		if(f_status ==0 ){
			f_status = title();
		}else if( f_status ==1 ){
			map(0);
			f_status=0;
		}else if ( f_status ==2 ){
			map(1);
			f_status=0;
		}else{
			return 0;
		}
	}


    DxLib_End();
    return 0;
}

---------------------------------------------------------------------------------------------
関数の説明をすると、
titleはタイトル画面で、十字キーの上下でメニュー選択、エンターキーで決定します。
「始めから」を選んだなら1、「続きから」なら2、「EXIT」なら3を返します。
mapは引数mapnに応じたマップを表示、それと主人公の移動もこの関数で行ってます。
この関数はエスケープキーで終了するようにしました。
メイン関数では f_statusの値で条件分けしてます。

問題なのですが、「始めから」もしくは「続きから」を選び、エスケープキーを押してもタイトル画面の文字が表示されません。(画面にはマップが表示されたまま)
エスケープを押したあとに、
エンターを押すとmap(0)、↓を一回押した後エンターでmap(1)の処理が行われていることが確認できたので、
文字表示だけがうまくいってないようです。
一回目(起動時)にはきちんと表示されているので、余計に分からなくて非常に悩んでおります。
どなたかご指南ください。

conio

Re:文字がうまく表示されません

#2

投稿記事 by conio » 16年前

メインループがおかしいですね。
ClearDrawScreen()、ScreenFlip() が呼ばれてないので画面がクリアされていません。

たまたま同じ場所に表示しているので問題なく動いているように見えますが、
文字列の座標を移動させたらおかしなことになる筈です。


とりあえず、単純に作ってみました。
---------------------------------------------------------------------------------------------------
#include "DxLib.h"

enum SequenceID{
	SEQ_TITLE,//タイトル
	SEQ_OPENING,//初めから
	SEQ_CONTINUE,//続きから
	SEQ_EXIT//終わり
};
SequenceID NowSequence = SEQ_TITLE;//最初はタイトル

int Key[256];
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}

void Title(void){
	static int com = 0;
	int color[3] = {0};
	int white,blue;
    white = GetColor( 255 , 255 , 255 );
	blue = GetColor( 0 , 255 , 255 );

	for(int i = 0; i < 3; i++)
        color = white;

		if(Key[ KEY_INPUT_DOWN ] == 1){
			com = (com + 1) % 3;
		}else if(Key[ KEY_INPUT_UP ] == 1){
			com = (com + 2) % 3;
		}
		color[com] = blue;

        DrawString(280,250, "始めから" ,color[0]);//文字列表示
        DrawString(280,300, "続きから" ,color[1]);//文字列表示
        DrawString(280,350, "EXIT" ,color[2]);//文字列表示

		if(Key[ KEY_INPUT_RETURN ] == 1){
			switch(com)
			{
				case 0:NowSequence = SEQ_OPENING;
					   break;
				case 1:NowSequence = SEQ_CONTINUE;
					   break;
				case 2:NowSequence = SEQ_EXIT;
					   break;
				default:
					break;
			}
			com = 0;
		}
}

void Opening(void)
{
	int color;
    color = GetColor( 255 , 255 , 0 );
    DrawString(300,220, "☆オープニングです☆" ,color);//文字列表示
}

void Continue(void)
{
	int color;
    color = GetColor( 0 , 255 , 255 );
    DrawString(300,220, "●つづきから●" ,color);//文字列表示
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll_2( Key ) && !Key[KEY_INPUT_ESCAPE] && NowSequence != SEQ_EXIT){
              //↑メッセージ処理         ↑画面をクリア           ↑キーボード入力状態取得      ↑ESCが押されていない
		SetDrawScreen( DX_SCREEN_BACK );// 描画先を裏画面に設定

		switch(NowSequence)
		{
			case SEQ_TITLE:Title();
							break;
			case SEQ_OPENING:Opening();
							break;
			case SEQ_CONTINUE:Continue();
							break;
			default:break;
		}
		ScreenFlip();
	}
    DxLib_End();
    return 0;
}
---------------------------------------------------------------------------------------------------

アトラス

Re:

#3

投稿記事 by アトラス » 16年前

返事が遅れてしまいすみませんが、conioさん、回答ありがとうございます。
試してみたところ、正常に動くようになりました。
あと「%」をうまく使えばプログラムがスマートになるんですね。
勉強になりました。
本当にありがとうございました!

閉鎖

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