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

Biały okno po kompilacji kodu

Object Storage Arubacloud
0 głosów
159 wizyt
pytanie zadane 17 marca 2018 w C i C++ przez programkamil Początkujący (270 p.)

Mam problem, po napisaniu kodu w c++ w bibliotece sfml i skompilowaniu go wyskakuje mi białe okno bez możliwości jego zamknięcia. Wielokrotnie szukałem błędu i poprawiałem kod ale bez skutku. Mam prośbę czy mógłby ktoś rzucić na niego okiem i mi powiedzieć co robię nie tak?

#include "stdafx.h"
#include <SFML\Graphics.hpp>
#include <math.h>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<ctime>
#include<sstream>
#include <SFML\Window.hpp>
#include <SFML\System.hpp>

int main()
{
	srand(time(NULL));
	sf::ContextSettings settings;
	settings.antialiasingLevel = 8;

	sf::Font font;
	std::srand(std::time(0)); //dekalrowanie liczb losowych
	int random_variable = std::rand();
	
	sf::RenderWindow window(sf::VideoMode(800, 600), "Armatka");//główne

	float r=100;	
	sf::CircleShape kolo1(r);//kolo1 z obwodka
	kolo1.setFillColor(sf::Color::Green);
	kolo1.setOutlineThickness(-0.04*r);
	kolo1.setOutlineColor(sf::Color::Red);

	
	sf::CircleShape kolo2(30);//kolo2 z obwodka
	kolo2.setFillColor(sf::Color::Yellow);
	kolo2.setOutlineThickness(-0.04*r);
	kolo2.setOutlineColor(sf::Color::Magenta);

	//kwadrat
	sf::RectangleShape rectangle(sf::Vector2f(1.5 * r, 0.4*r));
	rectangle.setFillColor(sf::Color::Blue);

	//określanie pozycji i rozmiaru kółek i prostokąta
	kolo1.setOrigin(r, r);//ustawienie centrum obiektu 
	kolo1.setPosition(3 * r, 3 * r);
	kolo2.setPosition(3 * r, 3 * r);
	rectangle.setOrigin(0, 0.2*r);
	rectangle.setPosition(3 * r, 3 * r);

	/*const int x = 111;
	sf::CircleShape kulki[x];    //tablica kulki
	for (int z = 0; z < x; z++)
	{
		int a = (rand() % 25) + 10;
		kulki[z].setRadius(a);
		kulki[z].setOrigin(a, a);
		int b = (rand() % 760) + 20;
		int c = (rand() % 470) + 90;
		
		while ((sqrt(((b - 3*r)*(b - 3*r)) + ((c - 3*r)*(c - 3*r)))) < (3*r))//tu zmieniamy odl kulek od promienia
		{
			b = (rand() % 710) + 20;
			c = (rand() % 470) + 90;
		}

		kulki[z].setPosition(b, c);
		kulki[z].setFillColor(sf::Color(rand() % 250 + 5, rand() % 250 + 5, rand() % 250 + 5));
		kulki[z].setOutlineColor(sf::Color(rand() % 255+5, rand() % 255+5, rand() % 255+5));
		kulki[z].setOutlineThickness(-2);	
	}
	*/
	





		sf::Int16 xpos[x], ypos[x];// Sprawdzenie odleglosci od innych kulek
		for (int z = 0; z < x; z++)
		{
			xpos[z] = rand() % 750;
			ypos[z] = rand() % 470 + 30;
		}
	
	for (int z = 0; z < x; z++)
	{	
		float dl = 0;
		while (dl < rectangle.getSize().x)
		{
			int xt = xpos[z] + kulki[z].getRadius(), yt = ypos[z] + kulki[z].getRadius();
			dl = pow((kolo1.getPosition().x - xt), 2);
			dl += pow((kolo1.getPosition().y - yt), 2);
			dl = sqrt(dl);
			dl -= kulki[z].getRadius();
			if (dl < rectangle.getSize().x)
			{
				xpos[z] = rand() % 750;
				ypos[z] = rand() % 470 + 30;
			}
		}

		float odleglosc = 0;
		for (int c = 0; c < z; c++)
		{
			float rr = kulki[c].getRadius();
			int xz = xpos[z] + kulki[z].getRadius(), xc = xpos[c] + kulki[c].getRadius(), yz = ypos[z] + kulki[z].getRadius(), yc = ypos[c] + kulki[c].getRadius();
			rr += kulki[z].getRadius();
			odleglosc = pow((xz - xc), 2);
			odleglosc += pow((yc - yz), 2);
			float rq;
			rq = pow(rr, 2);
			if (odleglosc < rq)
			{
				xpos[z] = rand() % 750;
				ypos[z] = rand() % 470 + 30;
				c = z;
				z -= 1;
			}
		}
	}
	for (int z = 0; z < x; z++)
	{
		kulki[z].setPosition(xpos[z], ypos[z]);
	}
	

	sf::RectangleShape linia(sf::Vector2f(800, 1));//taka se linia 
	linia.setPosition(0, 40);
	linia.setFillColor(sf::Color::Magenta);
	while (window.isOpen())
	{
		sf::Event event;
		while (window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed)
				window.close();
		}
		//window.setFramerateLimit(60);
		window.clear();
		window.draw(kolo1);//wyświetlenie
		window.draw(rectangle);
		window.draw(kolo2);		
		window.draw(linia);
		for (int z = 0; z < x; z++)//wyświetlanie kółek w pętli
		{
			window.draw(kulki[z]);
		}
		window.display();

		//ruch za myszką i celowanie
		double dX = sf::Mouse::getPosition(window).x - rectangle.getPosition().x;
		double dY = sf::Mouse::getPosition(window).y - rectangle.getPosition().y;
		double rotation = atan2(dY, dX);
		rotation *= 180 / 3.14;

		rectangle.setRotation(rotation);//obracanie sie działa

	}

	return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 17 marca 2018 przez adrian17 Ekspert (344,860 p.)
wybrane 17 marca 2018 przez programkamil
 
Najlepsza
Masz nieskończoną pętlę [2].

Po odkomentowaniu linii 47-68 (bez nich się nie kompiluje), z tego co widzę, pętla jest spowodowane przez linie 100-116. Ten kod to jakiś warunek, żeby dodawane kulki były w jakiejś pozycji od siebie - a jak nie są, to próbuje ponownie, tak? Wydaje mi się że przy zbyt dużej liczbie kulek umieszczenie kolejnej staje się niemożliwe, więc kod "próbuje ponownie" w nieskończoność.

Zmniejszenie `x` do 50 rozwiązało problem, co wydaje się potwierdzać tezę.

(przy okazji, popracuj nad czytelnością kodu)
komentarz 17 marca 2018 przez programkamil Początkujący (270 p.)
zgadza się, teraz działa, niestety niektóre kulki zachodzą na siebie, choć nie powinny :(

dziękuje bardzo
0 głosów
odpowiedź 17 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
Najprawdopodobniej masz gdzieś nieskończoną pętlę.
komentarz 17 marca 2018 przez programkamil Początkujący (270 p.)
no właśnie z pętlami wszystko raczej jest dobrze, otwierają się i zamykają tam gdzie trzeba
komentarz 17 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
Sprawdziłeś wszystkie? Nie możesz nic zrobić z oknem, gdyż nie ma ono dostępu do pętli zdarzeń. Oznacza to, że kod się gdzieś zakleszczył.

Podobne pytania

0 głosów
1 odpowiedź 253 wizyt
pytanie zadane 10 stycznia 2018 w C i C++ przez żółwibekon Początkujący (300 p.)
+1 głos
3 odpowiedzi 374 wizyt
0 głosów
3 odpowiedzi 445 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

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

...