SFML community forums

Help => Graphics => Topic started by: Sebox on August 04, 2014, 09:34:01 pm

Title: Problem with stars
Post by: Sebox on August 04, 2014, 09:34:01 pm
Hello everyone!

Now I make my platform game and now i dont know how to make a stars which we can collect.
I know how check if we will collect(intersetcs) but I dont know how to use texture to make more stars, for example now i loading gwiazda.png to memory

sf::Texture gwiazda;
sf::Sprite spritegwiazda;

gwiazda.loadFromFile("gwiazda.png");
spritegwiazda.setTexture(gwiazda);
spritegwiazda.setPosition(730,1200);

and now i make one star but how to make 300 or more and if i catch the star how i can delete this from map ??
I hope you understand what i mean.

Sorry for my English.
Title: Re: Problem with stars
Post by: Ixrec on August 04, 2014, 09:46:10 pm
Just make more sprites and give them the same texture.  Nothing special is required to make that work.

If you aren't sure how to manage 300 or more objects in general, you probably need to read a good book about C++, since some kind of STL container is going to be the right way of doing that, and everyone needs to learn the STL.

Deleting it will probably be as simple as removing it from whatever container you use.
Title: Re: Problem with stars
Post by: Sebox on August 05, 2014, 09:10:08 am
I think that vector won't work good because player can collect the stars from different sides. Maybe i will have to make all star individually but there is no better way ?
Title: Re: Problem with stars
Post by: janszy on August 05, 2014, 10:50:13 am
It doesn't matter which side the player collects the star, you still can use vectors.
std::vector<sf::Sprite> stars;
//create the stars
// ...

//put this code in your game loop
for(auto &thisStar: stars) //assuming you use C++11
{
    if(intersect(player, thisStar)) //check that player collected a star or not. Use your check function here.
    {
        stars.erase(thisStar); //If it did then remove the star's sprite from the vector and don't render it next time.
    }
}

 
Title: Re: Problem with stars
Post by: Sebox on August 05, 2014, 01:23:41 pm
std::vector<sf::Sprite> stars;

stars.push_back(spritegwiazda);
stars.push_back(spritegwiazda1);
stars.push_back(spritegwiazda2);

vector<sf::Sprite>::iterator it;
       
for( size_t i = 0; i < stars.size(); ++i )
{
        oknoaplikacji.draw(stars[i]);
}
if(spritesheet.getGlobalBounds().intersects(spritegwiazda.getGlobalBounds()))
{
                stars.erase(stars.begin()+1);
}
and now "stars.push_back(spritegwiazda);" doesnt work because "spritegwiazda" is undefined so i dont can setPosition on the map.


Title: Re: Problem with stars
Post by: janszy on August 05, 2014, 02:06:48 pm
You still need to declare your variables, load the texture, set the sprites etc. like in your first post. You don't have to create new variables for every star instance though. You can do it in a loop as well:
sf::Texture gwiazda;
gwiazda.loadFromFile("gwiazda.png"); // load the texture

int numStars = 5; //how many stars you want
std::vector<sf::Sprite> stars(numStars);

for(int i=0; i < numStars; ++i)
{
    sf::Sprite spritegwiazda;
    spritegwiazda.setTexture(gwiazda); // use the loaded texture
    spritegwiazda.setPosition(150,i*100); // you can set the position based on the value of i or generate a random position etc.
    stars.push_back(spritegwiazda);
}
Title: Re: Problem with stars
Post by: kimci86 on August 05, 2014, 03:43:27 pm
@janszy
Something is wrong in your code: you are using the fill constructor of std::vector and also push_back sprites.
This line
std::vector<sf::Sprite> stars(numStars);
creates a vector of numStars sprites, so there is no need to push back the sprites. Access sprites with stars[index].

By the way, the fill constructor can initialize the sprites with a copy of a given sprite.

What your code could be:
sf::Texture gwiazda;
gwiazda.loadFromFile("gwiazda.png");

int numStars = 5;
std::vector<sf::Sprite> stars(numStars, sf::Sprite(gwiazda));

for(int i=0; i < numStars; ++i)
    stars[i].setPosition(150,i*100);
Title: Re: Problem with stars
Post by: janszy on August 05, 2014, 05:42:29 pm
Quote
Something is wrong in your code: you are using the fill constructor of std::vector and also push_back sprites.

You're right. I indeed mixed those. Thanks for the correction  ;)
Title: Re: Problem with stars
Post by: Gobbles on August 05, 2014, 07:25:17 pm
I just wanted to toss an idea at you. Instead of constantly removing and adding stars, look into the concept of object pooling. Can save you a lot of trouble come performance time.