我正在尝试创建乒乓球游戏,我需要说“如果用户在500毫秒内没有按空格,请说'你输了!'如果没有,将球飞向另一端。“
问题是我不能在if语句中使用像Sleep()
这样的函数:
if (Sleep(500)) {cout << "You lost!"}
我可以在if语句中使用任何时间函数吗?
答案 0 :(得分:3)
没有
您编程的级别低于使用简单表达式的语言来定义这样的规则。
从根本上说,你需要:
在最基本的层面上你可以做到这一点:
select
,poll
,epoll
会想到一个超时参数(并确保你没有重置超时)其他键被按下了,或者通常,为了“正确”地做事,我们将这个逻辑嵌入到某个引擎实现“事件循环”(在游戏或I / O繁重的应用程序中特别常见)所提供的功能中。 p>
进一步的信息将需要一本书来充分解释,因此在这种媒介中并不合适。但是,至少现在您知道要在现有材料中探索哪些主题。
我曾为我的应用程序编写了一个小脚本语言,因此我可以只定义整洁的高级规则,“编译器”会利用我的事件循环来实现它们。它使我的应用程序的维护和扩展变得非常容易,这在当时很重要,因为规则变得相当复杂并且应用程序的范围很广。计算机游戏引擎嵌入自己的脚本功能(比如使用“Lua”语言)来实现相同的目标并不罕见。
答案 1 :(得分:2)
从一开始就考虑整个游戏设计是件好事,因为它有助于在设计阶段解决这样的问题,而不是进一步发展。
我不确定您使用的是哪个库,但在sfml中它看起来像这样:
// Clock holds the current time.
// When we call Restart it returns the elapsed time since the last restart.
// With the current time and the start time we can find the elapsed time.
sf::Clock clock;
sf::Time maxTime = sf::milliseconds(500);
while(window.isOpen())
{
clock.Restart();
while(window.PollEvents(sf::Event e))
{
if(e.type == sf::Event::KeyPressed)
{
if(e.key.code == UP || e.key.code == DOWN || e.key.code == AnyOfOurOtherKeys)
{
maxTime = sf::milliseconds(500);
}
if(e.key.code == UP)
{
// Handle each individual key
}
if(e.key.code == DOWN)
{
// Handle each individual key
}
etc..
}
maxTime -= clock.Restart();
if(maxTime < sf::milliseconds(0))
{
std::cout << "Game Over, no input detected for 500 ms" << std::endl;
}
}
无论使用哪种库,您都可以使用std::chrono::high_resolution_clock
,std::chrono::milliseconds
和std::chrono::duration
来获得相同的结果。
当你进行游戏循环时,你想获得startLoopTime,然后在游戏循环结束时你需要你的endLoopTime。然后你可以这样做:
totalLoopTime = endLoopTime - startLoopTime;
maxTime -= totalLoopTime;
当您处理输入时,您需要一个系统,如果使用具有某个功能的键,则将maxTime设置为500ms。您可以选择在按下某个键时将bool设置为true,然后对bool运行检查以重新启动maxTime。