我正在寻找一种以Roguelike方式显示“DOS”输出的方法,即。它就像你有一个DOS窗口,里面装满了字符(级别),当用户按下按钮,用鼠标点击等时,它可以改变或移动。
在正常的DOS窗口(比如来自经典c ++程序或.bat的输出)中,你只能“编写更多文本”,如果有任何变化,那么你必须重绘整个级别,这很麻烦并导致伪影(更新级别)慢慢滚动。)
我知道我可以使用说Qt或SDL并使用字符绘制2D图块来克服这个问题但是我想要做的事情似乎很复杂,是否有一种简单的方法(例如C ++库)可以让我绘制字符/''DOS'窗口中的任何地方?
谢谢!
[编辑]谢谢,我会查看你的所有建议,为所有人+1!
[编辑] PDCurses获胜,可以在这里找到关于如何使用它的教程(它说NCurses但它对于一个简单的Hello世界示例非常有效): http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/
答案 0 :(得分:4)
编写Rogue时,它使用了curses screen control library。
您可以为Windows获得它的各种实现。有些人将curses调用转换为普通的Windows控制台调用:
Others制作一个真正的GUI窗口,然后在“伪造”终端中绘制粗体和下划线等增强功能(就像你使用Qt或SDL绘制图块的想法一样):
如果您希望将自己直接绑定到Microsoft极少使用的控制台API函数,则可以执行此操作。但如果怀旧是你在这个时代追求这样一个用户界面的目标,那么学习诅咒会让你跨平台和让你更好地理解Rogue源代码之类的东西。
如果按照实际的DOS模拟开始是你的目标(根据DOSBox),还有另一个流行的选择:直接访问屏幕内存。你可以偷看并四处寻找......在正确的地方写一个65,然后出现“A”。
然后有ANSI.SYS,当天在许多公告牌系统上使用了......但同样过时了。
答案 1 :(得分:1)
以下是MSDN链接,其中包含一系列可能对您有所帮助的功能:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx
很可能你可以
SetConsoleCursorPosition
WriteConsole
一遍又一遍地做你想做的事。
答案 2 :(得分:1)
如果它真的是DOS,那么ansi.sys将启用颜色代码和positioning cursor: 在server fault,有一个关于在Windows COMMAND.COM中启用ansi代码的线程。尚未测试,HTH。
您可能还想查看ncurses,这是一个移植到许多系统的库。
答案 3 :(得分:1)
还有一个选择:
创建文本区域窗口小部件,例如Qt的QPlainTextEdit
,QTextEdit
或QTextBrowser
,将其设置为只读,将字体设置为固定宽度,并使用所需颜色的文本填充它,固定行数上的固定字符数。
答案 4 :(得分:1)
试试这个:
#include <iostream>
#include <windows.h>
using namespace std;
void gotoxy(int x, int y)
{
static HANDLE hStdout = NULL;
COORD coord;
coord.X = x;
coord.Y = y;
if(!hStdout)
{
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
}
SetConsoleCursorPosition(hStdout,coord);
}
int main(void)
{
gotoxy(30 , 12);
cout<<" Writing anywhere \n";
gotoxy(1 , 22);
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}