• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
430 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 Mentor (352,580 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 (195,240 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 (195,240 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ź 691 wizyt
pytanie zadane 17 maja 2019 w C i C++ przez libson Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 208 wizyt
0 głosów
0 odpowiedzi 84 wizyt
pytanie zadane 31 grudnia 2024 w Inne języki przez niezalogowany

93,327 zapytań

142,323 odpowiedzi

322,396 komentarzy

62,657 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...