SDL播放器做3秒钟然后停止

我会让我的玩家在他一生之后重生,但是我希望他在2到3秒内无敌,因为他会阻挡敌人的子弹。

for (int i = 0; i < MAX_BULLETS; i++) if (enemyB[i]) { if(globalTime % 2 == 0) enemyB[i]->y -= enemyB[i]->dx; if (player->alive && (enemyB[i]->x > player->x && enemyB[i]->x < player->x + 97 && enemyB[i]->y == player->y-15)) { if (player->invincible == false) { player->life -= 25; player->hbSprite++; } if (player->life <= 0) { player->invincible = true; player->lives--; player->life = 100; player->lifeSprite++; player->hbSprite = 0; if (player->lives <= 0) { player->alive = 0; player->hbSprite = 4; player->lifeSprite = 3; } } removenemyB(i); } } 

当我设置player-> invicible = true的时候,他没有使用伤害,但是我需要他这么做只有2或3秒,请帮助。

鉴于您正在使用SDL2, SDL_GetTicks()是最直接的解决scheme。 SDL_AddTimer也是一个选项,但是你必须处理一些multithreading,不必要的重复执行和callback函数。

我看到你有一个globalTimevariables,我倾向于把它作为我的答案的一部分,但是我没有足够的上下文来提供你已经提供的代码来确定variables是如何被更新的。

也就是说,用玩家不再立于不败之地的游戏时间取代设置无敌

 // ... if (player->life <= 0) { player->endInvincibleTime = SDL_GetTicks() + 3000; // 3 seconds // ... // endInvincibleTime is Uint32 type 

这相当于将来在某个固定点设置一个标记。 游戏时间最终会永久通过它。

然后,而不是检查无敌,只是检查游戏时间已经过去endInvincibleTime

 // ... if (player->endInvincibleTime < SDL_GetTicks()) { player->life -= 25; player->hbSprite++; } // ... 

SDL_GetTicks返回一个无符号的32位整数,这意味着从SDL_Init被调用的那一刻SDL_Init ,它的计时器开始计数毫秒,并且它能够计数达49 的毫秒数。


请注意,我在此建议您直接使用SDL_GetTicks作为您的游戏持续时间/计时系统,但这只是为了举例。 还有其他的方式来跟踪时间。 例如使用不同的时序库或STL。 它们或多或less地具有更好的精度和/或更可靠的响应时间。 这里有更多关于C计时器的阅读 总是要小心整数溢出/环绕。 特别是使用无符号整数时。