2010-05-19 2 views
2

Итак, я работаю над обновлением моего предыдущего проекта (который я разместил здесь для обзора кода) на этот раз, реализуя повторяющийся фон (например, то, что используется в мультфильмах), чтобы SDL не приходится загружать действительно большие изображения для уровня. Однако в программе есть странная несогласованность: при первом прохождении пользователя вправо отображается 2 меньше панелей, чем указано. Возврат назад (слева) отображается правильное количество панелей (то есть панели повторяют количество раз, указанное в коде). После этого кажется, что снова идет снова (как только слева направо) отображается правильное количество панелей, а другое - назад. Вот некоторые выбранный код и вот .zip of all my codeСкроллинг скроллинга SDL непоследовательно

конструктор:

Game::Game(SDL_Event* event, SDL_Surface* scr, int level_w, int w, int h, int bpp) { 
    this->event = event; 
    this->bpp = bpp; 
    level_width = level_w; 
    screen = scr; 
    w_width = w; 
    w_height = h; 

    //load images and set rects 
    background = format_surface("background.jpg"); 
    person = format_surface("person.png"); 

    background_rect_left = background->clip_rect; 
    background_rect_right = background->clip_rect; 
    current_background_piece = 1; //we are displaying the first clip 
    rect_in_view = &background_rect_right; 
    other_rect = &background_rect_left; 

    person_rect = person->clip_rect; 

    background_rect_left.x = 0; background_rect_left.y = 0; 
    background_rect_right.x = background->w; background_rect_right.y = 0; 
    person_rect.y = background_rect_left.h - person_rect.h; 
    person_rect.x = 0; 
} 

и вот метод шаг, который, вероятно, вызывает все неприятности:

void Game::move(SDLKey direction) { 
if(direction == SDLK_RIGHT) { 
    if(move_screen(direction)) { 
     if(!background_reached_right()) { 
      //move background right 

      background_rect_left.x += movement_increment; 
      background_rect_right.x += movement_increment; 

      if(rect_in_view->x >= 0) { 
       //move the other rect in to fill the empty space 
       SDL_Rect* temp; 

       other_rect->x = -w_width + rect_in_view->x; 

       temp = rect_in_view; 
       rect_in_view = other_rect; 
       other_rect = temp; 

       current_background_piece++; 
       std::cout << current_background_piece << std::endl; 
      } 

      if(background_overshoots_right()) { 
       //sees if this next blit is past the surface 
       //this is used only for re-aligning the rects when 
       //the end of the screen is reached 

       background_rect_left.x = 0; 
       background_rect_right.x = w_width; 
      } 
     } 
    } 
    else { 
     //move the person instead 

     person_rect.x += movement_increment; 
     if(get_person_right_side() > w_width) { 
      //person went too far right 

      person_rect.x = w_width - person_rect.w; 
     } 
    } 
} 

else if(direction == SDLK_LEFT) { 
    if(move_screen(direction)) { 
     if(!background_reached_left()) { 
      //moves background left 

      background_rect_left.x -= movement_increment; 
      background_rect_right.x -= movement_increment; 

      if(rect_in_view->x <= -w_width) { 
       //swap the rect in view 
       SDL_Rect* temp; 

       rect_in_view->x = w_width; 

       temp = rect_in_view; 
       rect_in_view = other_rect; 
       other_rect = temp; 

       current_background_piece--; 
       std::cout << current_background_piece << std::endl; 
      } 

      if(background_overshoots_left()) { 
       background_rect_left.x = 0; 
       background_rect_right.x = w_width; 
      } 
     } 
    } 
    else { 
     //move the person instead 

     person_rect.x -= movement_increment; 
     if(person_rect.x < 0) { 
      //person went too far left 

      person_rect.x = 0; 
     } 
    } 
} 
} 

без остальной части кода это Безразлично» Слишком много смысла. Поскольку его слишком много, я загружу его here для тестирования. В любом случае кто-нибудь знает, как я могу исправить эту несогласованность?

+0

Я помню, что у меня была аналогичная проблема. Однако ссылка на полный код кажется сломанной, не могли бы вы ее обновить? – raven

ответ

0

Распечатайте значения, которые представляют данные, которые, по вашему мнению, могут быть подозрительными, и убедитесь, что они меняют то, как вы думаете. Это звучит довольно типично fencepost error.

Смежные вопросы