int32 ResetSprite(void *systemData, void *userData)
{
    GameManager *mgr;

    if(systemData != NULL)
    {
        Sprite *spritePtr = (Sprite *)systemData;

        mgr = spritePtr->GetManager();
        mgr->RemoveGameObject(spritePtr);
        delete spritePtr;
    }
    else
    {
        mgr = (GameManager*)userData;
    }

    Sprite *tmp = new Sprite(mgr);
    tmp->SetImage(mgr->GetResourceManager()->GetImage(ARROW_HANDLE));
    tmp->SetBaseLocation(CIwVec2(mgr->GetSurfaceWidth() / 2, mgr->GetSurfaceHeight() / 2));
    tmp->AddTransformation(new AnchorTransformation());
    OrbitTransformation *orbiter = new OrbitTransformation(150, 5000, 0, Clockwise);
    tmp->AddTransformation(orbiter);
    mgr->RegisterGameObject(tmp);

    tmp->SetLifespan(++resetCount * 500);
    tmp->SetCompletionCallback(ResetSprite, NULL);

    return 0;
}
S3E_MAIN_DECL void IwMain()
{
    srand(time(NULL));

    GameManager *mgr;
    mgr = new GameManager();

    mgr->SetRequestedFPS(100);

    mgr->GetResourceManager()->RegisterResourceGroup("images.group");

    BUG_HANDLE = mgr->GetResourceManager()->RegisterImage("bug");
    SPLAT_HANDLE = mgr->GetResourceManager()->RegisterImage("splat");
    LEAVES_HANDLE = mgr->GetResourceManager()->RegisterImage("leaves");
    ARROW_HANDLE = mgr->GetResourceManager()->RegisterImage("right_arrow");
    FIRE_HANDLE = mgr->GetResourceManager()->RegisterImage("FireBlast");

    TREB_FONT_HANDLE = mgr->GetResourceManager()->RegisterFont("trebuchet16pt");
    COOPER_FONT_HANDLE = mgr->GetResourceManager()->RegisterFont("cooper_24pt");

    GameManager::SetDebugFont(mgr->GetResourceManager()->GetFont(TREB_FONT_HANDLE));

    Iw2DSetFont(mgr->GetResourceManager()->GetFont(TREB_FONT_HANDLE));

    Sprite *background = new Sprite(mgr);
    background->SetImage(mgr->GetResourceManager()->GetImage(LEAVES_HANDLE));
    background->SetBaseLocation(CIwVec2(0, 0));
    background->SetZIndex(-999);
    mgr->RegisterGameObject(background);

    int width = mgr->GetSurfaceWidth();
    int height = mgr->GetSurfaceHeight();

#define SIMPLE_TEST 0
#define MANY_SHIP_TEST 1
#define ORBITER_TEST 2
#define ANIMATION_TEST 3
#define LABELED_SPRITE 4
#define PATH_TEST 5

    int test_selection = SIMPLE_TEST;

    switch(test_selection)
    {
    case SIMPLE_TEST:
        DoSimpleTest(mgr, ARROW_HANDLE, width, height);
        break;

    case MANY_SHIP_TEST:
        DoManyShipTest(mgr, 10, 10, width, height, ARROW_HANDLE);
        break;

    case ORBITER_TEST:
        MakeOrbiters(mgr, width / 2, height / 2, ARROW_HANDLE);
        break;

    case ANIMATION_TEST:
        AnimationTest(mgr, 0, width, height);
        break;

    case LABELED_SPRITE:
        LabeledSprite(mgr, 0, width, height);
        break;

    case PATH_TEST:
        PathTest(mgr, ARROW_HANDLE, width, height);
        break;
    }

    mgr->MainLoop();

    delete mgr;
}