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 + + 로 봉 하 는 방법 을 소개 할 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDOJ/HDU 1113 Word Amalgamation (사전 순서 ~ 지도)a dictionary, which consists of at least one and at most 100 words, one per line; a line containing XXXXXX, which signal...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.