我怎样才能创造时间条件?

时间:2017-05-02 18:37:59

标签: c++ sleep

我正在尝试创建乒乓球游戏,我需要说“如果用户在500毫秒内没有按空格,请说'你输了!'如果没有,将球飞向另一端。“

问题是我不能在if语句中使用像Sleep()这样的函数:

if (Sleep(500)) {cout << "You lost!"}

我可以在if语句中使用任何时间函数吗?

2 个答案:

答案 0 :(得分:3)

没有

您编程的级别低于使用简单表达式的语言来定义这样的规则。

一些想法

从根本上说,你需要:

  1. 设置500毫秒的计时器
  2. 为按键设置处理程序
  3. 如果设置了布尔标志,或者“将球送入网中”,请让你的计时器到期处理程序说“你输了”。
  4. 如果按键是 Space
  5. ,请让您的处理程序切换该布尔标志

    在最基本的层面上你可以做到这一点:

    • 直接使用两个工作线程,或
    • 粗略地只是通过“等待”按键活动(selectpollepoll会想到一个超时参数(并确保你没有重置超时)其他键被按下了,或者
    • 在您的操作系统的帮助下,使用例如一个POSIX计时器(虽然要谨慎;这会将你送到特定平台,C兼容的土地,这可能不是你最终想要的地方)。

    通常,为了“正确”地做事,我们将这个逻辑嵌入到某个引擎实现“事件循环”(在游戏或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_clockstd::chrono::millisecondsstd::chrono::duration来获得相同的结果。

当你进行游戏循环时,你想获得startLoopTime,然后在游戏循环结束时你需要你的endLoopTime。然后你可以这样做:

totalLoopTime = endLoopTime - startLoopTime;
maxTime -= totalLoopTime;

当您处理输入时,您需要一个系统,如果使用具有某个功能的键,则将maxTime设置为500ms。您可以选择在按下某个键时将bool设置为true,然后对bool运行检查以重新启动maxTime。