c++拒绝正常运行,除非使用cout
C++ refuses to run properly unless cout is used
此代码可以编译,但在没有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是否有东西可以刷新屏幕
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- std::cout.imbue()多重调用
- 访问被拒绝后,c++中的故障保护代码
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- IpOpt拒绝解决不受约束的问题
- Termux权限被拒绝
- AWS Lambda C++运行时权限被拒绝
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 在 COUT 语句中使用 COUT 调用函数
- GCC 4.8.2 自动矢量化由于 cout 而失败
- std::cout输出int时出现编译错误
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- C++ Setter/Getter,cout 工作,printf 失败
- WinSock2:connect() 提供"连接被拒绝"
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 结构元素名称要 cout?
- c++拒绝正常运行,除非使用cout