• 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

Object Storage Arubacloud
0 głosów
144 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ź 716 wizyt
pytanie zadane 25 kwietnia 2018 w C i C++ przez Don Corleone Obywatel (1,210 p.)
0 głosów
3 odpowiedzi 142 wizyt
pytanie zadane 21 maja 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 29 grudnia 2018 w C i C++ przez midlas12 Nowicjusz (140 p.)

92,568 zapytań

141,420 odpowiedzi

319,618 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...