SFML community forums

General => SFML wiki => Topic started by: Fred_FS on April 22, 2011, 07:44:19 pm

Title: Creae a simple image manager
Post by: Fred_FS on April 22, 2011, 07:44:19 pm
Hello,
I decided to create a little tutorial on handling images, because often images and sprites are used together in the same object-class and so the image is often reloaded for all objects of the same type, what shouldn't be necessary.
You can read it here (https://github.com/SFML/SFML/wiki/TutorialImageManager).
Title: Creae a simple image manager
Post by: Nexus on April 23, 2011, 07:20:00 pm
Good tutorial! :)

I have written something similar (ResourceManager) in my library, but it doesn't provide much functionality specific to sf::Image. In your code, I like the possibility to specify multiple directories. I think an option to disable the debug outputs to std::cout would be handy, as well as the possibility to check whether image loading was successful. But you can also leave this as an exercise to the reader ;)

By the way, a mistake I came across: The following code doesn't compile because std::map::erase() doesn't return any iterator.
Code: [Select]
it = images_.erase( it );
Instead, you could write the code below (which is okay because map iterators remain valid for all operations except removal), however I think in that case you may also exit the function.
Code: [Select]
images_.erase(it++);
Title: Creae a simple image manager
Post by: Fred_FS on April 23, 2011, 08:23:29 pm
Thank you :).
I had a look on your Resource Manager yesterday. I think, this would be the next step. But my tutorial is for beginners and a look at your code tells me that it is not "beginner's code" ;).
Those options, you mentioned, are not implemented, because I think that the reader will be also a programmer and he might be able to set some "//" int front of the debug output(or just don't copy it^^). It isn't a real debug output anyway. It just shows you, that the image is not loaded again and again.

A strange mistake. This[/cpp] also tells me that there is no erase-function, which returns an iterator, but my Visual C++ compiler has one ;). So it works for me.
But of course I fixed it. And you're right. It won't be necesseray to search the whole map, if I find and appropriate entry, and I should leave it.
So it should be enough to use this, shouldn't it?
 (http://www.cplusplus.com/reference/stl/map/erase/)
Code: [Select]

images_.erase(it)
return;
Title: Creae a simple image manager
Post by: Nexus on April 23, 2011, 08:29:27 pm
Quote from: "Fred_FS"
I had a look on your Resource Manager yesterday. I think, this would be the next step. But my tutorial is for beginners and a look at your code tells me that it is not "beginner's code" ;).
In fact, my code sometimes looks more complicated than necessary, especially the metaprogramming stuff ;)

But I think our goals are different anyway: You teach people how to write a smart image managing class, while I try to provide something more or less ready to use for a specific purpose.


Quote from: "Fred_FS"
So it should be enough to use this, shouldn't it?
Code: [Select]

images_.erase(it)
return;
Yes. Now you can also drop the else branch and move the ++it to the loop header.
Title: Creae a simple image manager
Post by: Fouf on June 02, 2011, 03:49:42 pm
You can use the map.find function map.find msdn (http://msdn.microsoft.com/en-us/library/92cwhskb(VS.80).aspx) instead of looping through with an iterator.

guess I can't do links like that :/ oh well.

http://msdn.microsoft.com/en-us/library/92cwhskb(VS.80).aspx
Title: Creae a simple image manager
Post by: denismr on August 26, 2011, 03:02:17 am
Quote from: "Fouf"
You can use the map.find function map.find msdn (http://msdn.microsoft.com/en-us/library/92cwhskb(VS.80).aspx) instead of looping through with an iterator.

guess I can't do links like that :/ oh well.

http://msdn.microsoft.com/en-us/library/92cwhskb(VS.80).aspx


It's very recommended to use the find function instead of looping through with an iterator because the map is an implementation of a RedBlack Tree or an AVL Tree.
It means that a find operation is O( log2 (N) ) while passing over the entire map is O(N), N = number of items in the map.

Good job!   :)