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

Symulacja w sfml

VPS Starter Arubacloud
0 głosów
79 wizyt
pytanie zadane 13 stycznia 2019 w C i C++ przez NewUser1 Nowicjusz (210 p.)
//main
///////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include "headers.h"
#include "Ground.h"
#include "MakeWorm.h"
 
int main()
{
 
    sf::Clock clock;
    int framesCounter = 0;//licznik klatek
    Motion random; // obiekt do losowania kierunku
    random.randGenerator();//generator losowosci
//    int amount = INITIAL_AMOUNT_OF_WORMS;
//    Worm * worm = new Worm[amount];
//
//    
//    for (int i = 0; i < amount; i++) { 
//        
//        int * tabXY = random.getRandomPosition();
//        
//        worm[i].makeWorm(tabXY[0], tabXY[1]);
//        
//        delete [] tabXY;
//    }
 
    MakeWorm worm(random);
 
   // worm.newWorm(5, random);
 
    sf::RenderWindow window(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT), "Hodowla Robakow");
 
    // run the program as long as the window is open
    while (window.isOpen())
    {
 
        framesCounter++;
        sf::Time elapsed1 = clock.getElapsedTime();
        float time = elapsed1.asSeconds();
        int fps = framesCounter/time;
 
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Event event;
        while (window.pollEvent(event))
        {
            // "close requested" event: we close the window
            if (event.type == sf::Event::Closed)
                window.close();
        }
 
        // clear the window with black color
        window.clear(sf::Color::Black);
 
        // draw everything here...
        // window.draw(...);
 
        sf::Font font;
        if (!font.loadFromFile("DejaVuSans.ttf"))
        {
         // error...
         }//ladowanie czcionki
 
        //////////TEKST FPS//////////////////////////////////
        sf::Text text;
        text.setFont(font); 
        text.setString(std::to_string(fps) + " fps");
        text.setCharacterSize(20); // in pixels, not points!
        text.setFillColor(sf::Color::Red);
        text.setStyle(sf::Text::Bold);
        /////////////////////////////////////////////////////
 
        //tlo
        Ground floor;        
        floor.printGround(SCREEN_HEIGHT, SCREEN_WIDTH, GROUND_TEXTURE_PATH);
 
        //rysowanie
        window.draw(floor.rectangle); //tlo
 
        //ruchy robakow
 
                 worm.move(random);   
 
        //rysowanie robakow
        for(int x = 0; x < 50; x++)
        {
            
        window.draw(worm.worm[x].getWorm());
        }
 
         //end the current frame
 
        window.draw(text); //fpsy
 
        window.display();
 
    }
 
    worm.releaseWorms();
 
   return 0;
}
 

klasa worm:

#include "Worm.h"
//#include <Vector2.cpp>



    void Worm::setSex(bool newSex){
        
        this->sex = newSex;    
        
    }
    
    
    void Worm::setAge(bool newAge){
        
        this->age = newAge;
          
    }
    

    
    void Worm::loadWormTexture(std::string path) {
    
    //this->wormMaleTexture.create(80, 80);
    
    if(wormMaleTexture.loadFromFile(path)) {
        std::cout<<"Worm texture loaded.\n";
    }
    else {
        std::cout<<"Can't load second worm texture.\n";
    
    }
    
    
    }
    
    void Worm::loadMovingWormTexture(std::string path) {
        
        
    if(movingWormMaleTexture.loadFromFile(path)) {
        std::cout<<"Second worm texture loaded.\n";
    }
    else
        std::cout<<"Can't load second worm texture.\n";
        
        
        
    }
    
    
    
     void Worm::setWormTexture(int x){
         
         
         switch(x) {
             
             case 1:  this->worm.setTexture(this->wormMaleTexture); break;
             case 2:  this->worm.setTexture(this->movingWormMaleTexture); break;
             
         }
        
         
         
     }
     
     sf::Sprite Worm::makeWorm(int x, int y){
         
        loadWormTexture(MALE_WORM_TEXTURE_PATH);
        loadMovingWormTexture(MALE_WORM_MOVE_TEXTURE_PATH);
        
        
        this->worm.setPosition(sf::Vector2f(x, y));
         
        return this->worm; 
         
     }
     
     
     sf::Sprite Worm::moveWorm(float x, float y){
         
        //stepsCounter++;
        
        if(stepsCounter%14+1==7){
            setWormTexture(1);
        }
        else if (stepsCounter%14+1==14){
            
            setWormTexture(2);
            
        }
         
        
        //animacja robala
        //this->worm.setPosition(pos_x, pos_y);
        this->worm.move(x, y);
        
        
     }
     
  
     
     
     sf::Sprite Worm::getWorm(){
         
       return this->worm;  
         
     }
     
     
     ///////////////////////////////////////////////////////////////////// KROKI ///////////////////////////////////////
     
     void Worm::changeSteps(int steps) {
         
         this->stepsCounter = steps;
         
     }
     
     int Worm::getSteps() {
         
         return this->stepsCounter;
                
     }
     
     ///////////////////////////////////////////////////////////////////KIERUNEK////////////////////////////////////////
    void Worm::rotateWorm(double angle) {
         
     this->worm.setRotation(angle);  
         
         
     }
    double Worm::getRotation() {
        
        return worm.getRotation();
        
    }
    double Worm::getDirX() {
        
         return this->dir_x;
        
    }
     
    double Worm::getDirY()    {
        
         return this->dir_y;
        
    }
    
    void Worm::setDirX(double x) {
        
        this->dir_x = x;
        
    }
    
    void Worm::setDirY(double y) {
        
        this->dir_y = y;
        
    }
    
    
    
    //////////////////////////////////////////////////////////////////////////KONTROLA POZYCJI/////////////////////////////
    bool Worm::inWindow() {
        
        sf::Vector2f pos = worm.getPosition();
        
        if(pos.x>SCREEN_WIDTH-500||pos.y>SCREEN_HEIGHT-210||pos.x<=0||pos.y<=0) {
          
            return true;
            
        }
        else {
            
            return false;
            
        }
            
        
        
        
    }
    
    
    
    
    float Worm::getPosX() {
        
        sf::Vector2f pos = worm.getPosition();
        return pos.x;
        
    }
    
    float Worm::getPosY(){
        
        sf::Vector2f pos = worm.getPosition();
       return pos.y; 
        
        
    }
    ////////////////////////////////////////////////////LOSOWANIE////////////////////////////////////////
    void Worm::randomizeWormMovement(Motion random) {
                    
                    while(inWindow()) {
                        
                    random.wormMotion(getPosX(), getPosY());    
                    Worm::rotateWorm(random.getRandomAngle());      
                    Worm::setDirX(random.getRandomX()); 
                    Worm::setDirY(random.getRandomY());  
                        
                    moveWorm(getDirX(), getDirY());  
                    }
                    
                    if (getSteps() == 0) {
                    random.wormMotion(getPosX(), getPosY());    
                    Worm::rotateWorm(random.getRandomAngle());      
                    Worm::setDirX(random.getRandomX()); 
                    Worm::setDirY(random.getRandomY());
                    
                    changeSteps(random.getRandomSteps());  
                    
                    }
                    
                    moveWorm(getDirX(), getDirY());
                    
                    changeSteps(getSteps()-1);
                    
                    std::cout
                    <<"x: "<<getDirX()
                    <<" y: "<<getDirY()
                    <<" steps: "<<getSteps()
                    <<" rotation: "<<getRotation()
                    <<std::endl;
                                     
    
    }

kasa MakeWorm:

#include "MakeWorm.h"
 
    MakeWorm::MakeWorm(Motion random) {
 
        this->worm = new Worm[this->WormAmount];
        std::cout<<"constructor ilosc robali: "<<this->WormAmount<<std::endl;
 
        for (int i = 0; i < this->WormAmount; i++) { 
 
        int * tabXY = random.getRandomPosition();
        this->worm->makeWorm(tabXY[0], tabXY[1]);
        delete [] tabXY;
 
        std::cout<<"constructor worm created"<<std::endl;
        } 
 
    }
 
    int MakeWorm::getWormAmount() {
 
        return this->WormAmount;
 
    }
 
    void MakeWorm::newWorm(int amount, Motion random) {
 
        this->worm = new Worm[amount];
 
        for (int i = 0; i < amount; i++) { 
 
        int * tabXY = random.getRandomPosition();
        this->worm->makeWorm(tabXY[0], tabXY[1]);
        delete [] tabXY;
 
        std::cout<<"new worm created"<<std::endl;
        }
        this->WormAmount=this->WormAmount+amount;
 
    }
 
    void MakeWorm::releaseWorms() {
 
        delete [] worm;
 
    }
 
    void MakeWorm::move(Motion random) {
 
        for (int i = 0; i < this->WormAmount; i++)
        {
            std::cout<<"worm "<<i<<": ";
        this->worm[i].randomizeWormMovement(random);
        }
 
    }//losowe poruszanie sie wszystkich robaków
 
    sf::Sprite MakeWorm::getworm(int x) {
 
        return this->worm[x].getWorm();
 
    }

Mam błąd w ostatniej klasie, z założenia ma ona alokować dynamicznie obiekty worm i wyświetlać w oknie, niestety wyświetla tylko jeden sprite, mimo, że oblicza kierunek poruszania dla wszystkich(w tym wypadku 50 obiektów. Byłbym bardzo wdzięczny za pomoc.

Z klady MakeWorm w mainie do stworzenia obiektów, używam tylko konstruktora.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 338 wizyt
pytanie zadane 1 kwietnia 2019 w C i C++ przez Milo Obywatel (1,180 p.)
+1 głos
0 odpowiedzi 245 wizyt
0 głosów
0 odpowiedzi 466 wizyt
pytanie zadane 13 marca 2022 w C i C++ przez Mezeon Obywatel (1,550 p.)

92,839 zapytań

141,780 odpowiedzi

320,848 komentarzy

62,171 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

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!

...