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

SFML - first game, algorytm

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

Witam wszystkich serdecznie, mam do was pytanie jak zrobić by ciało było ciągle w ruchu za głową? ale robiąc te animacje że porusza się za nim, kombinuje kombinuje i ja wykombinować nie potrafię

 

void Gra::sprawdzkierunek(kierunek& pierwszy,sf::RectangleShape& kwadrat)
{
	
	switch (pierwszy)
	{
	
	case prawo: kwadrat.move(10, 0); break;
	case przod: kwadrat.move(0, -10); break;
	case dol: kwadrat.move(0, 10); break;
	case lewo: kwadrat.move(-10, 0); break;
	}
	Sleep(100);
}
bool Gra::waz(sf::RenderWindow& okno, sf::Sprite& tapeta)
{
	float x, y;
	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; // Tworzenie tabily 20 elementowej która ma odgrywać rolę ciała która będzie wpuszczana do vectora i na koniec rysowane
	std::vector<sf::RectangleShape> cialko; // Tworzymy vektor do przechowywania ciał
	okno.clear(); // czyścimy ekran który otrzymaliśmy poprzez referencje
	kierunek pierwszy;
	pierwszy = prawo;
	bool prawda=false;
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
cialko.push_back(cialo); cialko[0].setSize(sf::Vector2f(30, 30));
cialko[0].setFillColor(sf::Color::Green);
cialko[0].setPosition(glowa.getPosition().x - 50, glowa.getPosition().y);
	while (okno.isOpen())
	{
		sprawdzkierunek(pierwszy, glowa);

		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: {if (pierwszy != lewo){ glowa.move(10, 0); pierwszy = prawo; }  }break; // Jeżeli wąż nie porusza się w lewo porusz się w prawo
				case sf::Keyboard::A: {if (pierwszy != prawo){ glowa.move(-10, 0); pierwszy = lewo; } }break;// Jeżeli wąż nie porusza się w prawo idź porusz się w lewo
				case sf::Keyboard::W: {if (pierwszy != dol){ glowa.move(0, -10); pierwszy = przod; } }break;// Jeżeli wąż nie porusza się w dół porusz się w górę
				case sf::Keyboard::S: {if (pierwszy != przod){ glowa.move(0, 10); pierwszy = dol; } }break;// Jeżeli wąż nie porusza się w górę porusz się w dół
				case sf::Keyboard::E: {  ++q;cialko.push_back(cialo); cialko[q].setSize(sf::Vector2f(30, 30));
					cialko[q].setFillColor(sf::Color::Green);  if (prawda = false)prawda = true; }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
		if (prawda = true) 
		{
			for (int i = 0; i <= q; i++)
			{
				if (i == 0){
					if (pierwszy == dol)
					{

						if (glowa.getPosition().y != cialko[0].getPosition().y) // jeżeli pozycja w pionie ciała jest inna niż głowy ustaw ją na taką samą jaka jest głowa
						{
							int roznica = glowa.getPosition().y - cialko[0].getPosition().y; // Liczymy różnicę pomiędzy pozycją Y głowy a ciała
							if (cialko[0].getPosition().x-30 != glowa.getPosition().x) 
							{
								int roznica = glowa.getPosition().x - cialko[0].getPosition().x;

								cialko[0].move(roznica, 0);
							}
							cialko[0].move(0, roznica - 30);
						}

						else
							cialko[0].setPosition(glowa.getPosition().x - 50, glowa.getPosition().y);
						okno.draw(cialko[0]);
					}

				}
				else
				cialko[i].setPosition(cialko[i-1].getPosition().x - 50, cialko[i-1].getPosition().y);
				okno.draw(cialko[i]); // rysujemyy odpowiednie elementy

		}
		}
		okno.display(); // wyświetlamy na ekranie
	}
}

Coś takiego chaotycznego zrobiłem, wiem że pierw powinno się planować ale zaczełem to to chciałem skończyć ten projekt

1 odpowiedź

0 głosów
odpowiedź 23 maja 2015 przez Harsay Pasjonat (23,640 p.)
W swoim wężu zrobiłem to w następujący sposób.

Fragmenty ciała to kwadraty, których pozycja jest równa poprzedniej pozycji fragmentu poprzedzającego.

Fragmenty trzymałem w tablicy/liście.
komentarz 23 maja 2015 przez Adrian1999 Nałogowiec (34,570 p.)
ja trzymam w vektorze to dynamiczna tablica :D no, więc coś się tak bawiłem a czy ty głowę dałeś jako ciało? i jak by to zrobić by była animacja bo robiłem coś takiego no ale kwadratowo się robiło x.x

Podobne pytania

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

92,554 zapytań

141,399 odpowiedzi

319,535 komentarzy

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

...