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

Podwójne dodawanie obiektów do vectora

0 głosów
258 wizyt
pytanie zadane 19 września 2017 w C i C++ przez CPP_Newbie Użytkownik (770 p.)

Witam,

Obecnie testuję dodawanie i wyświetlanie obiektów RectangleShape do/z wektora i natrafiłem na problem. Otóż po dodaniu obiektu do kontenera (klawisz spacji) okazuje się, że dodawane są dwa obiekty a nie jeden. Ktoś mi wytłumaczy dlaczego się tak dzieje i jak rozwiązać ten problem?

#include <SFML\Graphics.hpp>
#include <vector>

using namespace sf;

int main()
{
	RenderWindow window(VideoMode(640, 480), "testy");
	window.setKeyRepeatEnabled(false);

	std::vector<RectangleShape> vec;

	RectangleShape rect;

	while (window.isOpen())
	{
		Event ev;
		while (window.pollEvent(ev))
		{
			if (ev.type == Event::Closed || Keyboard::isKeyPressed(Keyboard::Escape))
				window.close();

			if (Keyboard::isKeyPressed(Keyboard::Space))
			{
				vec.push_back(rect);
				printf("%i\n", vec.size());
			}
		}

		window.clear();
		window.display();
	}
}

 

1 odpowiedź

+1 głos
odpowiedź 19 września 2017 przez niezalogowany

Jeżeli chcesz dodawać obiekty klawiszem zrób to tak:

if (ev.type == sf::Event::KeyPressed)
{
    if (ev.key.code == sf::Keyboard::Space)
    {
         ...
    }
}

W taki sposób eventy klawiszy działają tak jak wciskanie klawiszy w notatniku. Jeżeli chcesz zrobić sterowanie postaci to lepszym wyborem jest isKeyPressed, ale POZA pętlą eventów. 

komentarz 19 września 2017 przez CPP_Newbie Użytkownik (770 p.)

Dzięki za odpowiedź. Po co dwa ify skoro można to zrobić w jednym? Owszem, jeśli zamienię ifa z pozycji 23 na:

if (ev.type == Event::KeyPressed && ev.key.code == Keyboard::Space)

program działa, jak należy - dodawany jest tylko jeden obiekt do kontenera.

Jednak nadal nie uzyskałem odpowiedzi na pytanie DLACZEGO tak się dzieje?

1
komentarz 19 września 2017 przez niezalogowany
Jak będziesz miał obsługę 20 klawiszy to będziesz miał dużo nadmiarowego kodu. Odpowiedz na główne pytanie:
Metoda pollEvent w momencie wciśnięcia klawisza umieszcza po kolei zdarzenia KeyPressed, TextEntered. W czasie pierwszego jest prawdą, że klawisz spacja jest wciśnięty. W czasie drugiego też. Dlatego obiekt zostanie dodany dwa razy.
komentarz 19 września 2017 przez niezalogowany

Mógłbyś też wyszczególnić w czasie trwania którego eventu ma nastąpić dodawanie obiektów.

if (ev.type == Event::KeyPressed)
	if (Keyboard::isKeyPressed(Keyboard::Space))
komentarz 19 września 2017 przez CPP_Newbie Użytkownik (770 p.)
I takiej odpowiedzi oczekiwałem :)

Dziękuję.

Podobne pytania

0 głosów
1 odpowiedź 1,126 wizyt
pytanie zadane 25 kwietnia 2018 w C i C++ przez Don Corleone Obywatel (1,210 p.)
0 głosów
3 odpowiedzi 232 wizyt
pytanie zadane 21 maja 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)
0 głosów
1 odpowiedź 430 wizyt
pytanie zadane 29 grudnia 2018 w C i C++ przez midlas12 Nowicjusz (140 p.)

93,605 zapytań

142,529 odpowiedzi

322,999 komentarzy

63,093 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

Kursy INF.02 i INF.03
...