SDL 게임 개발 강좌 03 (메시지 순환 과 키보드 이벤트 응답)

더 읽 기
    창 프로그램 에 있어 서 메시지 순환 과 이벤트 응답 은 매우 중요 합 니 다. 이 절 은 SDL 이 제공 하 는 API 함 수 를 이용 하여 메시지 순환 과 키보드 ESC 키 응답 을 실현 하 는 방법 을 소개 합 니 다.위 절 에 있 는 이 코드 를 주석 합 니 다:
//if( SDL_Flip( screen ) == -1 )
//{
//	return 1;
//}
//SDL_Delay( 2000 );

 
    위의 코드 는 주로 메모리 의 내용 을 화면 에 표시 한 다음 에 2 초 를 기 다 려 서 사용자 가 그림 을 볼 수 있 도록 하 는 것 입 니 다.
 
    다음은 이 부분의 테이프 코드 를 하나의 메시지 순환 으로 바 꾸 어 프로그램 이 사용자 의 메시지 에 응답 할 수 있 도록 해 야 합 니 다. 코드 는 다음 과 같 습 니 다.
 
bool bQuit = false;		//         
SDL_Event event;
while(!bQuit)			//  bQuit  true  ,      
{
	//              ,       ture,    false
	//SDL_PollEvent    ,      
	while( SDL_PollEvent( &event ) )
	{
		switch(event.type)		//       ,      
		{
		case SDL_KEYDOWN:		//         
			if(event.key.keysym.sym == SDLK_ESCAPE)	//     ESC 
			{
				bQuit = true;						//    
			}
			break;
		case SDL_QUIT:			//         ,           
			bQuit = true;							//    
			break;
		default:
			break;
		}
	}

	//             ,                   ,       
	//                    ,                  
	if( SDL_Flip( screen ) == -1 )
	{
		break;
	}
}

    windwos API 프로 그래 밍 을 배 운 사람 은 위의 코드 에 대해 잘 알 고 있 을 것 입 니 다. windows 의 메시지 순환 체제 와 비슷 하기 때문에 windows 의 메시지 순환 에 있어 서 우 리 는 보통 이렇게 씁 니 다.
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
	TranslateMessage(&msg);
	DispatchMessage(&msg);
}

     여기 서 windows 와 SDL 메시지 순환 의 차 이 는 GetMessage 가 메시지 큐 에 메시지 가 없 을 때 까지 기다 리 는 것 입 니 다.SDL폴 이 벤트 는 소식 이 있 든 없 든 바로 돌아 갑 니 다.
    사실 윈도 우즈 api 에 도 SDL 과 SDL 이 있어 요.PollEvent 에 대응 하 는 함수, 바로 PeekMessage 입 니 다.SDL 에 도 GetMessage 와 맞 는 SDL 이 있 습 니 다.WaitEvent 함수.
 
    여기 서 우 리 는 왜 SDL 을 사용 합 니까?SDL 대신 PollEventWaitEvent?SDLWaitEvent 는 사용자 정보 가 없 을 때 프로그램 대기 로 인해 게임 의 프레임 수 에 영향 을 줄 수 있 습 니 다. 그러면 애니메이션 이 있 는 게임 에서 사용자 가 조작 하지 않 을 때 화면 이 멈 추고 사용자 가 다시 조작 할 때 화면 이 점프 하 는 상황 이 발생 합 니 다.러시아 블록 을 가지 고 놀 고 싶 을 때, 네가 그것 을 조작 하면 움 직 이 고, 네가 조작 하지 않 으 면 그 는 움 직 이지 않 는 다.또는 방금 사각형 이 위 에 있 었 습 니 다. 키 보드 를 조작 하지 않 았 습 니 다. 키 보드 를 다시 조작 할 때 사각형 은 이미 아래 에 있 습 니 다. 이것 은 사각형 의 행방 은 보통 타이머 에서 처리 되 고 배경 처리 입 니 다. 사용자 정보 가 없 을 때 배경 타 이 머 는 실행 되 고 있 지만 화면 은 배경 과 동기 화 되 지 않 았 습 니 다.화면 이 도약 하여 전진 하 는 상황 을 조성 하 다.
 
    메시지 처리 에 있어 SDL 은 일부 함 수 를 제공 했다. 우 리 는 잠시 메시지 처리 에 대해 더 깊 은 수요 가 없 기 때문에 여기 서 상세 하 게 소개 하지 않 고 사용 할 때 다시 이야기 하 자.알 고 싶다 면 SDL 문 서 를 읽 으 세 요.
 
    다음은 SDL 분석이벤트 구성:
typedef union SDL_Event 
{
	Uint8 type;					//    
	SDL_ActiveEvent active;		//    、                 
	SDL_KeyboardEvent key;		//    ,       
	SDL_MouseMotionEvent motion;//      
	SDL_MouseButtonEvent button;//      
	SDL_JoyAxisEvent jaxis;		//    
	SDL_JoyBallEvent jball; 	//    
	SDL_JoyHatEvent jhat; 		//    
	SDL_JoyButtonEvent jbutton; //    
	SDL_ResizeEvent resize;		//        
	SDL_ExposeEvent expose;		//      
	SDL_QuitEvent quit;			//    
	SDL_UserEvent user;			//       
	SDL_SysWMEvent syswm;		//         
} SDL_Event;

     SDL_Event 는 하나의 연합 체 로 type 필드 는 그 중의 어떤 구조 체 데이터 가 유효 하 는 지 결정 합 니 다.    이 절 에 서 는 키보드 메시지 만 사 용 했 기 때문에 키보드 메 시 지 를 주로 소개 하고 뒤에 다른 메 시 지 를 사용 하면 상세 하 게 설명 할 것 입 니 다.SDL_KeyboardEvent 정의:
typedef struct
{
  Uint8 type;			//    ,SDL_KEYDOWN/UP


  Uint8 state;			//    ,        ,    type         
  SDL_keysym keysym;	//       
} SDL_KeyboardEvent;

     키보드 메시지 구조 체 의 정의 입 니 다. type 은 유형 을 표시 합 니 다. SDL 때문에...Event 는 연합 체 이기 때문에 SDLKeyboard Event 의 type 은 SDL 과 같 습 니 다.이벤트 의 type 필드 입 니 다.다음은 SDLkeysym:
typedef struct
{
  Uint8 scancode;	//          
  SDLKey sym;		//     SDL    ,SDL       SDLK_  ( SDLK_DELETE     )
  SDLMod mod;		//        ,    ALT,SHIFT    
  Uint16 unicode;	//     unicode  (    SDL_EnableUNICODE  unicode,SDL     )
} SDL_keysym;

    그 중에서 scancode 는 잠시 사용 할 필요 가 없습니다. 어떤 키 가 눌 렸 는 지 판단 하 는 것 은 보통 sym, SDLKey 와 SDLMod 를 사용 합 니 다. 헤더 파일 SDLkeysym. h 중.구체 적 인 것 은 SDL 문서 나 소스 코드 를 참고 할 수 있 습 니 다.
 
     여기까지 창 에 그림 을 표시 할 수 있 고 창 을 이동 하고 닫 을 수 있 습 니 다. 이 과정 에서 사용 하 는 함수 의 구체 적 인 세부 사항 은 여러분 이 직접 시도 하고 알 아 봐 야 합 니 다. 여 기 는 자주 사용 하 는 기능 만 소개 합 니 다.다음 절 에 서 는 이 코드 들 을 C + + 로 봉 하 는 방법 을 소개 할 것 이다.

좋은 웹페이지 즐겨찾기