また質問です

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

また質問です

#1

投稿記事 by マウ » 15年前

今自分がしたいのは項目を矢印キーで選択する際、項目に矢印がいったらその項目の画像を同じ画面で表示させたいのですがどのようにすればいいのでしょうか
現在のプログラム↓です
まだいろいろ抜けたりしてますが。。
#include "OP.h"
int optionImg;
<per>
int cursorPos;
int White;
int Key[256];
void SetColor();
void Start();
void Option();
void Exit();
void Select();
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;
} 

enum StateID{
	STATE_A,
	STATE_OPTION,
	STATE_EXIT,
	STATE_SELECT,
	STATE_END
};



StateID state = STATE_SELECT;

enum ColorID{
	COLOR_RED,
	COLOR_BLUE,
	COLOR_YELLOW,
	COLOR_GREEN,
	COLOR_CYAN,
	COLOR_WHITE,
	COLOR_MAX
};

int Color[COLOR_MAX];

typedef struct{
	const int r;
	const int g;
	const int b;
}COLOR;

COLOR CList[COLOR_MAX] = {	{ 255,   0,   0},
			{   0,   0, 255},
			{ 255, 255,   0},
			{   0, 255,   0},
			{ 100, 255, 255},
			{ 255, 255, 255}};

typedef struct{
	int PtX;
	int PtY;
	char* str;
	ColorID c;
	const StateID next;
}CHOICES;

CHOICES choices[/url] = {	{60 , 60,   "・?????", COLOR_WHITE, STATE_A},
						{60 , 90,   "・?????", COLOR_WHITE, STATE_OPTION},
						{60 , 120,  "・?????", COLOR_WHITE, STATE_OPTION},
						{750 , 560, "EXIT",  COLOR_WHITE, STATE_EXIT}};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode( TRUE );
	SetGraphMode( 800 , 600 , 32 ) ;

	if(DxLib_Init() == -1 ) return -1;
	SetDrawScreen( DX_SCREEN_BACK );
	SetColor();
	typedef void(*Func)();
	Func fc[/url] = {Start,  Option, Exit, Select};

	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 && state != STATE_END){

		fc[state]();

		ScreenFlip();
	}
	DxLib_End();
	return 0;
}
void Start(void)
{

}
void Option(void)
{

}
void Exit(void)
{
	static int count = 150;

	if((--count) == 0)
		state = STATE_END;
	DrawString( 100, 100 , "Exit画面です。" ,  Color[COLOR_RED]);
	DrawString( 100, 120 , "※プログラムを終了します。" ,  Color[COLOR_WHITE]);
}

void Select(void)
{
	int y;
	int image;
	static int NowPt = 0;
	static const int ChoiceNum = sizeof(choices)/sizeof(choices[0]);
	White  = GetColor( 255, 255, 255  );   // 白色の値を取得
	DrawBox( 720, 50, 410, 400, White, FALSE );  // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
	DrawBox( 30,  50, 300, 200, White, FALSE );  // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
	
	if(Key[KEY_INPUT_DOWN] == 1 || (Key[KEY_INPUT_DOWN] > 10 && Key[KEY_INPUT_DOWN] % 10 == 0)){
		choices[NowPt].c = COLOR_WHITE;
		NowPt = (NowPt + 1) % ChoiceNum;
	}else if(Key[KEY_INPUT_UP] == 1 || (Key[KEY_INPUT_UP] > 10 && Key[KEY_INPUT_UP] % 10 == 0)){
		choices[NowPt].c = COLOR_WHITE;
		NowPt = (NowPt + ChoiceNum - 1) % ChoiceNum;
	}

	for(int i = 0; i < ChoiceNum; i++){
		if(i == NowPt)
			choices.c = COLOR_YELLOW;
		DrawString( choices.PtX , choices.PtY , choices.str ,  Color[choices.c]);
	}
	DrawString( choices[NowPt].PtX - 20, choices[NowPt].PtY , "◇" ,  Color[COLOR_CYAN]);

	if(Key[KEY_INPUT_RETURN] == 1){
		state = choices[NowPt].next;
		choices[NowPt].c = COLOR_WHITE;
		NowPt = 0;
	}

}
void SetColor(void)
{
	for(int i = 0, count = sizeof(CList) / sizeof(CList[0]); i < count; i++)
		Color = GetColor(CList.r, CList[i].g, CList[i].b);
}

conio

Re:また質問です

#2

投稿記事 by conio » 15年前

これは、以前 自分が書いたコードを把握出来ないまま追記する形で製作していますよね?
(注釈を一切書かなかった自分のせいですが)

他人のコードなどを利用する場合、
理解しないまま追加していくとコードにおかしな部分が出てきます。

コードがよく分からない時は、自分の分かりやすいコードで全部作ったほうが上手く作業が進んだりしますよ。
(最終的にどうするかは自由に決めてもらってかまいません)

で、どこがおかしいかというと、文字色の指定の部分です。
自分は下記のように記述して色を選択できるようにしました。
------------------------
Color[COLOR_CYAN]
Color[COLOR_RED]
Color[COLOR_WHITE]
Color[COLOR_GREEN]
------------------------
(Colorはグローバルなint型の配列)


しかし、上記のプログラムは「White」というグローバル変数が新たに定義され、
下記のように追記されています。
-------------------------------------------------------------------------------------------
DrawBox( 720, 50, 410, 400, White, FALSE );  // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
DrawBox( 30,  50, 300, 200, White, FALSE );  // 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
-------------------------------------------------------------------------------------------

今回の場合は、Whiteというグローバル変数を作る必要はありません。
--------------------------------------------------------
DrawBox( 720, 50, 410, 400, Color[COLOR_WHITE], FALSE );
DrawBox( 30,  50, 300, 200, Color[COLOR_WHITE], FALSE );
--------------------------------------------------------
これで十分です。




で、選択肢を表示している状態でまた別の画像を表示させたい場合は、
Select関数の中でswitch文を使ってやるなどして実装できると思います。
------------------------------------------------
void Select(void)
{
   //「→ NEW GAME」などの選択肢の表示

   switch(//カーソルの場所)
   {
      case STATE_NEW_GAME: //画像A表示 break;
      case STATE_CONTINUE: //画像b表示 break;
      case STATE_NEW_GAME: //画像c表示 break;
      default:break;
   }
}
------------------------------------------------
(おおまかな内容を記述しただけなので、当然このままは動きません)

マウ

Re:また質問です

#3

投稿記事 by マウ » 15年前

カーソル位置は自分で定義していいのでしょうか?
y=60のような。

conio

Re:また質問です

#4

投稿記事 by conio » 15年前

マウさんはどう表示させたいのでしょうか?
自分の好きなように設定すれば問題ないでしょう。

真ん中に表示させたいのならば、真ん中辺りの座標にすれば良いですし、
左上に表示させたいのならば、左上付近の座標を設定すれば良いだけです。

自分が何をしたいか、どう作りたいのかに従って自由に決めてください。


ただ、他人のコードを利用して開発する場合は、
どういう関数があってどう使われているのかを把握して無いと、無駄な部分が出てきたりするので
気をつけてくださいと言うことです。

先日も述べましたが、Color[COLOR_WHITE]で白色を指定できるようにしてあるので、
新たにWhiteというグローバル変数を作るのは無駄が増えるだけになってしまいます。


また上記のプログラムでは、選択肢の座標はCHOICES型の構造体の中で定義されていますので、
その配列の要素を増やしたり、値を変えたりするようにして下さい。
------------------------------------------------------------------------
choices[/url] = {{60 , 60,   "・?????", COLOR_WHITE, STATE_A},
             {60 , 90,   "・?????", COLOR_WHITE, STATE_OPTIO},
             {60 , 120,  "・?????", COLOR_WHITE, STATE_OPTION},
	    {750 , 560, "EXIT",  COLOR_WHITE, STATE_EXIT}};
------------------------------------------------------------------------
赤字の部分を変更する。

で、コメントを見たところ、新たにyという変数を作ろうとしているようですが、
前回みたいに、またグローバル変数などを別に作って座標を設定などを行うようにすると、
何のために構造体の配列を作っているのかがわからなくなります。

上記のプログラムの場合は、構造体の配列で座標を設定しているので
その部分の値を変更するようにしてください。

閉鎖

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