2010-06-18 2 views
1

또 다른 빠른 질문, 간단한 콘솔 기반 게임을 만들고 싶습니다. 너무 멋지 는게 아닙니다. 그냥 주말 프로젝트를 좀 더 익숙하게하기 위해서입니다. 기본적으로 테트리스를 만들고 싶지만, 저는 하나의 문제로 끝납니다 :Windows 콘솔 게임의 실시간 제어

어떻게 게임 엔진을 보내고 동시에 입력을 기다리시겠습니까? 분명히 cin 또는 scanf는 나를 위해 쓸모가 없다.

답변

1

두 가지 방법이 있습니다.

첫 번째는 두 개의 스레드를 실행하는 것입니다. 하나는 입력을 기다리고 이에 따라 상태를 업데이트하고 다른 하나는 게임을 실행합니다.

(게임 개발에서 더 일반적인) 다른 방법은 1 초에 여러 번 실행되는 하나의 큰 루프로 게임을 작성하여 게임 상태를 업데이트하고 화면을 다시 그리며 입력을 확인하는 것입니다.

그러나 키 입력을받을 때 차단하는 대신 보류중인 키 누르기가 있는지 확인하고 아무 일도 일어나지 않으면 루프를 계속 진행합니다. 여러 입력 소스 (키보드, 네트워크 등)가있는 경우 모두 루프에 배치되어 차례로 확인됩니다.

예, 폴링이라고합니다. 아니, 효율적이지 않아. 그러나 하이 엔드 게임은 대개 컴퓨터에서 최대한의 성능과 프레임 속도를 끌어내어 차갑게 뛰지 않는 것입니다.

효율을 높이기 위해 선택적으로 루프를 계속할 수 있도록 "키 누르기를 기다리십시오. 그러나 300 밀리 초를 초과하지 마십시오."라는 시간 제한을 사용하여 차단할 수 있습니다.

select()이 마음에 들지만 입력을 기다리는 다른 방법도 있습니다.

+0

어떤 접근 방식이 더 효율적입니까? 스레딩 또는 큰 루프? 멀티 태스킹이 발생하면 더 많은 CPU 시간을 얻을 수 있지만 모든 백그라운드 실행 프로세스에서부터 내 생각에 스레딩이 될 것입니다. –

+0

결국 어느 프로그래밍 방법이든 똑같은 결과를 이끌어 낼 수는 있지만 대부분의 사람들이 스레딩하는 것이 프로그램하기가 쉽기 때문에 결국 더 효율적으로 끝날 것입니다. 프로그래머가 프로그램 흐름에 대한 절대적인 제어를 원하고 스레드가 일정량의 예측 불가능 성을 초래할 수 있기 때문에 "빅 루프"방법이 하이 엔드 게임에서 더 일반적입니다. – tylerl

2

ncurses과 같은 라이브러리를 찾고 있습니다.

많은 Rogue과 같은 게임은 ncurses 또는 유사한 것을 사용하여 작성됩니다.

0

stdin을 non-blocking으로 변경하는 방법을 알아 내면 tetris와 같은 것을 쓸 수 있지만 게임은 이벤트 중심 패러다임에서보다 직접적으로 표현 될 수 있습니다. 어쩌면 창 프로그래밍을 배우는 것이 좋은 변명 일 수 있습니다. 당신이 마이크로 소프트 컴파일러를 사용하는 경우, 콘솔 경로를 이동하려면

어쨌든, 당신은 stdinfgetc에 대한 호출이 차단 지 여부를 알 수있는 (conio.h를 통해) 사용할 수 kbhit()이 있어야합니다.

실제로 MinGW gcc 컴파일러 3.4.5도 kbhit()을 지원한다고 언급해야합니다.