Exemplo n.º 1
0
void main_loop(vector<string>& data_files)
{
    size_t data_file_index = 0;
    SCML::Data data(data_files[data_file_index]);
    data.log();
    
    FileSystem fs;
    fs.load(&data);
    printf("Loaded %zu images.\n", fs.images.size());
    
    list<Entity*> entities;
    for(map<int, SCML::Data::Entity*>::iterator e = data.entities.begin(); e != data.entities.end(); e++)
    {
        Entity* entity = new Entity(&data, e->first);
        entity->setFileSystem(&fs);
        entity->setScreen(screen);
        entities.push_back(entity);
    }
    printf("Loaded %zu entities.\n", entities.size());
    
    float x = 400.0f;
    float y = 300.0f;
    float angle = 0.0f;
    float scale = 1.0f;
    bool flipped = false;
    bool drawObjectPositions = false;
    bool drawBones = false;
    
    bool paused = false;
    
    bool done = false;
    SDL_Event event;
    int dt_ms = 0;
    Uint32 framestart = SDL_GetTicks();
    
    while(!done)
    {
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_QUIT)
            {
                done = true;
            }
            else if(event.type == SDL_KEYDOWN)
            {
                if(event.key.keysym.sym == SDLK_ESCAPE)
                    done = true;
                else if(event.key.keysym.sym == SDLK_SPACE)
                {
                    for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
                    {
                        (*e)->startAnimation(rand()%data.getNumAnimations((*e)->entity));
                    }
                }
                else if(event.key.keysym.sym == SDLK_d)
                {
                    for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
                    {
                        (*e)->update(1);
                    }
                }
                else if(event.key.keysym.sym == SDLK_f)
                {
                    for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
                    {
                        (*e)->update(5);
                    }
                }
                else if(event.key.keysym.sym == SDLK_g)
                {
                    for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
                    {
                        (*e)->update(50);
                    }
                }
                else if(event.key.keysym.sym == SDLK_h)
                {
                    for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
                    {
                        (*e)->update(100);
                    }
                }
                else if(event.key.keysym.sym == SDLK_p)
                {
                    paused = !paused;
                }
                else if(event.key.keysym.sym == SDLK_BACKSPACE)
                {
                    flipped = !flipped;
                }
                else if(event.key.keysym.sym == SDLK_o)
                {
                    drawObjectPositions = !drawObjectPositions;
                }
                else if(event.key.keysym.sym == SDLK_b)
                {
                    drawBones = !drawBones;
                }
                else if(event.key.keysym.sym == SDLK_RETURN)
                {
                    // Destroy all of our data
                    for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
                    {
                        delete (*e);
                    }
                    entities.clear();
                    
                    fs.clear();
                    data.clear();
                    
                    // Get next data file
                    data_file_index++;
                    if(data_file_index >= data_files.size())
                        data_file_index = 0;
                    
                    // Load new data
                    data.load(data_files[data_file_index]);
                    data.log();
                    
                    fs.load(&data);
                    printf("Loaded %zu images.\n", fs.images.size());
                    
                    for(map<int, SCML::Data::Entity*>::iterator e = data.entities.begin(); e != data.entities.end(); e++)
                    {
                        Entity* entity = new Entity(&data, e->first);
                        entity->setFileSystem(&fs);
                        entity->setScreen(screen);
                        entities.push_back(entity);
                    }
                    printf("Loaded %zu entities.\n", entities.size());
                }
            }
        }
        
        if(keystates[SDLK_UP])
            y -= 100*dt_ms/1000.0f;
        else if(keystates[SDLK_DOWN])
            y += 100*dt_ms/1000.0f;
        if(keystates[SDLK_LEFT])
            x -= 100*dt_ms/1000.0f;
        else if(keystates[SDLK_RIGHT])
            x += 100*dt_ms/1000.0f;
        if(keystates[SDLK_MINUS])
            scale -= 0.2f*dt_ms/1000.0f;
        else if(keystates[SDLK_EQUALS] || keystates[SDLK_PLUS])
            scale += 0.2f*dt_ms/1000.0f;
        if(keystates[SDLK_COMMA])
            angle -= 100*dt_ms/1000.0f;
        else if(keystates[SDLK_PERIOD])
            angle += 100*dt_ms/1000.0f;
        
        if(!paused)
        {
            for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
            {
                (*e)->update(dt_ms);
            }
        }
        
        GPU_ClearRGBA(screen, 255, 255, 255, 255);
        
        
        for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
        {
            (*e)->draw(x, y, angle, (flipped? -scale : scale), scale);
        }
        
        if(drawBones)
        {
            for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
            {
                int numBones = (*e)->getNumBones();
                for(int i = 0; i < numBones; i++)
                {
                    SCML::Transform transform;
                    if((*e)->getBoneTransform(transform, i))
                    {
                        SDL_Color blue = {0, 0, 255, 255};
                        GPU_Line(screen, transform.x, transform.y, transform.x + 50*cos(transform.angle*M_PI/180), transform.y + 50*sin(transform.angle*M_PI/180), blue);
                    }
                }
            }
        }
        
        if(drawObjectPositions)
        {
            for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
            {
                int numObjects = (*e)->getNumObjects();
                for(int i = 0; i < numObjects; i++)
                {
                    SCML::Transform transform;
                    if((*e)->getObjectTransform(transform, i))
                    {
                        SDL_Color red = {255, 0, 0, 255};
                        GPU_CircleFilled(screen, transform.x, transform.y, 5*transform.scale_x*transform.scale_y, red);
                    }
                }
            }
        }
        
        GPU_Flip(GPU_GetContextTarget());
        SDL_Delay(10);
        
        Uint32 framefinish = SDL_GetTicks();
        dt_ms = framefinish - framestart;
        framestart = framefinish;
    }
    
    for(list<Entity*>::iterator e = entities.begin(); e != entities.end(); e++)
    {
        delete (*e);
    }
    entities.clear();
    
    data.clear();
}