2010-02-12 3 views
0

"Gtkmm"을 창 관리자로 사용하여 FPS (First Person Shooter) 게임을 프로그래밍 중이며 "마우스 모양"을하고 싶습니다. 따라서 모든 마우스 동작 이벤트를 내 응용 프로그램 창으로 리디렉션하려면 마우스 포인터를 "잡아야"합니다.Gtkmm - "Gdk :: Window :: pointer_grab"문제

는 그 일을 할 세 가지 오버로드 기능이있는 것 같습니다 나는 시작에 대한 간단한 하나의 선택했습니다 :

Gdk::GrabStatus Gdk::Window::pointer_grab(bool owner_events, Gdk::EventMask event_mask, guint32 timestamp) 

내 응용 프로그램에이 기능을 넣어 시도했지만 나는 "나쁜 결과가 있었다 "지금까지 - 내가 원하는대로하지 않고,"윈도우 "에서"리눅스 "보다"다르게 "행동합니다 ...

그래서 지금까지 내가 한 일을 적어두고, 하지만 우선, 내 목표는 무엇입니까 : "창에 내 응용 프로그램을 갖고 싶고 마우스로 창을 떠난 경우에도 마우스로 마우스를보고 싶습니다. se 포인터 ".

그럼 함수 매개 변수에 도착하자 -
> 부울 owner_events : 나는 그것을 설정할 때 창 내부 때, 나는 이벤트 만 "true"를 가지고하는하지만, (나쁜) 할 때 "false"로 설정했는데 어떤 이벤트도 없었습니다. 그래서 사실로 설정했습니다 (더 좋은 옵션 :-))
-> Gdk :: EventMask event_mask : 이벤트가 있어야합니다. 나는 그것을 잡으려고한다. 지금, 나는 단지 마우스 모션 이벤트에 관심이 있어요, 그래서 내가 거기에만 "GDK :: POINTER_MOTION_MASK"
을 넣어 -> guint32 타임 스탬프 : 나는 또한 이해하지 못하는이하지만 둘 때이 순수한 "0", 그랩 상태가 OK이므로 "GRAB_SUCCESS"(1, 2 또는 기타 숫자로 설정하려고했을 때 "GRAB_INVALID_TIME"이 그랩 상태로 반환 됨) - 그래서 "0"으로 설정합니다.

이제 리눅스에서 실행할 때, 포인터를 잡고 창 밖 어딘가를 클릭해도 반응하지 않습니다 (따라서 내 창은 항상 "원하는"것입니다). 그러나 문제는 애플리케이션이 이벤트를 포착하지 못하거나 내가 내부에있을 때만 포착한다는 것입니다. 전자 창 ( owner_events으로 설정하면).

그리고 Windows에서는 여전히 더 나쁩니다. 창 밖의 어떤 곳을 클릭하면 내가 클릭 한 영역으로 전환됩니다. 따라서 "잡을 필요가 없습니다"와 동일합니다.

누군가 내가 뭘 잘못하고 있는지, 아니면 Gtkmm에서 잡는 데 약간의 예를 들어 줄 수 있습니까?

+1

Gtkmm이 게임 제작에 적합한 도구인지 잘 모르겠습니다. 아마도 게임 툴킷을 사용해야할까요? – ptomato

+0

사용중인 gtkmm의 버전은 무엇입니까? – fnc12

답변

1

event_mask의 경우 Gdk :: ENTER_NOTIFY_MASK 및 Gdk :: BUTTON_RELEASE_MASK를 포함시켜야합니다. 그러면 창에 다시 들어가거나 버튼을 놓을 때 점을 해제 할 수 있습니다.

타임 스탬프의 경우 GdkEvent ... :: time 멤버 또는 Gdk :: CURRENT_TIME을 전달하십시오.

관련 문제