Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Pętla stałokrokowa

Ostatnio zmodyfikowano 2015-08-21 11:21
Autor Wiadomość
pasierdamian
Temat założony przez niniejszego użytkownika
[SFML] Pętla stałokrokowa
» 2015-08-21 11:21:45
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


C/C++
#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

C/C++
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

C/C++
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


P-136638
« 1 »
  Strona 1 z 1