Example #1
0
int main(int argc, char **argv) {
	vector<string> args;
	for(unsigned i = 1; i < (unsigned)argc; ++i)
		args.push_back((string)argv[i]);
	srand(time(NULL));

	if(inVector(args, (string)"--help") || inVector(args, (string)"-h")) {
		outputHelp(cout);
		return 0;
	}

	bool loadSystem = false;
	string systemName = "";
	for(unsigned i = 0; i < args.size(); ++i) {
		if(args[i] == (string)"--load") {
			if(i != args.size() - 1) {
				loadSystem = true;
				systemName = args[i + 1];
				args.erase(args.begin() + i);
				args.erase(args.begin() + i);
				i -= 2;
			} else {
				cerr << "psystem: --load requires argument" << endl;
				return 2;
			}
		}
	}

	if(!args.empty()) {
		cerr << "psystem: invalid argument passed" << endl;
		outputHelp(cerr);
		return 1;
	}

	unsigned windowWidth = 800, windowHeight = 600;
	const ldouble scaleFactor = 10.0, minPSize = 0.3, maxPSize = 3.6;
	string windowTitle = "psystem";

	RenderWindow window(VideoMode(windowWidth, windowHeight), windowTitle,
			sf::Style::Close);
	window.setFramerateLimit(60);

	View view;
	view.setSize(windowWidth / scaleFactor, windowHeight / scaleFactor);

	unsigned steps = 100;
	ParticleSystem psystem(1.0 / 60.0 / steps);

	ldouble psize = 3.6 / 4, psizeDelta = 0.1;
	if(loadSystem) {
		psystem.load(systemName);
		if(psystem.size() < 1) {
			return 3;
		}
	} else {
		unsigned ipcount = rand() % 5 + 3;
		psize = 3.6 / ipcount;
		for(unsigned i = 0; i < ipcount; ++i) {
			ldouble radians = (rand() % 360) * M_PI/180.0;
			psystem.push(Particle(cos(radians)*16.0, sin(radians)*16.0, psize));
		}
	}

	bool done = false, mode = true, run = true;
	while(!done && window.isOpen()) {
		Event event;
		while(window.pollEvent(event)) {
			if(event.type == Event::Closed)
				window.close();
			if(event.type == Event::KeyPressed) {
				if(event.key.code == Keyboard::Escape)
					done = true;
				if(event.key.code == Keyboard::Space)
					mode = !mode;
				if(event.key.code == Keyboard::P)
					run = !run;
			}
			if(event.type == Event::MouseButtonPressed) {
				// ConvertCoords -> mapPixelToCoords or mapCoordsToPixel
				sf::Vector2i mouseButtonLoc(event.mouseButton.x, event.mouseButton.y);
				ldouble mx = window.mapPixelToCoords(mouseButtonLoc, view).x,
					my = window.mapPixelToCoords(mouseButtonLoc, view).y;
				if(event.mouseButton.button == Mouse::Left) {
					psystem.push(Particle(mx, my, psize));
				} else if(event.mouseButton.button == Mouse::Right) {
					for(unsigned p = 0; p < psystem.size(); ++p) {
						Particle cp = psystem.get(p);
						ldouble dx = mx - cp.px, dy = my - cp.py,
								distance = sqrt(dx*dx + dy*dy);
						if(distance < cp.radius) {
							psystem.erase(p);
							break;
						}
					}
				}
			}
			if(event.type == Event::MouseWheelMoved) {
				psize += event.mouseWheel.delta * psizeDelta;
				if(psize < minPSize)
					psize = minPSize;
				if(psize > maxPSize)
					psize = maxPSize;
			}
		}

		if(run)
			for(unsigned i = 0; i < steps/2; ++i)
				psystem.update();

		window.clear(Color::White);

		if(mode) {
			view.setCenter(psystem.getX(), psystem.getY());
		} else if(psystem.size() > 0) {
			view.setCenter(psystem.get(0).px, psystem.get(0).py);
		}
		window.setView(view);

		psystem.draw(window);
		window.display();
	}

	if(window.isOpen())
		window.close();

	return 0;
}