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

SFML wąż - poukładanie / 3 obiekt się zatrzymuje

Object Storage Arubacloud
+1 głos
211 wizyt
pytanie zadane 17 maja 2015 w C i C++ przez Adrian1999 Nałogowiec (34,570 p.)

Witam wszystkich serdecznie ! otóż mam problem, z kodem 

bool Gra::waz(sf::RenderWindow& okno, sf::Sprite& tapeta)
{

	int q = 0; // zmiena która oznacza długość węża
	
	sf::Vector2f pw(300, 200); // Definiuje pozycje węża przy rozpoczeciu gry

	sf::RectangleShape glowa(sf::Vector2f(30, 30)); // Tworzenie głowy węża (kwadrat)
	glowa.setFillColor(sf::Color::Black); // nadawanie koloru wężowi
	glowa.setPosition(pw.x, pw.y); // Nadawanie pozycji wężowi
	sf::RectangleShape cialo[20]; // Tworzenie tabily 20 elementowej która ma odgrywać rolę ciała która będzie wpuszczana do vectora i na koniec rysowana
	cialo[0].setFillColor(sf::Color::Green); // nadawanie zielonego koloru pierwszemu z ciał
	for (int i = 0; i <= 19; i++) // Nadawanie podstawowych atrybutów każdemu z ciał
	{
		std::cout << i;
		cialo[i].setSize(sf::Vector2f(30, 30));
		cialo[i].setFillColor(sf::Color::Green);
		
	}
	std::vector<sf::RectangleShape> cialko; // Tworzymy vektor do przechowywania ciał
	okno.clear(); // czyścimy ekran który otrzymaliśmy poprzez referencje

	
cialko.push_back(cialo[0]); // wrzucamy do vectora ciało nr 1 (tablica nr0)
okno.setKeyRepeatEnabled(true); // możliwość że gdy trzymamy klawisz postać się porusza,nie trzeba wciskać np 3 razy by zrobić 3 ruchy tylko w odpowiednich klatkach
	while (okno.isOpen())
	{
		cialko[0].setPosition(glowa.getPosition().x-50, glowa.getPosition().y); // ustawiamy pozycję pierwszego ciała
		if (q != 0 && q <= 19)
		{
			cialko[q].setPosition(cialko[q-1].getPosition().x - 50, cialko[q-1].getPosition().y); // jezeli q!=0 ustaw pozycje poprzednie cialo z vektora.x - 50
		}
		sf::Event event;
		while (okno.pollEvent(event))
		{
	
			switch (event.type)
			{
			case sf::Event::Closed: okno.close(); break;
			case sf::Event::KeyPressed: {

				switch (event.key.code)
				{
				case sf::Keyboard::D: { glowa.move(1, 0); }break; // porusz postacia w prawo
				case sf::Keyboard::A: { glowa.move(-1, 0); }break;// porusz postacia w lewo
				case sf::Keyboard::E: {  q++;cialko.push_back(cialo[q]); }break; // dodaj ciało
				case sf::Keyboard::Q: { return false; }break; // zakończ wykonwywanie funkcji wróć do menu głównego
				}

			}break;
			}

		}

		okno.clear(); // czyść ekran
		okno.draw(tapeta); // background
		
		okno.draw(glowa); // rysuj głowe
		okno.draw(cialko[0]); // podstawowo rysuj pierwszy element ciała
		for (int i = 0; i < q; i++)
		{
			
				for (int j = 1; j <= q; j++)
				{
			okno.draw(cialko[j]); // rysujemyy odpowiednie elementy
				}
			
				
		}
		okno.display(); // wyświetlamy na ekranie
	}
}

otóż wszystki działa jak powinno, ale do czasu gdy chcę dodać 2 ciało to te ciało wraz z poprzednim się zatrzymuje ktoś mógłby mi wyjaśnić czemu? 2. Pytanie dostałem już trochę ,,opiernicz" za mało estetyczny kod jak uważacie z tym? 3. Jak mogę ustawić by w VIsual Studio bym widział ile linijek napisałem? 

2 odpowiedzi

+2 głosów
odpowiedź 17 maja 2015 przez Bartek85 Mądrala (7,440 p.)
wybrane 17 maja 2015 przez Adrian1999
 
Najlepsza

3. Jak mogę ustawić by w VIsual Studio bym widział ile linijek napisałem? 

Tools->Options...->Text Editor->All languages

I tam znajdziesz Display->Line number.

1) (...)otóż wszystki działa jak powinno, ale do czasu gdy chcę dodać 2 ciało to te ciało wraz z poprzednim się zatrzymuje ktoś mógłby mi wyjaśnić czemu?

Nie mam Twojego projektu, kodu i kompilatora, więc cięzko mi jest coś więcej powiedzieć niż:

1)

        if (q != 0 && q <= 19)
        {
            cialko[q].setPosition(cialko[q-1].getPosition().x - 50, cialko[q-1].getPosition().y); // jezeli q!=0 ustaw pozycje poprzednie cialo z vektora.x - 50
        }

Ten fragment jest na pewno niepoprawny, przeanalizuj go dla q > 1

2)

okno.draw(cialko[0]); // podstawowo rysuj pierwszy element ciała
        for (int i = 0; i < q; i++)
        {             
                for (int j = 1; j <= q; j++)
                {
            okno.draw(cialko[j]); // rysujemyy odpowiednie elementy
                }      
        }

Zakręcona logika. Nie wiem jakie jest założenie działania tego fragmentu, ale można go zapisac w dużo łatwiejszy sposób, np.:

for (int i = 0; i <= q; i++)
      okno.draw(cialko[i]); // rysujemyy odpowiednie elementy

2. Pytanie dostałem już trochę ,,opiernicz" za mało estetyczny kod jak uważacie z tym?

Jeżeli mam być szczery, to przed Tobą jeszcze długa droga. Ale niezniechęcaj się. Takie są po prostu początki. Jak do mniewam, metoda Twojego programowania to metoda iteracyjna, która polega na tym, że masz w głowie pomysł na program, grę czy cokolwiek innego... siadasz przed komputerem i zaczynasz kodzić bez wcześniejszego zastanowienia. I z czasem, jak czegoś Ci brakuje, to sobie dodajesz zmienne, klasy, cokolwiek aby najszybiej dokończyć implementację. Od razu mówię, że to bardzo złe podejscie. Najpierw się projektuje, a później koduje. W wielkich firmach na projektowanie poświeca sie dni, tygodnie, a czasami nawet miesiące. Jeden błąd znaleziony na etapie projektowania jet 1000x tańszy w naprawie, niż ten zaleziony podczas implementacji. Oczywiście, jak to w życiu bywa to nie reguła, ale często sie to sprawdza. Podsumowując, najpierw projekt, później implementacja. Od razu widać akademickie programowanie. Do formatowania, jakości kodzenia, nazw zmiennych, bezpieczeństwa używanego kodu, szybkosci wykonywania kodu, jeszcze długa droga. Ale małymi kroczkami do celu...

komentarz 17 maja 2015 przez Adrian1999 Nałogowiec (34,570 p.)
Dzięki działa
0 głosów
odpowiedź 17 maja 2015 przez LislaV Bywalec (2,400 p.)
Nie musisz tworzyć tablicy RectangleShape'ów. Wystarczy, że zrobisz jedną zmienną typu RectangleShape i potem ją wrzucasz do vectora i na tym wektorze już operujesz.Tylko potem za każdym razem, jak dodajesz kolejny element ciała do vectora musisz ustawić jego wielkość, kolor i położenie.

Podobne pytania

0 głosów
1 odpowiedź 650 wizyt
pytanie zadane 24 maja 2015 w C i C++ przez Adrian1999 Nałogowiec (34,570 p.)
+1 głos
1 odpowiedź 258 wizyt
pytanie zadane 23 maja 2015 w C i C++ przez Adrian1999 Nałogowiec (34,570 p.)
0 głosów
2 odpowiedzi 8,676 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...