SFML community forums

Help => Graphics => Topic started by: smguyk on March 25, 2014, 10:14:46 am

Title: Questions on sf::View
Post by: smguyk on March 25, 2014, 10:14:46 am
For my side scroller, I need a camera that always centers on my player's position.

I have 3 questions regarding the use of sf::View:

In my player's update function, I create a view, set its center to the player's position, and set it as the window's view.

  sf::View v(sf::FloatRect(0, 0, 320, 240));
  v.setCenter(player_.getPosition());
  window_->setView(v);

1.) I tried using the view as an sf::View class member but it didn't work, so now I'm creating the view every tick as seen in the code above. Is that how it is supposed to be done, or should I be wary of how resource intensive it may be, aka what is the correct way to do it?

2.) Now that I have the view that is smaller than the entire map, not all information is displayed anymore. For example I had a UI (displaying hit points and stuff) and an FPS display in my window's corners which I now can't see anymore unless my player, ie the view, is near it. Do I have to use multiple views or something to display everything?

3.) Due to using a view it's not necessary anymore to render the entire map, but only what is seen in the view. Is that done automatically or do I need to somehow program myself what is to be rendered?

I would appreciate any help on this

Thank you!
Title: Re: Questions on sf::View
Post by: Nexus on March 25, 2014, 10:26:09 am
1) It doesn't matter. Do it the way that best fits your design. If a member variable doesn't work, you'd better find out why.

2) Yes, use a separate view for the UI. You could take the window's default view.

3) Nothing is culled automatically, you have to check yourself what you want to draw. sf::FloatRect::intersects() might be helpful here.
Title: Re: Questions on sf::View
Post by: eXpl0it3r on March 25, 2014, 10:26:28 am
1. Use it as a class member. If you fail to make something a class member, you might want to get your C++ book and catch up on how to do so.

2. Use multiple views. For example one for the world, which moves with the player and a static one, that doesn't move at all.

3. It will not be rendered, but you need to handle the processing yourself, i.e. you'll still send all the vertices to the GPU, although only a portion is needed. Depending what exactly is going on, you could also optimize your logic.
Keep in mind however that if the world is relatively small, the optimization might not really be worth the invested time. For large worlds the performance will suffer, thus it's recommended.
Title: Re: Questions on sf::View
Post by: smguyk on March 25, 2014, 06:50:31 pm
Thanks guys, you helped me a lot!

I got everything to work, now I just need to specify what part of the map should be rendered. I think I'll  be able to do that.