Sign in to follow this  
Followers 0
KingofNoobs

Sprites and Atlases

1 post in this topic

Hello,

I use the following structure for loading instanced and atlased sprites in my game: I load up a file called an "atlas" which contains metadata on all sprites and animations in the atlas. When I want to display a sprite onscreen or give an entity a sprite, I use a class called "SpriteInstance" which adds a destination rectangle (screen rect) for the sprite and an animation frame, but uses the underlying Sprite which is found in the SpriteList in the atlas. So, 1 atlas, many sprites, and (potentially) many more sprite insatnces. The only problem I'm having now is how to refernce the "parent" sprite and the starting animation when creating a SpriteInstance. My constructor is as follows:

SpriteInstance(Sprite * parent, float x, float y, float scaleX, float scaleY, std::wstring startingAnimation)

I tried using the wstring to do some hashing or whatnot, but I am quite confused on that subject. I also just used the raw Sprite pointer, and I will have to do something like this:

auto IsLevel1Atlas = [](std::unique_ptr<Atlas> atlas) -> bool { return atlas->GetName() == L"Level1Atlas"; };
#define &(std::find_if(mAtlasList.begin(), mAtlasList.end(), IsLevel1Atlas)->get()->GetSpriteList().find(L"Background")->second) SpritePtr
mSpriteInstanceList.push_back(SpriteInstance(SpritePtr, 0, 0, INTENDED_SCREEN_WIDTH, INTENDED_SCREEN_HEIGHT, startinganimation);

Which doesn't compile by the way. Is there a better way?

Thanks in advance.

-Dave Ottley
0

Share this post


Link to post
Share on other sites
The system I use has what you call animation frames as objects in their own right (I call them cells). There is a function to find one by name, and after that you can pass around a pointer to it just like you do with the parent in your example. In fact, the cell knows it's parent so you don't need to pass that around separately. So my code to create an instance looks something like this:

[CODE]
cell = cell_manager.lookup_cell("example_cell_name");

new_sprite = std::auto_ptr<dx_sprite>(new dx_sprite());
new_sprite->set_cell(cell);
[/CODE]
1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0