Запись в любом месте окна DOS

Я ищу способ показать вывод «DOS» в стиле Roguelike, т.е. это похоже на то, что у вас есть окно DOS, заполненное символами (уровень), которые могут меняться или перемещаться, когда пользователь нажимает кнопки, щелкает мышью и т. д.

В обычном окне DOS (скажем, вывод из классической программы C++ или .bat) вы можете только «написать больше текста», и вам придется перерисовывать весь уровень, если что-то изменится, что громоздко и вызывает артефакты (обновленный уровень медленно прокручивается в ).

Я знаю, что могу использовать, скажем, Qt или SDL и рисовать 2D-плитки с символами, чтобы преодолеть эту проблему, но это кажется сложным для того, что я хочу сделать, есть ли простой способ (скажем, библиотека C++), который позволит мне рисовать символы в любом месте / окно 'DOS'?

Спасибо!

[EDIT] Спасибо, я рассмотрю все ваши предложения, +1 за все!

[EDIT]PDCurses победил, руководство по его использованию можно найти здесь (здесь написано NCurses, но оно отлично работает для простого примера Hello world): http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/


person Valmond    schedule 21.11.2012    source источник


Ответы (5)


Когда Rogue был написан, он использовал библиотеку управления экраном curses.

Вы можете получить различные реализации для Windows. Некоторые переводят вызовы curses в обычные вызовы консоли Windows:

PDCurses для Windows

Другие создают настоящее окно с графическим интерфейсом, а затем рисуют расширенные функции, такие как полужирный шрифт и подчеркивание, в «фальшивом» терминале (например, ваша идея использовать Qt или SDL для рисования плиток):

PDCurses для "настоящей" Windows

Если вы хотите напрямую связать себя с редко используемыми консольными API-функциями Microsoft, вы можете это сделать. Но если ваша цель — создать такой пользовательский интерфейс в наши дни, ностальгия, то изучение проклятий сделает вас кроссплатформенным и позволит вам лучше понять такие вещи, как исходный код Rogue.

И если вашей целью является эмуляция реальной DOS (согласно DOSBox), был еще один популярный вариант : прямой доступ к памяти экрана. Вы можете заглянуть и поковыряться ... написать 65 в нужном месте, и появится буква «А».

Затем был ANSI.SYS, который в свое время использовался во многих системах досок объявлений. .. но так же устарел.

person HostileFork says dont trust SE    schedule 21.11.2012

Вот ссылка MSDN с рядом функций, которые могут вам помочь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx

Скорее всего, вы могли бы

SetConsoleCursorPosition
WriteConsole

Снова и снова, чтобы делать то, что вы хотите.

person Connor Hollis    schedule 21.11.2012

Если это действительно DOS, то ansi.sys активирует цветовые коды и позиционирование курсора: В разделе ошибка сервера есть тема о включение кодов ansi в Windows COMMAND.COM. Не проверял, HTH.

Вы также можете проверить ncurses, библиотеку, портированную на многие системы.

person Aki Suihkonen    schedule 21.11.2012

Еще одна альтернатива:

Создайте виджет текстовой области, такой как Qt QPlainTextEdit, QTextEdit или QTextBrowser, сделайте его доступным только для чтения, установите шрифт фиксированной ширины и заполните его текстом желаемого цвета, фиксированным количеством символов в фиксированном количестве строк.

person hyde    schedule 21.11.2012
comment
Я на самом деле думал об этом, но у него не было бы старого доброго чувства DOS (ИМХО), в любом случае +1 - person Valmond; 21.11.2012
comment
Для этого старого доброго чувства DOS, я думаю, вам нужен полноэкранный текстовый режим... И я думаю, что это было бы лучше всего эмулировать, создав собственный полноэкранный виджет (возможно, используя что-то вроде этих предложений в качестве средства визуализации или рисуя самостоятельно) с правильным шрифтом. Кроме того, для дополнительного реализма вам, возможно, придется поэкспериментировать с созданием правильного вида блоков/мягкости/сканированных линий ЭЛТ, чтобы он соответствовал оригиналу, и в этом случае индивидуальная окраска, вероятно, подойдет :) - person hyde; 21.11.2012
comment
@Valmond для лучшего понимания, вам, возможно, придется использовать шейдеры OpenGL, это то, что сделали другие: filthypants.blogspot.fi/2010/12/ - person hyde; 21.11.2012
comment
Я просто не хотел, чтобы это был большой проект, в котором он не будет работать на интегрированных видеокартах и ​​т. д. (было такое!), просто что-то простое, и pdcurse прекрасно с этим справляется :-) Спасибо! - person Valmond; 21.11.2012

Попробуй это:

#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;
}
person Software_Designer    schedule 21.11.2012
comment
Спасибо, но я уже нашел pdcurse и абсолютно им доволен. +1 в любом случае ^^ - person Valmond; 21.11.2012