我正在制作一个可能相当于“roguelike”游戏的东西,这样我就可以夸大一些有趣的想法,我已经浮现在脑海中。游戏玩法不会成为地下城爬行,但无论如何,显示器将以类似的方式完成,并带有简单的ascii字符。
由于这是一种自我锻炼,我努力自己编写大部分代码。
最终我想让游戏在任意大型游戏世界中运行。 (到了我预计游戏网络化并跨越计算机实验室中的许多监视器的程度)。
现在,我已经有了一些可以读写文本控制台任意部分的代码,并设置了一个简单的分区系统,以便我可以有效地进行路径查找。
我已经运行了一些基准测试,最大的瓶颈是重新绘制文本控制台。
拥有大型游戏世界需要智能更新显示屏。我不想每帧都重新推送我的整个游戏缓冲区... 我需要一些关于如何设置它的指针,以便它只绘制已经更新的游戏部分。(而不仅仅是我现在拥有的个人角色)
我一直在通过windows.h操作windows控制台,但我也有兴趣让它通过连接到服务器的puTTY客户端在linux机器上运行。
我尝试过调整一些视频处理程序,因为像素和角色之间的比例几乎是1:1,但我没有运气。
我真的想简单解释其背后的一些原则。但是一些示例(psudo)代码也会很好。
答案 0 :(得分:6)
使用Curses,或者如果您需要自己动手,请阅读有关VTnnn控制代码的信息。这两个应该适用于Windows和* nix术语和控制台(和Windows)。您还可以查阅nethack源代码以获取提示。这样您就可以在屏幕上更改已发生更改的字符。
答案 1 :(得分:4)
我不会声称理解这一点,但我相信这与James Gosling的传奇Gosling Emacs重绘代码背后的问题非常接近。请参阅他的论文,标题为“重新显示算法”,以及一般string-to-string correction problem。
答案 2 :(得分:1)
拥有一个庞大的游戏世界 需要智能更新 显示。我不想要 每次重新推动我的整个游戏缓冲区 框架...我需要一些指示如何 设置它以便它只绘制 游戏的各个部分都有过 更新。 (而不仅仅是个人 我现在有的角色)
游戏世界的大小并不真正相关,因为您需要做的就是为每个客户端计算可见区域并发送该数据。如果你有一个典型的80x25控制台显示器,那么你每次只发送2或3千字节的数据,即使你添加了颜色代码等。这是大多数具有这种性质的在线游戏的典型特征:更新人们可以看到的内容,而不是世界上的所有内容。
如果您想尝试寻找降低发送内容的方法,那么可以随意为学习目的而努力,但是我们距离更新控制台显示效率低了大约10年在接近实时的事情中,浪费时间来解决不需要修复的问题将是一种耻辱。请注意,上面链接的PDF提供O(ND)解决方案,而简单地发送整个控制台是O(N)的一半,其中N被定义为A和B以及D的长度之和。