2017-05-17 2 views
0

Je voulais créer un vecteur de carrés placés au hasard et les dessiner à l'écran, j'ai essayé de passer une référence à un vecteur et je n'ai pas réussi à le faire fonctionner: (C++ SFML créer un vecteur de formes et les dessiner dans une fonction

consumable.h

#ifndef CONSUMABLE_H 
#define CONSUMABLE_H 

#include <SFML/Graphics.hpp> 

using namespace std; 
using namespace sf; 

class consumable 
{ 
    public: 
    consumable(); 
    virtual ~consumable(); 

    vector<RectangleShape> fCreateConsumable(vector<RectangleShape>& vConsumable); 
    void fDrawTarget(float x, float y, RenderWindow &thatWindow); 

protected: 

private: 
    vector<RectangleShape> vConsumable; 
    RectangleShape _consumable; 
}; 

consumable.cpp

#include "consumable.h" 

consumable::consumable() 
{ 
    //ctor 
} 

consumable::~consumable() 
{ 
    //dtor 
} 
void consumable::fCreateConsumable(){ 
    int consumableX{0}, consumableY{0}; 

    for(int i=0;i<4;i++){ 
     consumableX = (rand() % 31) + 1; 
     consumableY = (rand() % 22) + 1; 
     _consumable.setPosition((consumableX * 25), (consumableY * 25)); 
     _consumable.setSize(sf::Vector2f(25.0f,25.0f)); 
     _consumable.setFillColor(sf::Color::Magenta); 
     vConsumable.push_back(_consumable); 
    } 
} 
void consumable::fDrawTarget(float x, float y, RenderWindow &thatWindow){ 
    void fCreateConsumable(); 

    for(int i{0};i< vConsumable.size();i++){ 
     thatWindow.draw(vConsumable[i]); 
    } 
} 

main.cpp

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

#include "consumable.h" 

using namespace std; 
using namespace sf; 

int main() 
{ 
    consumable Consumable; 
    RenderWindow window(VideoMode(800,750), "C++ Snake"); 

    while (window.isOpen()) 
    { 
     Event event; 
     while (window.pollEvent(event)) 
     { 
      switch(event.type) 
      { 
      case Event::Closed: 
       window.close(); 
       break; 
      default: 
       break; 
      } 
     } 
     window.clear(); 
     Consumable.fDrawTarget(25,25,window); 
     window.display(); 
    } 
    std::cout << "Finished" << std::endl; 
    return 0; 
} 

Je voulais faire une boucle sur

+0

Vous avez inclus une copie de main.cpp lorsque vous avez voulu inclure consumable.h. S'il vous plaît [modifier] votre question pour résoudre ce problème. –

+0

Je voudrais déclarer 'consommableX' et' consommableY' comme 'const int' dans la boucle. De même, je ferais '_consumable' un local dans' fCreateConsumable' (probablement dans la boucle). Dans 'fDrawTarget' j'écrirais la boucle comme' pour (const auto & item: vConsumable)) {thatWindow.draw (item);} ' –

+0

Et enfin, de quelle manière" ne pourriez-vous pas faire marcher ça "? Message d'erreur du compilateur (veuillez le montrer exactement)? Sortie inattendue (Quoi?) Crash? (Où?) –

Répondre

0

En regardant votre classe consumable, je commencerai par local et Refactor _consumablefCreateConsumable ajouter une autre fonction.

class consumable 
{ 
    public: 
    // ...  
    vector<RectangleShape> fCreateConsumable(vector<RectangleShape>& vConsumable); 
    void fDrawTarget(float x, float y, RenderWindow &thatWindow); 
    void UpdatePositions(); 
private: 
    vector<RectangleShape> vConsumable; 
}; 

En enlevant fCreateConsumable de fDrawTarget vous pouvez éviter de créer de nouveaux RectangleShape, réutiliser les anciens trois petits, et les mettre à jour avec de nouvelles positions.

void consumable::UpdatePositions(){ 
    srand(time(NULL)); 
    for(int i{0};i< vConsumable.size();i++){ 
     vConsumable[i].setPosition(((rand() % 31) + 1) * 25, ((rand() % 22) + 1) * 25); 
    } 
} 
void consumable::fCreateConsumable(){ 
    int consumableX{0}, consumableY{0}; 
    srand(time(NULL)); 
    for(int i=0;i<4;i++){ 
     consumableX = (rand() % 31) + 1; 
     consumableY = (rand() % 22) + 1; 
     _consumable.setPosition((consumableX * 25), (consumableY * 25)); 
     _consumable.setSize(sf::Vector2f(25.0f,25.0f)); 
     _consumable.setFillColor(sf::Color::Magenta); 
     vConsumable.push_back(_consumable); 
    } 
} 
void consumable::fDrawTarget(float x, float y, RenderWindow &thatWindow){ 
    UpdatePositions(); 
    for(int i{0};i< vConsumable.size();i++){ 
     thatWindow.draw(vConsumable[i]); 
    } 
} 

Personnellement, je sortir UpdatePositions de fDrawTarget aussi, et faire la drawcall fonction const. De cette façon, vous séparez la mise à jour et le rendu. Si ce n'est pas le cas, déplacez UpdatePositions vers une portée privée.