c++拒绝正常运行,除非使用cout

C++ refuses to run properly unless cout is used

本文关键字:cout 拒绝 正常运行 c++      更新时间:2023-10-16

此代码可以编译,但在没有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有关吗?

我很确定这不是使用cout所特有的。它只与使用cout所花费的时间有关。cout语句所在的内循环没有任何东西控制它的速度。它控制跳跃的目的是什么?2毫秒,对吧?

在这2毫秒内,点经历了尽可能多的状态,然后你做另一帧,在那里它又得到了2毫秒。这个过程一直重复,直到圆点完成它的跳跃。

当cout语句在那里时,它可能占用了2毫秒的很大一部分,这意味着dot需要更多帧来完成它的跳转。

当取出cout语句时,循环进行得非常快,以至于跳转在很少的帧内完成,可能只有一帧。所以要么它太快了,你看不到它,要么它太快了,你不能看到它,因为它在屏幕更新之前完成了。

我建议你设计出一种机制来一致地定时跳转。

我猜std::endl部分更重要。endl隐式地强制刷新流,从而确保打印数据。看看SDL是否有东西可以刷新屏幕