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