• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przycisk do zamknięcia gry WinAPI

VPS Starter Arubacloud
0 głosów
404 wizyt
pytanie zadane 11 stycznia 2022 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

Witam, jakiś czas temu postanowiłem spróbować napisać swoją pierwszą grę w C++. Na youtube znalazłem tutorial ciekawy tutorial tworzenia gry Pong używając WinAPI, z którym nigdy nie miałem do czynienia, lecz wszystko wyglądało bardzo interesująco, więc z ciekawości zacząłem podążać za tym poradnikiem. Po ukończeniu tutorialu, dodałem kilka rzeczy od siebie, typu ekran końca gry, czy pauzy. Z powodu tego, że gra ma w zamyśle zajmować cały ekran, chciałem stworzyć przycisk, po którego wybraniu strzałkami i wciśnięciu enter, użytkownik będzie mógł wyjść z gry (inaczej zamknąć okno). Tu pojawia się moje pytanie, czy jest jakaś funkcja, którą mógłbym to zrobić? Wiem, że w funkcji LRESULT CALLBACK można umieścić switch pobierającego odpowiednią wiadomość zwrotną WM_CLOSE, czy WM_DESTROY, ale czy mogę jakoś wywołać zamknięcie okna poza tą funkcją?

if (wcisniety(BUTTON_RIGHT)) {
			hot_button++;
			if (hot_button > 2)
			{
				hot_button = 0;
			}
		}
		else if (wcisniety(BUTTON_LEFT)) {
			hot_button--;
			if (hot_button < 0)
			{
				hot_button = 2;
			}
		}

		
		if (wcisniety(BUTTON_ENTER)) {
			
			if (hot_button == 0) {
				obecny_tryb = GM_GAMEPLAY;      // Przycisk do włączenia trybu singleplayer
				przeciwnik_komputer = 1;
			}
			else if (hot_button == 1) {
				obecny_tryb = GM_GAMEPLAY;      // Przycisk do włączenia trybu multiplayer
				przeciwnik_komputer = 0;
			}
			else if (hot_button == 2) {
			
                          // Jeśli zostałby spełniony ten warunek, okno  ma się zamknąć

			}
		}

 

komentarz 11 stycznia 2022 przez MKolaj15 Bywalec (2,270 p.)
Dzięki, tylko nie za bardzo wiem co podać jako argument tej funkcji :/
komentarz 11 stycznia 2022 przez tkz Nałogowiec (42,020 p.)
Uchwyt do okna, które chcesz zamknąć.
komentarz 11 stycznia 2022 przez MKolaj15 Bywalec (2,270 p.)

Okej, tylko mój problem polega na tym, że uchwyt mam stworzony w innym pliku i wygląda on tak:

HWND window = CreateWindow(window_class.lpszClassName, L"Gra Pong", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 1280, 720, 0, 0, hInstance, 0);
	{
		//Pelny ekran
		SetWindowLong(window, GWL_STYLE, GetWindowLong(window, GWL_STYLE) & ~WS_OVERLAPPEDWINDOW);
		MONITORINFO mi = { sizeof(mi) };
		GetMonitorInfo(MonitorFromWindow(window, MONITOR_DEFAULTTOPRIMARY), &mi);
		SetWindowPos(window, HWND_TOP, mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top, SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
	}

i gdy podaję 'window' jako argument w CloseWindow(), to jest on niezdefiniowany. W pliku z uchwytem mam dołączony plik z obsługą przycisków poprzez #include, ale nie wiem co zrobić, żeby móc użyć zmiennej 'window'

2
komentarz 11 stycznia 2022 przez tkz Nałogowiec (42,020 p.)
Nie widzę całego kodu, wątpię też by chciało Ci się poddać go refaktoryzacji. Ale ten jeden, jedyny raz możesz wyrzucić zmienną window do przestrzeni globalnej i dać ją jako "extern". Generalnie to złe rozwiązanie, którego nie powinieneś stosować. "Dobre" praktyki mówią by wstrzykiwać takie zależności, tutaj akurat "window" byłoby argumentem funkcji, oczywiście jako referencja(prefereuj to)/wskaźnik. I do tego rozwiązania powinieneś zmierzać.
komentarz 12 stycznia 2022 przez MKolaj15 Bywalec (2,270 p.)
Okej, dzięki wielkie za pomoc! Zamiast funkcji CloseWindow() użyję DestroyWindow(), ponieważ chcę całkowicie wyłączyć program. Plus, kiedy próbuję przekazać "window" jako referencję, wyświetla mi błąd: "argument typu "HWND *" jest niezgodny z parametrem typu "HWND"", mocno tracę na tym, że przekazuję zwykłą zmienną jako argument?
komentarz 12 stycznia 2022 przez MKolaj15 Bywalec (2,270 p.)
Jeszcze jedno, teraz zauważyłem, że kiedy deklaruję "window" jako zmienną globalną to wszystko działa, lecz kiedy próbuję dodatkowo użyć "extern" pojawia się błąd: "nierozpoznany symbol zewnętrzny "struct HWND__ * window"".
1
komentarz 12 stycznia 2022 przez tkz Nałogowiec (42,020 p.)
Tracisz to złe słowo. Robisz nadmiarową kopię, przy "zwykłych" PC i programach tego pokroju nie ma to właściwie znaczenia, ale po co coś kopiować?

Co do błędu. CloseWindow spodziewa się gołego HWND, więc skoro przekazujesz do swojej funkcji przez wsakźnik, to musisz to następnie zdereferować.

Jako taki dodatek https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-closewindow sam źle Cię poprowadziłem. Prawidłowy wybór, co do DesrtoyWindow. WinAPI jest cholernie niedorobione.
1
komentarz 12 stycznia 2022 przez tkz Nałogowiec (42,020 p.)
komentarz 12 stycznia 2022 przez MKolaj15 Bywalec (2,270 p.)
Okej, wszystko zrozumiałem, jeszcze raz dzięki za pomoc!

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 248 wizyt
pytanie zadane 10 stycznia 2019 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
1 odpowiedź 607 wizyt
pytanie zadane 11 października 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)
0 głosów
2 odpowiedzi 1,620 wizyt
pytanie zadane 5 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,781 zapytań

141,708 odpowiedzi

320,588 komentarzy

62,114 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...