たびたびすいませんが質問です。

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

たびたびすいませんが質問です。

#1

投稿記事 by マウ » 16年前

自分は今矢印キーで選択し、Zで決定するという動作を作っています。
ですが、矢印キーで選択した項目をZで決定すると、選択した項目の場所に定まらないで上の項目に行ったりしてしまいます。
この原因がいまいちわからないです。
Cは最近はじめたばかりです。
原因の場所はたぶんこのプログラムだと思うんですが・・・・
前の質問時は規約をみないですいませんでした。
//カーソル移動処理
	const int HEAD = 0;
	const int TAIL = 3;

	while(ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
	while(ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){}
		 //カーソル描画
	DrawBox( 43 , 60 + cursorPos * 30 , 59 , 60 + cursorPos * 30 + 16 , GetColor( 255 , 255 , 0 ),TRUE ) ;
	if( KeyBuf[KEY_INPUT_UP] ==1 )
		cursorPos = (cursorPos == HEAD) ? TAIL : (cursorPos - 1);
	else if( KeyBuf[KEY_INPUT_DOWN] ==1 )
		cursorPos = (cursorPos == TAIL) ? HEAD : (cursorPos + 1);
		
	if( KeyBuf[KEY_INPUT_Z] != 0 )  // 決定処理
	{
	  switch( cursorPos )
	  {
		case 0: setState( 5 ); break;
		case 1: setState( 6 ); break;
		case 2: setState( 7 ); break;
		case 3: setState( 8 ); break;
				//
		default: break;
	  }
	}

ねこ

Re:たびたびすいませんが質問です。

#2

投稿記事 by ねこ » 16年前

while(ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
while(ProcessMessage() == 0 && CheckHitKeyAll() == 0 ){}
これはどうしても必要ですか?
この処理だとそれぞれボタンを押した時に処理するため、わざわざ止める必要はないと思いますが。

conio

Re:たびたびすいませんが質問です。

#3

投稿記事 by conio » 16年前

全体的にプログラムがおかしい部分があるので、
一から作り直したほうが上手く行くかもしれませんよ。

一応簡単に作ってみたのですが、カーソルで選択するというのは、こんな感じですかね?
(分岐処理への移動はエンターキーになってます)
-----------------------------------------------------------------------------------------------
#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;
} 

enum StateID{
	STATE_START,
	STATE_CONTINUE,
	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] = {	{100, 100, "START", COLOR_WHITE, STATE_START},
						{100, 120, "CONTINUE",COLOR_WHITE, STATE_CONTINUE},
						{100, 140, "OPTION",COLOR_WHITE,STATE_OPTION},
						{100, 160, "EXIT",COLOR_WHITE, STATE_EXIT}};

void Start(void)
{
	if(Key[KEY_INPUT_Z] == 1){
		state = STATE_SELECT;
	}
	DrawString( 100, 100 , "Start画面です。" ,  Color[COLOR_CYAN]);
	DrawString( 100, 120 , "※Zキーで戻ります。" ,  Color[COLOR_WHITE]);
}
void Continue(void)
{
	if(Key[KEY_INPUT_Z] == 1){
		state = STATE_SELECT;
	}
	DrawString( 100, 100 , "Continue画面です。" ,  Color[COLOR_BLUE]);
	DrawString( 100, 120 , "※Zキーで戻ります。" ,  Color[COLOR_WHITE]);
}
void Option(void)
{
	if(Key[KEY_INPUT_Z] == 1){
		state = STATE_SELECT;
	}
	DrawString( 100, 100 , "Option画面です。" ,  Color[COLOR_GREEN]);
	DrawString( 100, 120 , "※Zキーで戻ります。" ,  Color[COLOR_WHITE]);
}
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)
{
	static int NowPt = 0;
	static const int ChoiceNum = sizeof(choices)/sizeof(choices[0]);
	
	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);
}

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

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

	SetColor();
	typedef void(*Func)();
	Func fc[/url] = {Start, Continue, 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;
}
-----------------------------------------------------------------------------------------------

マウ

Re:

#4

投稿記事 by マウ » 16年前

ありがとうございました。本当にためになりました。

閉鎖

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