キーについて

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

キーについて

#1

投稿記事 by YS » 15年前

項目を選択してZを押したらその項目の色が変わるようにしたいのですがどうすればいいのでしょうか。

Mist

Re:キーについて

#2

投稿記事 by Mist » 15年前

質問があいまいです。

色を変えるための分岐がわからないのか、色の変え方がわからないのかどちらでしょうか?
あと、全ての回答者が前回のYSさんの質問を見ているわけではないで、より有効な回答がほしいのであれば
開発環境は毎回必ず書きましょう。(違う人だったらごめんなさい)

分岐についてのみ回答します。
やるべきことは前の質問と同じですけど、選択されたかどうかを記憶する変数を作って表示するときに
その変数で分岐させるだけです。

YS

Re:キーについて

#3

投稿記事 by YS » 15年前

すいません。。

環境は XP

言語はc

ライブラリは Dx

色を変えるための分岐がわからないのです。。。

Mist

Re:キーについて

#4

投稿記事 by Mist » 15年前

> 色を変えるための分岐がわからないのです。。。

私にはYSさんが何がわからないのか判りません。
先にも書きましたが選択されたことが判れば項目を表示するときに分岐させるだけなんですが。
やるべきとこは前回の質問と9割以上同じなんですが、何がわからないのか具体的にしてもらえませんか?
わからない、わからないでは何も情報がありませんので回答できません。

Mist

Re:キーについて

#5

投稿記事 by Mist » 15年前

前回の質問が未解決で放置されていますが、前回の質問はクリアされましたか?

YS

Re:キーについて

#6

投稿記事 by YS » 15年前

解決をつけるのをわすれてました。。

conio

Re:キーについて

#7

投稿記事 by conio » 15年前

こんな感じで良いと思うのですが。
単純なif文ですよ。
-----------------------------
if(Zキーが押されていたら){
赤色で表示
}else{
青色で表示
}
-----------------------------

まぁ、Zキーを押すといっても色んな解釈が考えられるので何とも言えないのですが。
-----------------------------------------------------------------------------------------
【1】Zキーが押されている間 色を変える  (Zキーから指を離すと、色は元に戻る)
【2】Zキーを押した後は、色は変わったまま (Zキーから指を離しても、色は変更されたまま)
【3】Zキーを押し続けると、数秒間隔で色が変わったり元の色に戻ったりする。
【4】Zキーを一回押す毎に、色が青⇒赤⇒青という風に変わる。 (一回、Zキーから指を離さないと色は変わらない)
-----------------------------------------------------------------------------------------

>>解決をつけるのをわすれてました。。
本当に解決しましたか?
プログラムはどのようになりましたか?
以前 問題が解決した時点でのプログラムを提示してみてください。

というかプログラムを提示したほうが分かりやすいと思います。
「項目の選択して」の部分から良く分からないと感じる方も居るでしょうし。
(カーソルを合わせてクリックするのか?エンターキーを押すのか?項目とはそもそも何なのか?など)

YS

Re:キーについて

#8

投稿記事 by YS » 15年前

前の質問のものは違うものに変更しました。

それで過去にあったプログラムを参考に練習をしてるのですが、

項目を矢印で選択し、Zで決定するもので決定した部分の色が変わるというものにしたいのですが。
#include "test.h"
int Key[256];
void SetColor();
void Exit();
void Select();
void Change();
int a[ 6 ] ;
int b[ 6 ] ;
int c[ 6 ] ;
int y ;

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 Option{
	OPTION_EXIT,
	OPTION_SELECT,

};

Option state = OPTION_SELECT;

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

int Color[COLOR_MAX];

typedef struct{
	const int R;
	const int G;
	const int B;
}COLOR;

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

typedef struct{
	int Pt_X;
	int Pt_Y;
	char* str;
	ColorId c;
	const Option next;
}CHOICES;

CHOICES choices[/url] = {	{60 , 60,   "・1", COLOR_WHITE, OPTION_SELECT},
						{60 , 90,   "・2", COLOR_WHITE, OPTION_SELECT},
						{60 , 120,  "・3", COLOR_WHITE, OPTION_SELECT},
						{750 , 560, "EXIT",		  COLOR_WHITE, OPTION_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] = {Exit, Select};
	// BMP画像のメモリへの分割読み込み
	LoadDivGraph( "ball.bmp" , 6 , 6 , 1 ,  100 , 100 , a ) ;
	LoadDivGraph( "ball2.bmp" , 6 , 6 , 1 , 100 , 100 , b ) ;
	LoadDivGraph( "ball3.bmp" , 6 , 6 , 1 , 100 , 100 , c ) ;

	y = 0 ;
	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 ){
		// アニメーションパターンナンバーを変更
		y ++ ;
		if( y == 6 ) y = 0 ;

		// 一定時間待つ(『WaitTimer』使用)
		WaitTimer( 100 ) ;

		fc[state]();

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

void Select(void)
{
	static int NowPt = 0;
	static const int ChoiceNum = sizeof(choices)/sizeof(choices[0]);
	DrawBox( 30,  50, 300, 200, Color[COLOR_WHITE], FALSE );// 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
	DrawBox( 720, 50, 410, 400, Color[COLOR_WHITE], FALSE );// 四角形を描画(左上x座標,左上y座標,右下x座標,右下y座標)
	
	DrawString( 45 , 50 - 32 , "WEAPON" , Color[COLOR_WHITE] );
	DrawString( 430 , 50 - 32 , "SAMPLE" , Color[COLOR_WHITE] );
	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_WHITE;
			DrawString( choices.Pt_X , choices.Pt_Y , choices.str ,  Color[choices.c]);
	}
	DrawString( choices[NowPt].Pt_X - 20, choices[NowPt].Pt_Y , ">>" ,  Color[COLOR_BLUE]);
	switch(NowPt)
	{
		// グラフィックの描画(『DrawGraph』使用)
		case 0: DrawGraph( 410 , 50 , a[ y ] , FALSE ) ; break;
		case 1: DrawGraph( 410 , 50 , b[ y ] , FALSE ) ; break;
		case 2: DrawGraph( 410 , 50 , c[ y ] , FALSE ) ; break;
	}
	for(int i = 0; i < ChoiceNum; i++){
		if(Key[KEY_INPUT_Z]==0){
			state = choices[NowPt].next;
			choices[NowPt].c = COLOR_RED;
			DrawString( choices.Pt_X , choices.Pt_Y , choices[i].str ,  Color[choices[i].c]);
		}
	}
}
void SetColor(void)
{
	for(int i = 0, count = sizeof(ColorList) / sizeof(ColorList[0]); i < count; i++)
		Color[i] = GetColor(ColorList[i].R, ColorList[i].G, ColorList[i].B);
}

conio

Re:キーについて

#9

投稿記事 by conio » 15年前

「選択した項目の色を変える」だけなら、これで充分でしょう。

--------------------------------------------------------------------------------
#include "DxLib.h"

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;
} 

typedef struct{
	int x;
	int y;
	char* str;
}SELECT;

SELECT Select[/url] = { {100,100,"Menu 1"},
		  {100,120,"Menu 2"},
		  {100,140,"Menu 3"}};

void DrawSelect(void){
	int white = GetColor( 255, 255, 255);
	int Red = GetColor( 255, 0, 0);
	static int count = sizeof(Select) / sizeof(Select[0]); 
	static int NowPt = 0;

	if(Key[KEY_INPUT_UP] == 1){
		NowPt = (NowPt + count - 1) % count;
	}else if(Key[KEY_INPUT_DOWN] == 1){
		NowPt = (NowPt + 1) % count;
	}

	for(int i = 0; i < count; i++){
		if(Key[KEY_INPUT_Z] != 0 && i == NowPt ){
			DrawString( Select.x, Select.y, Select.str, Red);	
		}else{
			DrawString( Select.x, Select.y, Select.str, white);	
		}
	}
	DrawString( Select[NowPt].x - 40, Select[NowPt].y, "⇒", white);	
}


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

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

	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0 ){
		DrawSelect();
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}
--------------------------------------------------------------------------------

あと、YSさんが提示したプログラムで上手くいかない原因は、
Zキーを押した時点でstateの値が変更され、Select関数が呼ばれない(選択肢を表示する処理が行われない)
からです。

YS

Re:キーについて

#10

投稿記事 by YS » 15年前

Zを押したときに色が変わりますが、はなすと元に戻ってしまいます。

Zを押したら赤なら赤になり、次の選択してZを押すまで最初に選択した

部分がそのままになるようにしたいのですが。。。

いまいち言ってることがわかりにくくてすいません。。

Mist

Re:キーについて

#11

投稿記事 by Mist » 15年前

conioさんが提示してくれたプログラムでどうやって色を変えているかは理解されましたか?
理解できていれば離した後も元の戻らないようにするのは難しくありません。
自分の思い通りに動く完璧な答えを待ているだけでは成長しませんよ。
ヒントはNo:41277にあります。

YS

Re:キーについて

#12

投稿記事 by YS » 15年前

完璧なものはもとめてはいません。。

記憶させるためのフラグの変数はint型でいいのですか?

Mist

Re:キーについて

#13

投稿記事 by Mist » 15年前

変数型にはchar,short,long,int,float,double,boolというようにたくさんありますが、とりうる値の範囲や用途は異なります。
こういうのはネットで調べればすぐ出てきますので、今回の場合にどればふさわしいかは自分で考えてみてトライしてみてください。
趣味でやっているプログラムなんだから、挑戦→失敗→原因を考える→調べる→再挑戦を積極的に行ってほしいです。
何が正しいのかを答えることは簡単ですが、それがどうして正しいのかをYSさんが理解せずに言われたままに作っているだけでは、次に新しいことをしようとしても誰かに答えを聞かないと何もできなくなってしまいますよ。

conio

Re:キーについて

#14

投稿記事 by conio » 15年前

>>Zを押したときに色が変わりますが、はなすと元に戻ってしまいます。
>>Zを押したら赤なら赤になり、次の選択してZを押すまで最初に選択した
>>部分がそのままになるようにしたいのですが。。。
初めからそう述べて欲しいです。
自分は「Zキーを押したら色が変わる」という条件しか聞いていません。

それと、「一度押したらずっと色が変わり続ける」というやり方は以前のトピックで説明しました。
http://www.play21.jp/board/formz.cgi?ac ... &rln=41283

で、更に今回は排他的なので、
-----------------------------------------------------------------------------------
・何番目の項目が選択されたのかのフラグを作っておく
・ループで項目を表示する際に、添え字の変数i と フラグの値が一致すれば赤色で表示
-----------------------------------------------------------------------------------
こんな感じでいいと思います。

閉鎖

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