[SFML] Pętla stałokrokowa

0

Witam, chciałbym zrobic w moim programie losującym kulki pętle stałokrokową tak aby kulki nie zachowywały się dziwnie przy przycieciach programu

#include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <string>
#include <stack>
#include  "Ball.h"
#include  "Line.h"
#include <SFML/Graphics/Text.hpp>
#include  "TextBall.h"
using namespace std;
using namespace sf;;
const int balls = 50;
float xSpeed[balls];
float ySpeed[balls];
float xposition[balls];
float yposition[balls];
int pozitionx[balls];
int  pozitiony[balls];
int promien[49];
int licznik = 0;


int main()
{
	RenderWindow win(VideoMode(800, 600), L"Rozdział 1");
	srand(time(NULL));
	int losuj = (std::rand() % 47) + 1;
	sf::Clock deltaClock;
	sf::Time myEventTimer;

	
	Clock stoper;
	Font font;
	font.loadFromFile("arial.ttf");
	vector < Ball > ball(50, Ball(win));
	vector < TextBall > tekst(50, TextBall(win));
std::vector < Ball > wylosowane( 6, Ball(win));
	std::vector < TextBall > wylosowanenumery(6, TextBall(win));
	// rysowanie kul i liczb
	for (int i = 1; i < balls; i++)
	{
		promien[i] = (std::rand() % 40) + 30;
		pozitionx[i] = (std::rand() % 200) + 30;
		 pozitiony[i] = (std::rand() % 200) + 10;
		Color color1 = Color(rand() % 255, rand() % 255, rand() % 255, 255);

		ySpeed[i] = (std::rand() % 100) + 50;
		xSpeed[i] = (std::rand() % 100) + 50;
		
		ball[i].SetPozition(ball[i].radius() + pozitionx[i], ball[i].radius() + pozitiony[i]);
		ball[i].Fil(color1);
		ball[i].Promien(promien[i]);
		std::string s = std::to_string(i);
		
		tekst[i].sFont(font);
		tekst[i].sString(s);
		tekst[i].sCharacterSize(promien[i]);
	    xposition[i] = ball[i].GetPosition().x + ball[i].radius() * 2 / 3;
		yposition[i] = ball[i].GetPosition().y + ball[i].radius() / 4;
		tekst[i].sColor(sf::Color::Black);
		tekst[i].sPosition(xposition[i], yposition[i]);

	}
	// rysowanie prostokata
	Line linia1(win);
	linia1.sie(600, 500);
	linia1.position(20, 20);
	linia1.thiness(2);
	sf::Time timeSinceLastUpdate = sf::Time::Zero;
	sf::Time TimePerFrame = sf::seconds(1.f / 40.f);

	//rengerowanie grafiki
	while (win.isOpen())
	{
		licznik++;
		win.clear(Color::White);
		Event e;
		while (win.pollEvent(e))
		{
			if (e.type == Event::Closed)
				win.close();

			//
			

		}
		// poeuszanie sie kuli i tekstu
		auto dt = stoper.restart().asSeconds();
		
		for(int i = 1; i < 50; i++){
			ball[i].Move(xSpeed[i] *dt, ySpeed[i] * dt);
			tekst[i].Move(xSpeed[i] *dt, ySpeed[i] * dt);
		}
		
		linia1.draw();

		//rysowanie kuli i tekstu
		for (int i = 1; i< 50; i++)
		{
			ball[i].Draw();
			tekst[i].Draw();
		}

	// odbicie
		for (int i = 1; i< 50; i++)
		{
			int positionY = ball[i].GetPosition().y;
			if (positionY <= 20){ ySpeed[i] = -ySpeed[i]; }
			if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed[i] = -ySpeed[i]; }
			int positionX = ball[i].GetPosition().x;
			if (positionX <= 20){ xSpeed[i] = -xSpeed[i]; }
			if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed[i] = -xSpeed[i]; }

		}

		myEventTimer += deltaClock.restart();
		if (myEventTimer >= seconds(10)){
			myEventTimer -= seconds(10);

			ball[losuj].SetPozition(650, 40);
			tekst[losuj].sPosition(ball[losuj].GetPosition().x + ball[losuj].radius() * 2 / 3, ball[losuj].GetPosition().y + ball[losuj].radius() / 4);

		}


	//	ball[losuj].SetPozition(650, 40);
//		tekst[losuj].sPosition(ball[losuj].GetPosition().x + ball[losuj].radius() * 2 / 3, ball[losuj].GetPosition().y + ball[losuj].radius() / 4);


/*for (int i = 1; i < 7; i++){
			if (licznik > 2000 )
			{
				int losuj = (std::rand() % 47) + 1;
				


				wylosowane.push_back( ball[losuj]);
					wylosowanenumery.push_back( tekst[losuj]);
					wylosowane[0].SetPozition(650, 40 );
					wylosowanenumery[0].sPosition(wylosowane[0].GetPosition().x + wylosowane[0].radius() * 2 / 3, wylosowane[0].GetPosition().y + wylosowane[0].radius() / 4);
				

				

			}
		}*/
		
	
		win.display();
	}
}

Kompletnie nie wiem jak się do tego zbarać.

po 10 sekundach nastepuje losowanie

myEventTimer += deltaClock.restart();
		if (myEventTimer >= seconds(10)){
			myEventTimer -= seconds(10);

			ball[losuj].SetPozition(650, 40);
			tekst[losuj].sPosition(ball[losuj].GetPosition().x + ball[losuj].radius() * 2 / 3, ball[losuj].GetPosition().y + ball[losuj].radius() / 4);

		} 

Jednak petla programu robi koło i wylosowna kula cały czas się odbija. Jak wyłączyć ją z pętli? Do tego losuj zawsze zwraca liczbę 42 , czego może być to przyczynna?

Całkowicie nie działa także zakomentowany zapis

 for (int i = 1; i < 7; i++){
			if (licznik > 2000 )
			{
				int losuj = (std::rand() % 47) + 1;
				


				wylosowane.push_back( ball[losuj]);
					wylosowanenumery.push_back( tekst[losuj]);
					wylosowane[0].SetPozition(650, 40 );
					wylosowanenumery[0].sPosition(wylosowane[0].GetPosition().x + wylosowane[0].radius() * 2 / 3, wylosowane[0].GetPosition().y + wylosowane[0].radius() / 4);
				

				

			}
		}
		

Nie wsysypuje błędów ale kulki zaczynają wypadać z pola i nie wyświetlają się aktualnei wylosowane kulki

1

Pokrój ten betonowy bloczek i wróć za kilka godzin z czymś dla ludzi

1

Do tego losuj zawsze zwraca liczbę 42 , czego może być to przyczynna?

Losujesz wartość tylko jeden raz na samym początku programu.

Nie wiadomo kompletnie w czym masz konkretnie problem. Zrefaktoryzuj po ludzku ten kod, porozdzielaj wszystko na funkcje, dodaj komentarze co gdzie ma się dziać i wrzuć najlepiej jakąś paczkę z całym kodem, żeby można to było skompilować i zobaczyć wizualnie o co chodzi.

Co do fixed time step Google Twym przyjacielem:
http://gafferongames.com/game-physics/fix-your-timestep/
http://www.gamedev.net/topic/638521-fixed-time-step-game-loop/
http://gamedev.stackexchange.com/questions/1589/when-should-i-use-a-fixed-or-variable-time-step
http://www.html5gamedevs.com/topic/8716-game-loop-fixed-timestep-variable-rendering/
http://www.flipcode.com/archives/Main_Loop_with_Fixed_Time_Steps.shtml

0

Wklajema już poprawiony kod z podziałem na funkcje,

 #include <iostream>
#include <vector>
#include <SFML/Graphics.hpp>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <string>
#include <stack>
#include  "Ball.h"
#include  "Line.h"
#include <SFML/Graphics/Text.hpp>
#include  "TextBall.h"
using namespace std;
using namespace sf;;
const int balls = 50;
float xposition[balls];
float yposition[balls];
int pozitionx[balls];
int  pozitiony[balls];
float xSpeed[balls];
float ySpeed[balls];
int promien[49];
Font font;
Clock stoper;
int losuj = (std::rand() % 47) + 1;
sf::Clock deltaClock;
sf::Time myEventTimer;
void rysownaie_linnii(Line &linia1)
{
	linia1.sie(600, 500);
	linia1.position(20, 20);
	linia1.thiness(2);
	sf::Time timeSinceLastUpdate = sf::Time::Zero;
	sf::Time TimePerFrame = sf::seconds(1.f / 40.f);
}

void losuje(vector<Ball> & ball, vector<TextBall> &tekst)
{
	myEventTimer += deltaClock.restart();
	if (myEventTimer >= seconds(10)){
		myEventTimer -= seconds(10);

		ball[losuj].SetPozition(650, 40);
		tekst[losuj].sPosition(ball[losuj].GetPosition().x + ball[losuj].radius() * 2 / 3, ball[losuj].GetPosition().y + ball[losuj].radius() / 4);

	}
}
void odbicie(vector<Ball> & ball, vector<TextBall> &tekst)
{
	for (int i = 1; i< 50; i++)
	{
		int positionY = ball[i].GetPosition().y;
		if (positionY <= 20){ ySpeed[i] = -ySpeed[i]; }
		if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed[i] = -ySpeed[i]; }
		int positionX = ball[i].GetPosition().x;
		if (positionX <= 20){ xSpeed[i] = -xSpeed[i]; }
		if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed[i] = -xSpeed[i]; }

	}
}

void poruszanie(vector<Ball> & ball, vector<TextBall> &tekst)
{
	
	auto dt = stoper.restart().asSeconds();
for (int i = 1; i < 50; i++){
	ball[i].Move(xSpeed[i] * dt, ySpeed[i] * dt);
	tekst[i].Move(xSpeed[i] * dt, ySpeed[i] * dt);
}
}
void rysowanie_kul(vector<Ball> & ball, vector<TextBall> &tekst)
{
	
	
	for (int i = 1; i < balls; i++){
		font.loadFromFile("arial.ttf");
		promien[i] = (std::rand() % 40) + 30;
		pozitionx[i] = (std::rand() % 200) + 30;
		pozitiony[i] = (std::rand() % 200) + 10;
		Color color1 = Color(rand() % 255, rand() % 255, rand() % 255, 255);

	    ySpeed[i] = (std::rand() % 100) + 50;
		xSpeed[i] = (std::rand() % 100) + 50;

		ball[i].SetPozition(ball[i].radius() + pozitionx[i], ball[i].radius() + pozitiony[i]);
		ball[i].Fil(color1);
		ball[i].Promien(promien[i]);
		std::string s = std::to_string(i);

		tekst[i].sFont(font);
		tekst[i].sString(s);
		tekst[i].sCharacterSize(promien[i]);
		xposition[i] = ball[i].GetPosition().x + ball[i].radius() * 2 / 3;
		yposition[i] = ball[i].GetPosition().y + ball[i].radius() / 4;
		tekst[i].sColor(sf::Color::Black);
		tekst[i].sPosition(xposition[i], yposition[i]);
	}
}



int main()

{
	RenderWindow win(VideoMode(800, 600), L"Rozdział 1");
	srand(time(NULL));
	vector < Ball > ball(50, Ball(win));
	vector < TextBall > tekst(50, TextBall(win));
	vector < Ball > wylosowane( 6, Ball(win));
	vector < TextBall > wylosowanenumery(6, TextBall(win));
	// przypisywanie wartosci do  kul i liczb
	
		rysowanie_kul(ball, tekst);

	// rysowanie prostokata(komory w której poruszają się kule
		Line linia1(win);
		rysownaie_linnii(linia1);
	//rengerowanie grafiki
	while (win.isOpen())
	{
	
		win.clear(Color::White);
		Event e;
		while (win.pollEvent(e))
		{
			if (e.type == Event::Closed)
				win.close();
     	}
		// funkcja odpowiadajaca za poruszanie się kul i tekstu

		poruszanie(ball, tekst);
// Rysownaie elementow na ekranie		
		linia1.draw();
//rysowanie kuli i tekstu
		for (int i = 1; i< 50; i++)
		{
			ball[i].Draw();
			tekst[i].Draw();
		}

// odbicie kuli w prostokącie line 		
		odbicie(ball,tekst);
// losowanie jedej z liczb
		losuje(ball, tekst);
// chciałem do vectora wylosowane przypisac kule , juz po dokonaniu losowania a nastepnei je narysowac 
// obok głównej komory losującej
/*for (int i = 1; i < 7; i++){
			if (licznik > 2000 )
			{
				int losuj = (std::rand() % 47) + 1;
				wylosowane.push_back( ball[losuj]);
					wylosowanenumery.push_back( tekst[losuj]);
					wylosowane[0].SetPozition(650, 40 );
					wylosowanenumery[0].sPosition(wylosowane[0].GetPosition().x + wylosowane[0].radius() * 2 / 3, wylosowane[0].GetPosition().y + wylosowane[0].radius() / 4);
			}
		}*/
		
	
		win.display();
	}
}

oraz plik z visual studio http://www52.zippyshare.com/v/ACZEvjDU/file.html

  1. Podczas klikniecia na aplikacje kule wyskakują z komory losującej po za aplikacje, usłysząłme ze rozwiąznaiem jest petla stałokrokowa, ale neiw eim jak jej uzyc.

  2. Kula po wylosowaniu otrzymuja pozycje, jednak cąły czas sie porusza, to normalne bo działa funkcja odbicie ale chcialbym ją pominąc juz dla wylosowanej kuli.

3 Chciałem przypisać elemnty wektora ball do wektora wylosowane a pozniej elemnty vectora wylosowane umiescić obok komory losująej, nie zwraca mi zadnych błedów ale jednoczesnie nie dzieje jeśl wywołam wylosowane[0].SetPozition(x,y);

 
				wylosowane.push_back( ball[losuj]);
					wylosowanenumery.push_back( tekst[losuj]);
					wylosowane[0].SetPozition(650, 40 );
					wylosowanenumery[0].sPosition(wylosowane[0].GetPosition().x + wylosowane[0].radius() * 2 / 3, wylosowane[0].GetPosition().y + wylosowane[0].radius() / 4);
3

Wyobraź sobie, że jesteś kimś, kto pierwszy raz patrzy na Twój kod - co ma mówić mu nazwa funkcji poruszanie? I dlaczego przyjmuje ona jakiś tekst jako parametr?
Albo do czego służy pozitionx oraz xposition?
Toż to rozbój w biały dzień, te nazwy nic nie mówią - równie dobrze mogłoby być zmienna1 oraz zmienna2...
I to mieszanie SetPozition z sPosition, jakieś tam programowanie strukturalne i obiektowe jednocześnie... olaboga...

Zatem - nie, to wciąż nie jest kod dla ludzi.
Podziel to na klasy, sensowne pola oraz metody.
A najlepiej wyrzuć ten kod i najpierw rozplanuj od zera na kartce, a dopiero potem napisz.

0

Faktycznie na pewno poprawie kod, nie wiem za bardzo jak tu dodac dodatkowe klasy
I nie za bradzo wiem co jest w tym zlego

I to mieszanie SetPozition z sPosition, jakieś tam programowanie strukturalne i obiektowe jednocześnie... olaboga...

W konstruktorze juz podawac te parametry?

0

nie wiem za bardzo jak tu dodac dodatkowe klasy

Klasa odpowiedzialna za obsługę aktualnej sceny, klasa odpowiedzialna za renderowanie (...).

I nie za bradzo wiem co jest w tym zlego [sPosition, setPosition]

Trzymaj się jednej konwencji nazewnictwa - setPosition, getPosition - nie mieszaj wielkich liter z małymi oraz skrótów.

0

Ok, przepisuje w takim razie szybko od nowa. Jednak chciałem juz napsiac taki finalny kod a nie tylko testy. Chce stworzyć klasę nadzrędna krztałt a podnia klasy Circle i Rectangle. Chece obiekty tych klas wrzucić losowo do wektora czyli vector<Shape> shape, skąd wtedy mogę wiedzieć , jaki obiekt znjaduję się w shape[i] ?

Czy moge Shape uzyc jako szablonu w klasy szablonowej w tym przypadku?

0

skąd wtedy mogę wiedzieć , jaki obiekt znjaduję się w shape[i] ?

Po co chciałbyś to wiedzieć?

0

Aby wywołać metodę , którą posiada klasa potomna np getRadius dla Circle

0

W jakim celu chciałbyś taką metodę wywołać?

0

Poprawiłem jak tylko potrafie, chciałem rozbić na więcej klas , ale miałem z tym problemy

#include <SFML/Graphics.hpp>
#include <vector>
#include <string>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <string>
#include "Ball.h"
#include  "Rectangle.h"

#include <SFML/Graphics/Text.hpp>
#include <ctime>
using namespace sf;
Font font;
//tablica zawierająca wielkość promieni kul
float radius[49];
// Tablice poczatkwoych wartości kul
float beginningPositionX[49];
float beginningPositionY[49];
//predkosc poruszania sie kuli
float xSpeed[49];
float ySpeed[49];
//tablica liczb losowanych z przedziału 0-49
int random[6];
// Wywołąnie timera to losowania
Clock deltaClock;
Time myEventTimer;
//odbicie kuli od krawędzi prostokata rectangle
void balls_Reflection(vector<Ball> & ball)
{

	for (int i = 0; i < 49; i++)
	{
		if (ball[i].get_Position().x < 620){
			int positionY = ball[i].get_Position().y;
			if (positionY <= 20){ ySpeed[i] = -ySpeed[i]; }
			if (positionY >= 520.0 - 2 * ball[i].get_Radius()){ ySpeed[i] = -ySpeed[i]; }
			int positionX = ball[i].get_Position().x;
			if (positionX <= 20){ xSpeed[i] = -xSpeed[i]; }
			if (positionX >= 620.0 - 2 * ball[i].get_Radius()){ xSpeed[i] = -xSpeed[i]; }

		}
		}


}
//losownaie kul nie dizała poprawnie
void random_Balls(vector<Ball> & ball)
{
	if (deltaClock.getElapsedTime() >= seconds(5)){
		random[0] = (std::rand() % 49) + 0;
		ball[random[0]].set_Position(650, 40 + ball[random[0]].get_Radius() + 50);
		ball[random[0]].set_CharacterPosition(ball[random[1]].get_Position().x + ball[random[1]].get_Radius() * 2 / 3, ball[random[1]].get_Position().y + ball[random[1]].get_Radius() / 4);
		if (deltaClock.getElapsedTime() >= seconds(15)){
			random[1] = (std::rand() % 49) + 0;
			ball[random[1]].set_Position(650, 40 + ball[random[1]].get_Radius() + 200);
			ball[random[1]].set_CharacterPosition(ball[random[1]].get_Position().x + ball[random[1]].get_Radius() * 2 / 3, ball[random[1]].get_Position().y + ball[random[1]].get_Radius() / 4);
			deltaClock.restart();
		}
	}

}

//Ustawianie wartosci poczatkowych kuli 
void settingUp_Balls(vector<Ball> & ball)
{

	font.loadFromFile("arial.ttf");
	for (int i = 0; i < 49; i++)
	{
		//	Zamiana wartosci liczbowej i na Stringa
		std::string s = std::to_string(i + 1);
		//losowanie ustwień poszczególnych kul;

		//losowanie koloru wyświetlanje kuli
		Color color1 = Color(rand() % 255, rand() % 255, rand() % 255, 255);
		//losowanie wielkosci promienia kuli
		radius[i] = (std::rand() % 40) + 30;
		// losownaie pozycji poczatkowej kuli
		beginningPositionX[i] = (std::rand() % 450) + 10;
		beginningPositionY[i] = (std::rand() % 320) + 10;


		ball[i].set_Position(radius[i] + beginningPositionX[i], radius[i] + beginningPositionY[i]);
		ball[i].set_Color(color1, Color::Black);
		ball[i].set_Radius(radius[i]);
		ball[i].set_Font(font);
		ball[i].set_String(s);
		ball[i].set_CharacterSize(radius[i]);
		ball[i].set_CharacterPosition(ball[i].get_Position().x + ball[i].get_Radius() * 2 / 3, ball[i].get_Position().y + ball[i].get_Radius() / 4);

		// predkosci poruszania się kuli
		ySpeed[i] = (std::rand() % 100) + 10;
		xSpeed[i] = (std::rand() % 100) + 10;
	}

}

int main()
{


	RenderWindow win(VideoMode(800, 600), L"Losowanie");
	vector < Ball > ball(49, Ball(win));
	Rectangle rectangle(win);
	rectangle.set_Position(20, 20);
	rectangle.set_Size(600, 500);
	// obsługa poruszania się kul
	Clock stoper;

	srand(time(NULL));
	// wywosanie fukcji, definiujacej ustawienia kuli
	settingUp_Balls(ball);

	while (win.isOpen())
	{

		win.clear(Color::White);
		Event e;
		while (win.pollEvent(e))
		{
			if (e.type == Event::Closed)
				win.close();
		}

		//poruszanie sie kul
		auto dt = stoper.restart().asSeconds();
		for (int i = 0; i < 49; i++){
			if (ball[i].get_Position().x < 620)
				ball[i].Move(xSpeed[i] * dt, ySpeed[i] * dt);

		}


//Rysownaie prostokata masyzny losującej
		rectangle.draw_Rectangle();

// Rysowanie kul
		for (int i = 0; i < 49; i++)
		{
			ball[i].draw_Ball();
		}
// sprawdzanie odbicie kuli
		balls_Reflection(ball);
		
// funkcja nie działa popranie
	//	random_Balls(ball);

			win.display();
	}
}
 

Mam także klasy Ball i Rectangle , jednak nie wime czy sa warte tego aby to pokazywać.

A teraz problemy

  1. Błedy w losowaniu, po wywowlaniu tej funkcji wszytskie kule zostaje przeniesione po za kontener ta sama funkcja działa dobrze dla jednego elementu, chce losowac 6
 void random_Balls(vector<Ball> & ball)
{
	if (deltaClock.getElapsedTime() >= seconds(5)){
		random[0] = (std::rand() % 49) + 0;
		ball[random[0]].set_Position(650, 40 + ball[random[0]].get_Radius() + 50);
		ball[random[0]].set_CharacterPosition(ball[random[1]].get_Position().x + ball[random[1]].get_Radius() * 2 / 3, ball[random[1]].get_Position().y + ball[random[1]].get_Radius() / 4);
		if (deltaClock.getElapsedTime() >= seconds(15)){
			random[1] = (std::rand() % 49) + 0;
			ball[random[1]].set_Position(650, 40 + ball[random[1]].get_Radius() + 200);
			ball[random[1]].set_CharacterPosition(ball[random[1]].get_Position().x + ball[random[1]].get_Radius() * 2 / 3, ball[random[1]].get_Position().y + ball[random[1]].get_Radius() / 4);
			deltaClock.restart();
		}
	}

}
  1. Kule po pewnym czasie wypadają z konetenera nie wszytskie ale część.

3 Chciałbym podzielić kod na więcej klas jednak mam problemy z przekazywaniem elemntów do konstruktora np klasa odbicia nie działa poprawnie

 
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>

#include  "Ball.h"

using namespace std;
using namespace sf;3. Chciałe
class Reflection{
public:
	Reflection(vector<Ball>  &ball,  float ySpeed[50], float xSpeed[50]);


};

Reflection::Reflection(vector<Ball>  &ball,float ySpeed[50],float xSpeed[50] )
{
	for (int i = 1; i< 50; i++)
	{
		int positionY = ball[i].get_Position().y;
		if (positionY <= 20){ ySpeed[i] = -ySpeed[i]; }
		if (positionY >= 520.0 - 2 * ball[i].get_Radius()){ ySpeed[i] = -ySpeed[i]; }
		int positionX = ball[i].get_Position().x;
		if (positionX <= 20){ xSpeed[i] = -xSpeed[i]; }
		if (positionX >= 620.0 - 2 * ball[i].get_Radius()){ xSpeed[i] = -xSpeed[i]; }

	}

}
  1. Czy mogę gdzieś tu zastosować szablon klas , ja tego nie widzę a chciałbym to przetestować

  2. Jeśli stworzę klase nadzrędna Szape , klasy potomne Ball i Square i chce wszystko wrzucić do vector<Shape> shape, np 20 obiektów ball i 29 obiektów Square. Jak to zrobic? Oraz jak wywoływać poszczególne funkcje , rysowania, ustawianai wielkosci tych elemntów dla shape[i] , jesli nie bede wiedział czy ejst to Ball czy Square

2

Nie rozumiesz po co są klasy.
Klasy nie mają służyć tylko za kontener na pola - wykorzystaj dziedziczenie, polimorfizm i całe spektrum innych możliwości.

Generalnie nie ma sensu wynajdywanie ponownie koła - poszukaj porządnych poradników o gamedevie w C++, poodwiedzaj http://gamedev.stackexchange.com, poczytaj o zasadach dobrego programowania, o SOLID, o wzorcach projektowych i wtedy, z nową, świeżą wiedzą, napisz ten kod od nowa, czytelniej, ponieważ póki co porywasz się z motyką na słońce.

0

Ja tu widze inny problem, Patryk27 zwrócił na to uwage (dodatkowo podrzucił ci kilka fajnych źródeł) - ten kod to chaos... no przepraszam.

Ja się odwołuje do kodu, z Ciebie pewnie jest fajny koleś, tylko że to co piszesz to jest po prostu... no ktoś kto chce to przeczytać musiałby przed tym od razu to zrefaktoryzować... Gdzieś tam komentarze, gdzieś tam widziałem tzw "zombie code" (kod który jest zakomentowany, ale jak stoi to nie wiadomo czy można go usunąć czy nie). Funkcja main w ogóle jest odpowiedzialna chyba za wszystko, nie ma sensownego podziału danych odpowiedzialności na mniejsze funkcje z sensownymi nazwami. nawet #includy są niepoukładane. Generalnie gdybyś to porządnie zrefaktoryzował - poziom skomplikowania kodu by się nie zmienił, ale byłby znacznie przyjemniejszy do przeczytania.

Zanim jednak zaczniesz podchodzić do SOLID, czy wzorców projektowych... poukładaj ten kod, bo SOLID, wzorce projektowe, Agile.... to coś, co będziesz mógł zastosować dopiero w momencie, gdy zaczniesz na poważnie programować obiektowo.. Dla mnie ten kod ma duże cechy kodu strukturalnego, a nie obiektowego.

1

Przecież on jeszcze nie umie klas, dziedziczenia, polimorfizmu... po co na siłę mu to TERAZ narzucać ? Dzisiaj już nie można kalkulatora napisać bez klasy? Ludzie... :/
Fakt, jest ogromny chaos w kodzie, w takim razie lepszym podejściem będzie mu wskazanie błędów i możliwych poprawek w kodzie(które już wystąpiły, o to się nie czepiam), ale na litość boską, nie zmuszajcie chłopaka od razu do projektowania kodu, używania wzorców ;)

@pasierdamian nic nowego nie wniosę, tylko powtórzę słowa, które już tu padły - napisz ten kod tak by ktoś, kto nie wie jak ma działać Twój program, był w stanie w prosty i przyjemny sposób określić to co on robi, po samym przeczytaniu kodu.

Funkcja main w zasadzie powinna wywoływać inne funkcje, nie zawierając w sobie żadnej logiki(czyli odbij kulkę jeśli..., zrób to jeśli...).

1 użytkowników online, w tym zalogowanych: 0, gości: 1