Четверг, 25 Апреля 2024, 17:46

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Графика в консоли
Графика в консоли
SaiteiДата: Четверг, 03 Января 2013, 19:26 | Сообщение # 1
старожил
Сейчас нет на сайте
Привет всем! Может быть я всем уже надоел, но... Кого ещё не сильно задрал - великодушно прошу помочь\подсказать happy
Совсем недавно я загорался желанием переходить на OpenGL, но там возникли свои обстоятельства и не получилось... Поэтому снова возвращаюсь к программированию на консоль. Суть дела такова: уже давно (месяцев эдак три точно прошло) мечтаю попробовать написать консольную игрушку с символьной графикой (вроде это называется "ASCII игры", точно не знаю... Если глупость ляпнул - прошу поправить).
Проблема моя заключается в том, что я не знаю куда смотреть и что учить. Местами понимаю как должен работать алгоритм, но каких-либо функций для реализации я не знаю.
Если вам не сложно - то пожалуйста, помогите, подскажите на что обратить внимание и вообще что учить. Было бы совсем шикарно - если вы показали какой-нибудь легенький пример (как говорится "показали мастер-класс :)").
Классы понимать начал, с массивами уже работал. Типы переменных и циклы тоже знаю. Дело именно в том, что не знаю куда смотреть... Так как мне быть? ПРИМУ ЛЮБУЮ ПОМОЩЬ И СОВЕТЫ

Добавлено (03.01.2013, 19:26)
---------------------------------------------
пока я думаю над таким алгоритмам: вся карта - двумерный массив типа byte. И в зависимости от значения в определенном месте ставится определенный символ (например 1 = "%"). Массив перерисовывается\изменяется каждый раз за N миллисекунд. Но как нарисовать массив в консоли и как "управлять" (т.е. смещать какой-либо объект) массивом - не знаю... Хоть убейте - не знаю. А хочется знать

SEvgДата: Четверг, 03 Января 2013, 19:30 | Сообщение # 2
Алхимик
Сейчас нет на сайте
Вот человек кажется, тоже двигался в этом напровление, может поможет, тырк...
GECKДата: Четверг, 03 Января 2013, 20:20 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Как-то занимался подобным. Можешь погуглить про библиотеку ncurses, хотя гораздо интереснее во всем разобраться самому smile Тем более это не так уж сложно. Вот тут есть все, что нужно.

Всё гениальное просто. И хреново работает.

Сообщение отредактировал GECK - Четверг, 03 Января 2013, 20:57
SaiteiДата: Четверг, 03 Января 2013, 20:59 | Сообщение # 4
старожил
Сейчас нет на сайте
GECK, спасибо за ссылки, сейчас посмотрю.
Мне действительно очень интересно =) Буквально минуты три назад смог инициализировать и нарисовать двумерный массив. Даже и не подозревал, что такие чудеса творить можно..))
Правда вот как я делаю:
Цитата (Saitei)
Массив перерисовывается\изменяется каждый раз за N

то консоль сама по себе блымает. Ну или при передвижении ГГ (великая честь для символа "Т"...)) ). Это как-нибудь устранить можно? Задержки как таковой четкую я не ставил. Всё идет через чистый while(true)
GECKДата: Четверг, 03 Января 2013, 21:25 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Чтобы избавиться от мерцания, нужно выводить весь новый кадр разом. Например сделать два буфера - один из них держать в памяти и туда все рисовать, а второй выводить на экран, и каждый кадр менять их местами.
Нашел старую демку, где по экрану бегает @. Там именно так и сделано. Если будут вопросы - спрашивай smile


Всё гениальное просто. И хреново работает.
SaiteiДата: Пятница, 04 Января 2013, 16:55 | Сообщение # 6
старожил
Сейчас нет на сайте
GECK, Блин... А ссылку не могу открыть ("Веб-страница недоступна")...
Можете как-нибудь перезалить, если не сложно? Очень обрадовался, с удовольствием посмотрю! smile

Добавлено (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 пока что нереализуемо?
Форум игроделов » Программирование » C/C++ » Графика в консоли
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг