C ++ отказывается работать должным образом, если не используется cout - PullRequest
5 голосов
/ 08 августа 2011

Этот код компилируется, но отказывается совершать прыжок с мячом, когда нет cout. Когда есть cout, он правильно заставляет объект (dot) прыгать. Это всего лишь небольшая практика использования SDL для создания супер примитивной игры

Основной цикл:

while (!quit){
    while (SDL_PollEvent(&event))
        if ((event.type == SDL_QUIT) || ((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_ESCAPE)))
            quit = true;

    Uint8 * keystates = SDL_GetKeyState(NULL);

    if (keystates[SDLK_LEFT])
        dot.left();
    if (keystates[SDLK_RIGHT])
        dot.right();
    if (keystates[SDLK_SPACE]){     // press spacebar to jump
        if (!jumping){
            jumping = true;
            jump_time = 0;          // new count - not an actual timer
            SDL_Delay(1);
        }
    }

    while (jumping && ((t.now() + 2) < 1000 / FPS)){  // while jumping and 2ms away from frame cap time
        jump_time += dt;                              // float values. dt = .0002
                                                      // why its so low is beyond me


        // if i dont have this line, the dot will not jump
        std::cout << std::endl;


        // G = 9.81
        // MAX_HEIGT = 20
        // X shift = sqrt(MAX_HEIGHT * 2 / G)
        dot.offset.y = height - dot.offset.h - (-G / 2 * (jump_time - XSHIFT) * (jump_time - XSHIFT) + MAX_HEIGHT);
        if (dot.offset.y > (height - dot.offset.h)){
            jumping = false;
            dot.offset.y = height - dot.offset.h;
        }
    }

    SDL_FillRect(screen, NULL, 0xFFFFFF);
    dot.blit(screen);

    if (SDL_Flip(screen) == -1)
        return 1;

    if (t.now() < 1000 / FPS){              // cap frame rate
        SDL_Delay(1000 / FPS - t.now());
        t.start();                          // reset timer
    }
}

Кто-нибудь может объяснить, почему? Я не понимаю, почему это происходит. SDL имеет к этому какое-то отношение?

Ответы [ 2 ]

7 голосов
/ 08 августа 2011

Я почти уверен, что это не что-то особенное для использования cout.Это связано только с количеством времени, которое занимает cout.Тот внутренний цикл, в котором находится оператор cout, никак не контролирует его темп.Это просто контролирует прыжок для чего?2 миллисекунды, верно?

В течение этих 2 миллисекунд точка проходит через столько состояний, сколько может, затем вы делаете еще один кадр, где он получает еще 2 миллисекунды.Этот процесс повторяется до тех пор, пока точка не завершит свой переход.

Когда оператор cout находится там, он, вероятно, занимает значительную часть этих 2 миллисекунд, что означает, что точке требуется больше кадров, чтобы завершить свой переход.

Когда оператор cout снят, цикл просто идет так быстро, что переход завершается за несколько кадров, возможно, за один.Так что либо он настолько быстрый, что вы его просто не видите, либо он настолько быстрый, что вы не можете увидеть его, потому что это сделано до обновления экрана.

Я быРекомендую разработать механизм, позволяющий рассчитывать время прыжка.

5 голосов
/ 08 августа 2011

Я предполагаю, что это более важная часть std :: endl.Неявно endl вызывает очистку потока, что обеспечивает печать данных.Посмотрите, есть ли у SDL что-то для очистки экрана.

...