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

question-closed Zmiana rozmiaru okna SDL2

VPS Starter Arubacloud
0 głosów
302 wizyt
pytanie zadane 15 lipca 2021 w C i C++ przez BartoszKX Nowicjusz (160 p.)
zamknięte 28 lipca 2021 przez BartoszKX

Witam

Podczas działania okna  po zmaksymalizowaniu rozmiaru za pomocą F2,następnie zmianie rozmiaru i pozycji poprzez kliknięcie F3 nie jest możliwe natychmiastowe zmaksymalizowanie rozmiarów okna klawiszem F2. Dopiero po przesunięciu okna maksymalizacja okna działa poprawnie. Chciałbym, aby bezpośrednio po kliknięciu F3 było możliwe zmaksymalizowanie rozmiarów okna, bez przesuwania go myszką.

Kod metody wywołującej zmiany rozmiaru okna:

void Gra::Eventy()
{
	SDL_Event* zdarzenie;
	zdarzenie = new SDL_Event;
	SDL_PollEvent(zdarzenie);

	
	switch (zdarzenie->type)
	{
		case SDL_QUIT:
			running = 0;
		case SDL_KEYDOWN:
			switch (zdarzenie->key.keysym.sym)
			{
			case SDLK_F1:
				SDL_MinimizeWindow(okno); break;
			case SDLK_F2:
				SDL_SetWindowFullscreen(okno, 0); SDL_MaximizeWindow(okno);  break;
			case SDLK_F3:
				SDL_SetWindowFullscreen(okno, 0); SDL_SetWindowSize(okno, w, h); SDL_SetWindowPosition(okno,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED)break;
			case SDLK_F4:
				if (SDL_SetWindowFullscreen(okno, SDL_WINDOW_FULLSCREEN) == NULL) break;
			case SDLK_F5:
				running = 0;
			}
	
		default:
			break;
		
	}

	glowne_menu->Eventy(zdarzenie);

	zdarzenie = nullptr;
}

Proszę o pomoc.

 

komentarz zamknięcia: Po zamianie wersji biblioteki z SDL2_image-2.0.1 na SDL2_image-2.0.5 problem został rozwiązany. Dziękuję wszystkim za pomoc.

1 odpowiedź

0 głosów
odpowiedź 15 lipca 2021 przez adrian17 Ekspert (344,100 p.)
Masz źle napisaną pętlę zdarzeń.

Po pierwsze i najważniejsze, SDL_PollEvent powinno być wywoływane w pętli, tak długo jak są dostępne eventy.

Po drugie, nie musisz alokować SDL_Event dynamicznie, możesz mieć zwykłą zmienną i przekazać jej adres (stąd wynika - po trzecie: masz wyciek alokowanego `zdarzenie`, nigdzie go nie zwalniasz. Przypisanie `nullptr` nic nie robi. Nie ma też wiele sensu że jest globalny na skalę klasy...)

Przykład w dokumentacji: https://wiki.libsdl.org/SDL_PollEvent
komentarz 16 lipca 2021 przez BartoszKX Nowicjusz (160 p.)

Przerobiłem kod funkcji na coś takiego:

void Gra::Eventy()
{
	SDL_Event zdarzenie;
	
	while (SDL_PollEvent(&zdarzenie))
	{
		switch (zdarzenie.type)
		{
		case SDL_QUIT:
			running = 0;
		case SDL_KEYDOWN:
			switch (zdarzenie.key.keysym.sym)
			{
			case SDLK_F1:
				SDL_MinimizeWindow(okno); break;
			case SDLK_F2:
				SDL_SetWindowFullscreen(okno, 0); SDL_MaximizeWindow(okno);  break;
			case SDLK_F3:
				SDL_SetWindowFullscreen(okno, 0); SDL_SetWindowSize(okno, w, h); SDL_SetWindowPosition(okno, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); break;
			case SDLK_F4:
				if (SDL_SetWindowFullscreen(okno, SDL_WINDOW_FULLSCREEN) == NULL) break;
			case SDLK_F5:
				running = 0;
			}

		default:
			break;

		}
	}

	glowne_menu->Eventy(&zdarzenie);
}

Jednak to nie rozwiązało problemu.

komentarz 17 lipca 2021 przez j23 Mędrzec (194,920 p.)
Linię 32 powinieneś chyba umieścić w pętli (w linii 27).
komentarz 17 lipca 2021 przez BartoszKX Nowicjusz (160 p.)
Niestety nadal nie działa.
komentarz 17 lipca 2021 przez j23 Mędrzec (194,920 p.)

A jak wywołujesz metodę Gra::Eventy?

Spróbuj tak:

case SDLK_F3:
    if(SDL_GetWindowFlags(okno) & SDL_WINDOW_FULLSCREEN)
        SDL_SetWindowFullscreen(okno, 0); 
                    
    SDL_SetWindowSize(okno, w, h); 
    SDL_SetWindowPosition(okno, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); 
    break;

 

komentarz 21 lipca 2021 przez BartoszKX Nowicjusz (160 p.)
Cała metoda jest wykonywana w pętli while, która jest umieszczona bezpośrednio w funkcji main.

Podobne pytania

0 głosów
1 odpowiedź 342 wizyt
pytanie zadane 17 maja 2019 w C i C++ przez libson Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 143 wizyt
0 głosów
1 odpowiedź 240 wizyt
pytanie zadane 7 października 2019 w C i C++ przez Jakub Chomicz 1 Użytkownik (840 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...