此代码编译,但在没有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与它有关吗?
答案 0 :(得分:7)
我很确定这不是使用cout特有的东西。它只与使用cout所花费的时间有关。 cout语句所处的内部循环没有控制它的速度。它只是控制跳跃的东西? 2毫秒,对吧?
在那2毫秒内,点经过尽可能多的状态,然后你再做另一帧,在那里得到另外2毫秒。重复该过程,直到点完成它的跳跃。
当cout语句在那里时,它可能占用了2毫秒的很大一部分,这意味着它需要更多的帧来完成它的跳跃。
当取出cout语句时,循环进行得非常快,跳转在很少的帧中完成,可能只有一帧。所以要么它太快以至于你没有看到它,要么它太快以至于无法看到它,因为它是在屏幕更新之前完成的。
我建议你制定一种机制来持续计时跳跃。
答案 1 :(得分:5)
我猜它更重要的是std :: endl部分。隐含地,endl强制刷新流,从而确保打印数据。看看SDL是否有东西可以刷新屏幕。