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

[C++][SFML] Problemy z losowoscia w grze :(

VPS Starter Arubacloud
0 głosów
229 wizyt
pytanie zadane 8 lipca 2016 w C i C++ przez mrdropex Początkujący (430 p.)

Witam!

Mam problem z losowanymi liczbami ;/

Moja "gra" dziala tak ze poruszamy sie kwadratem i jemy mniejsze kwadraty,przeciwnik czyli ten kwadrat do zjedzenia na start po uruchomieniu spawnuje sie w losowym miejscu, to jeszcze dziala dobrze.Po "zjedzeniu" kwadrata kwadrat spawnuje sie tez w losowym miejscu i tu tworzy sie problem... kosta spawnuje  sie po jednej czesci ekranu ;/

#include <iostream>
#include <SFML\Graphics.hpp>
#include <time.h>
using namespace std;
bool gora, dol, prawo, lewo;
bool enemy;
sf::Vector2f p_rozmiar(50, 50);
sf::Vector2f przeciwnik_rozmiar(30, 30);
int rand_x, rand_y;
sf::RectangleShape _przeciwnik;
class przeciwnik {

public:
	
	przeciwnik()
	{
		_przeciwnik.setSize(przeciwnik_rozmiar);
		_przeciwnik.setFillColor(sf::Color::Magenta);
		_przeciwnik.setPosition(rand_x, rand_y);
		srand(time(0));
		rand_x = rand() % 1280;
		rand_y = rand() % 720;
	}
	void rysuj_przeciwnika(sf::RenderWindow&app)
	{
		app.draw(_przeciwnik);
		_przeciwnik.setPosition(rand_x, rand_y);
	}



};
class gracz {

public:
	sf::RectangleShape _gracz;
	gracz()
	{
		_gracz.setSize(p_rozmiar);
		_gracz.setFillColor(sf::Color::Red);
	}
	void rysuj(sf::RenderWindow&app)
	{
		app.draw(_gracz);
	}
	void poruszanie()
	{
		if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
		{
			_gracz.move(0, -0.3);
		}
		else if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
		{
			_gracz.move(-0.3, 0);
		}
		else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
		{
			_gracz.move(0, 0.3);
		}
		else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
		{
			_gracz.move(0.3, 0);
		}
	}
	void wykrywanie_kolizji()
	{
		if (_gracz.getGlobalBounds().intersects(_przeciwnik.getGlobalBounds()))
		{
			srand(time(0));
			rand_x = 0;
			rand_y = 0;
			rand_x = rand() % 1280;
			rand_y = rand() % 720;

		
		
		
		}
	
	
	
	
	
	}
};



int main()
{	
	gracz _gracz;
	przeciwnik _przeciwnik;
	sf::RenderWindow app(sf::VideoMode(1280, 720), "SFML");
	while (app.isOpen())
	{
		sf::Event event;
		while (app.pollEvent(event))
		{

			if (event.type == sf::Event::Closed)
			{
				app.close();
			}
			
		
		}
		app.clear();
		_gracz.rysuj(app);
		_przeciwnik.rysuj_przeciwnika(app);
		_gracz.poruszanie();
		_gracz.wykrywanie_kolizji();
		app.display();
	

	} 
	return 0;


}

FILMIK: https://www.youtube.com/watch?v=PP_erg7djv4

wiecie moze jak to naprawic? ;/

komentarz 8 lipca 2016 przez Kodeman Gaduła (4,480 p.)
Film jest prywatny
komentarz 8 lipca 2016 przez mrdropex Początkujący (430 p.)
przepraszam, juz jest dobrze

2 odpowiedzi

0 głosów
odpowiedź 8 lipca 2016 przez Programista3 Gaduła (3,390 p.)
wybrane 8 lipca 2016 przez mrdropex
 
Najlepsza

Dodaj jeszcze:

#include <stdlib.h>

EDIT:

Wywal wszystkie linijki:

srand(time(0));

i daj ją tylko raz np. na początku main. Teraz powinno działać (Przetestowałem i u mnie działa).

 

Nieładnie wygląda przeciwnik częściowo wystający poza okno, dobrze by było wziąć to pod uwagę przy losowaniu pozycji przeciwnika. smiley

komentarz 8 lipca 2016 przez mrdropex Początkujący (430 p.)
to nic nie daje.Jesli obejrzales filmik mozesz zauwarzyc ze na starcie gry losowa pozycja kwadratu dziala, ale potem po "zjedzeniu" zaczynaja sie dziac dziwne rzeczy
komentarz 8 lipca 2016 przez Programista3 Gaduła (3,390 p.)

To było tak na szybko, zauważyłem że nie masz tej biblioteki. Teraz przetestowałem kod u siebie i edytowałem odpowiedź, sprawdź czy u Ciebie działa. smiley

komentarz 8 lipca 2016 przez mrdropex Początkujący (430 p.)
Dzieki, wywalilem wszystkie srandy i dalem jedynie w maine.Teraz wszystko ladnie dziala ,wielkie dzieki :)
+1 głos
odpowiedź 8 lipca 2016 przez Dubgron Mądrala (5,620 p.)

Witam, mówiąc szczerze, to nie wiem co o tym kodzie powiedzieć. Napisałeś to w tak dziwny sposób (wszystkie zmienne globalne zamiast każda w odpowiedniej klasie), że cały kod należy poprawić, ale aby rozwiązać twój problem wystarczy:

  1. Usunąć 
    srand(time(0));

    z wszystkich metod i dać na początku main();

  2. Przenieś zmianę pozycji przeciwnika z funkcji, która go rysuje, do funkcji sprawdzającej kolizje.

Te dwa kroki powinny pomóc, ale powinieneś jeszcze przepisać ten kod, ponieważ w tym momencie jest strasznie "syfiasty". W razie jakichś pytań, pisz. Powodzenia. 

komentarz 8 lipca 2016 przez mrdropex Początkujący (430 p.)
nie bierz tego programu na powaznie.Ucze sie dopiero sfmla tak samo jak c++ :)

Podobne pytania

0 głosów
1 odpowiedź 559 wizyt
pytanie zadane 20 grudnia 2016 w C i C++ przez xjakubekx Obywatel (1,280 p.)
+1 głos
1 odpowiedź 789 wizyt
pytanie zadane 18 stycznia 2016 w C i C++ przez pietrzakacper Mądrala (7,480 p.)
0 głosów
0 odpowiedzi 129 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...