Графика в консоли
|
|
Saitei | Дата: Четверг, 03 Января 2013, 19:26 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Привет всем! Может быть я всем уже надоел, но... Кого ещё не сильно задрал - великодушно прошу помочь\подсказать Совсем недавно я загорался желанием переходить на OpenGL, но там возникли свои обстоятельства и не получилось... Поэтому снова возвращаюсь к программированию на консоль. Суть дела такова: уже давно (месяцев эдак три точно прошло) мечтаю попробовать написать консольную игрушку с символьной графикой (вроде это называется "ASCII игры", точно не знаю... Если глупость ляпнул - прошу поправить). Проблема моя заключается в том, что я не знаю куда смотреть и что учить. Местами понимаю как должен работать алгоритм, но каких-либо функций для реализации я не знаю. Если вам не сложно - то пожалуйста, помогите, подскажите на что обратить внимание и вообще что учить. Было бы совсем шикарно - если вы показали какой-нибудь легенький пример (как говорится "показали мастер-класс :)"). Классы понимать начал, с массивами уже работал. Типы переменных и циклы тоже знаю. Дело именно в том, что не знаю куда смотреть... Так как мне быть? ПРИМУ ЛЮБУЮ ПОМОЩЬ И СОВЕТЫДобавлено (03.01.2013, 19:26) --------------------------------------------- пока я думаю над таким алгоритмам: вся карта - двумерный массив типа byte. И в зависимости от значения в определенном месте ставится определенный символ (например 1 = "%"). Массив перерисовывается\изменяется каждый раз за N миллисекунд. Но как нарисовать массив в консоли и как "управлять" (т.е. смещать какой-либо объект) массивом - не знаю... Хоть убейте - не знаю. А хочется знать
|
|
| |
SEvg | Дата: Четверг, 03 Января 2013, 19:30 | Сообщение # 2 |
Алхимик
Сейчас нет на сайте
| Вот человек кажется, тоже двигался в этом напровление, может поможет, тырк...
|
|
| |
GECK | Дата: Четверг, 03 Января 2013, 20:20 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Как-то занимался подобным. Можешь погуглить про библиотеку ncurses, хотя гораздо интереснее во всем разобраться самому Тем более это не так уж сложно. Вот тут есть все, что нужно.
Всё гениальное просто. И хреново работает.
Сообщение отредактировал GECK - Четверг, 03 Января 2013, 20:57 |
|
| |
Saitei | Дата: Четверг, 03 Января 2013, 20:59 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| GECK, спасибо за ссылки, сейчас посмотрю. Мне действительно очень интересно =) Буквально минуты три назад смог инициализировать и нарисовать двумерный массив. Даже и не подозревал, что такие чудеса творить можно..)) Правда вот как я делаю: Цитата (Saitei) Массив перерисовывается\изменяется каждый раз за N то консоль сама по себе блымает. Ну или при передвижении ГГ (великая честь для символа "Т"...)) ). Это как-нибудь устранить можно? Задержки как таковой четкую я не ставил. Всё идет через чистый while(true)
|
|
| |
GECK | Дата: Четверг, 03 Января 2013, 21:25 | Сообщение # 5 |
заслуженный участник
Сейчас нет на сайте
| Чтобы избавиться от мерцания, нужно выводить весь новый кадр разом. Например сделать два буфера - один из них держать в памяти и туда все рисовать, а второй выводить на экран, и каждый кадр менять их местами. Нашел старую демку, где по экрану бегает @. Там именно так и сделано. Если будут вопросы - спрашивай
Всё гениальное просто. И хреново работает.
|
|
| |
Saitei | Дата: Пятница, 04 Января 2013, 16:55 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| GECK, Блин... А ссылку не могу открыть ("Веб-страница недоступна")... Можете как-нибудь перезалить, если не сложно? Очень обрадовался, с удовольствием посмотрю! Добавлено (03.01.2013, 22:11) --------------------------------------------- скачал. Сейчас буду рассматривать)) Вопросы лучше сюда задавать или лично Вам в ЛС? Мне действительно очень интересно. Серьёзно - о написании таких игрушек мечтаю уже довольно давно Добавлено (04.01.2013, 16:55) --------------------------------------------- кто-то сделает пример (минимальный, легкий) реализации двухбуфферной отрисовки? У меня сегодня день рождения - сделайте подарок (lol)) )
|
|
| |
TimKruz | Дата: Суббота, 05 Января 2013, 02:18 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Цитата (Saitei) не знаю куда смотреть Ну игры с символьной графикой делаются точно так же, как и обычные, только вывод картинки другой. В первую очередь нужно узнать и запомнить устройство видеобуфера в текстовом режиме MS-DOS. Так же, как и в графическом режиме, он видеопамять разделёна на страницы, из которых только одна выводится на экран. Какую конкретно выводить (по-умолчанию нулевая) - задаётся функцией какого-то прерывания MS-DOS (не помню номер, но список всех прерываний и их функций можно легко найти). Именно эта особенность часто использовалась для создания на экране анимации - кадр рисовался на странице, не выводящейся на экран, затем она устанавливалась выводящейся на экран, а следующий кадр рисовался на другой странице (двух страниц достаточно). Каждый символ на экране кодируется двумя байтами, один - собственно символ, второй - его атрибуты (цвет символа 4 бита, цвет фона 3 бита и бит мерцания, но он в таких играх вряд ли может понадобится). А ещё следует изучить стандартный для MS-DOS набор символов, там кроме всего прочего есть специальные символы псевдографики, правда, для игр не очень подходит, но пригодится. Ну и режим экрана можно установить не стандартный 80 столбцов 25 строк, а 80 столбцов 50 строк (если развернуть консоль на весь экран, символы получатся как бы квадратные).
Алгоритм вывода на экран примерно следующий. Всю карту хранишь в одном массиве или любой другой структуре памяти, плюс отдельно позиции персонажей и т.п. Далее нужно два массива с абсолютной адресацией на две страницы в видеопамяти (конкретные адреса памяти сам найдёшь в интернете, я не помню). Абсолютная адресация позволяет редактировать содержимое напрямую. Далее осуществляешь вписывание нужных символов с их атрибутами в массив, меняешь страницу, выводящуюся на экран, и всё.
|
|
| |
Saitei | Дата: Суббота, 05 Января 2013, 15:30 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| TimKruz, это, как я понял, на чистом iostream пока что нереализуемо?
|
|
| |