2

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

我在一个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()永远循环

游戏看起来像这样:

                                    *
                                    *
                                    *
                                    *
                                    *

■

                                    *
                                    *
                                    *
                                    *
                                    *

我在等你的答复,谢谢!

4

2 回答 2

3

对于任何接近游戏或模拟的东西,您需要了解什么是“游戏循环”,也称为“主循环”。维基百科上有一个很好的原理解释。

基本上你不应该等待输入,但你应该循环更新游戏的状态,即使什么也没发生:观察输入,看看是否发生了什么,如果没有,就继续循环,如果有什么发生,做,然后继续循环。您必须永远不要等待输入,您只需检查是否有事情要做。

这也意味着你不应该使用像 _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
}

这是非常幼稚的,在实际案例中效果不佳,但基本上就是这个想法。

我建议阅读这个这个以更好地理解什么是游戏循环,但它并不专注于获取输入。

于 2014-03-18T23:12:50.230 回答
1

如果您在 Windows 中编程,请查看_kbhit(). _kbhit() 您可以在此处找到 MSDN 页面。

尽管_kbhit()历史上是 MS-DOS(以及后来的 Windows)功能(<conio.h>在 Windows 系统中定义),但您可以在 Linux 中滚动您自己的版本,如此此处所示。

但是,更简单的方法可能是使用ncursesgetch()通过调用转换为非阻塞调用nodelay(stdscreen, TRUE),如此此处所示。

于 2014-03-18T22:59:38.827 回答