c++游戏-循环和按键在同一时间



我做了一个类似游戏的东西,你上下移动你的角色(黑盒子),中间有一堵墙,中间有一些空白,墙在右边,它从右到左,如果你碰了墙,游戏就结束了。

我在while循环中得到按键,如;

while(keyboardInput=getKeyPress()){
        switch(keyboardInput){/*checks the key and goes up or down*/}
        //draws the main character, then also draws the wall.
}

和我做了一个wall()函数,它打印块来做墙。

问题是,墙移动只有后得到一个按键,我的按键功能与_getch()

我想看到的是,即使用户没有按任何键,那面墙也会每隔一秒向左边移动,键的按/移动也会以同样的方式工作。

我将wall()函数放入wall()函数中。它就像我想要的那样打印出来但是我不能得到任何按键因为wall() 永远循环

游戏是这样的:

                                    *
                                    *
                                    *
                                    *
                                    *
■
                                    *
                                    *
                                    *
                                    *
                                    *

等待您的答复,谢谢!

对于任何接近游戏或模拟的内容,你需要了解什么是"游戏循环",也称为"主循环"。维基百科上对这个原理有很好的解释。

基本上你不应该等待输入,但你应该循环更新游戏状态,即使什么都没有发生:观察输入,看看是否发生了什么,如果没有,就继续循环,如果发生了什么,就继续循环。你绝对不能等待输入,你只是检查是否有事情要做。

这也意味着你不应该使用像_getch()这样的阻塞调用。你必须使用任何可用的输入函数来检查是否有事情要做。这在很大程度上取决于你正在使用的输入API,所以在不知道你使用的是哪个API的情况下,我无法进入细节。

一个简单的(或者更准确地说:幼稚的)游戏循环是这样的:
while( !exit_game )
{
     read_input(); // acquire inputs then generate actions interpreted from inputs, if any
     update_game(); // update the game to generate it's new state after applying all the actions from all the game entities
     render(); // render the graphics and audio
}

这是非常幼稚的,在实际情况下也不能很好地工作,但这是基本的想法。

为了更好地理解什么是游戏循环,我建议你阅读这两篇文章,但它并没有关注于获取输入。

如果你在Windows上编程,看看_kbhit()。您可以在这里找到_kbhit()的MSDN页面。

尽管_kbhit()在历史上是MS-DOS(后来是Windows)函数(它在Windows系统的<conio.h>中定义),但您可以在Linux中滚动您自己的版本,如这里和这里所示。

然而,更简单的方法可能是使用ncurses库通过调用nodelay(stdscreen, TRUE)getch()转换为非阻塞调用,如图所示。

最新更新