Нужны идеи (программные) для реализации консольной игры
| |
Saitei | Дата: Среда, 19 Сентября 2012, 17:30 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Вообщем у меня появилось совсем малось свободного времени и в голову стукнула мысль: написать консольную игру. С генератором "карты" (в качестве "почвы" или же "земли" будет служить символ "#") и "игроком" (ему символ не придумал (: ). Интересует вот что: а как, собственно, будет обновляться экран? Через цикл - это понятно. Ну а как саму генерацию осуществить + прыжок "игрока"?
|
|
| |
LetsOffBrains | Дата: Среда, 19 Сентября 2012, 17:59 | Сообщение # 2 |
Project SoRDeLKa
Сейчас нет на сайте
| Недавно прошедший конкурс на ИГДЦ. Качай архив, чуть ниже. Там имеются исходники нескольких консольных игр (2-х ). Лучшая игра у Широна и там осуществляется генерация, но вид какбы сверху. Во второй игре вроде бы как платформер. Как раз то, что нужно. Если я не ошибаюсь...
Сообщение отредактировал LetsOffBrains - Среда, 19 Сентября 2012, 18:11 |
|
| |
TimKruz | Дата: Среда, 19 Сентября 2012, 22:24 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| Quote (Saitei) Ну а как саму генерацию осуществить + прыжок "игрока"? Абсолютно точно так же, как и с графическими играми. Да и вывод на экран похож, только вместо картинок - символы. Quote (Saitei) а как, собственно, будет обновляться экран? Всё просто. Тебе нужен массив-буфер и массив с абсолютным адресом, указывающим первую страницу текстового буфера экрана (с точки зрения DOS). Затем ты в массиве-буфере вручную каждый кадр расставляешь необходимые элементы, либо передвигаешь уже существующие. Естественно, тебе понадобятся дополнительные буферы (например, карта), переменные и/или объекты (для персонажей и т.п.). Каждый кадр ты копируешь всё из своего буфера в буфер экрана. Это общий, универсальный вариант. Есть более быстрый способ. Текстовый экран в DOS состоит из страниц, по умолчанию отображается нулевая, но их можно переключать с помощью одной функции MS-DOS, не помню её номер. Тогда ты "рисуешь", например, на странице №1, переключаешь вид на неё, затем рисуешь на №0, переключаешь на 0, рисуешь на 1 и так далее. В эпоху подобных игр такой способ использовали часто. Количество страниц зависит от объёма видеопамяти; поэтому можно, например, заранее заготовить 8 страниц и отображать анимацию их переключением... Кстати. Символы в 16-цветном текстовом режиме задаются двумя байтами. Один - собственно символ, а во втором содержится цвет символа (4 бита, 16 цветов), цвет фона (3 бита, 8 цветов) и бит мерцания (если включен - символ мигает). Для использования кириллицы в консольной игре потребуется установить в системе русификатор консоли, потому что по умолчанию там только латиница и символы с диакритическими знаками...
*** Quote (Saitei) Через цикл - это понятно. Да. Не забывай, во-первых, делать паузу, чтобы не хавать все ресурсы процессора; во-вторых, следить за буфером клавиатуры - нажатиями клавиш пользователем. То есть, в цикле тебе нужно сначала проверять буфер клавиатуры и, соответственно, изменять условия генерации кадра (дальнейшей работы программы), затем обрабатывать игровую ситуацию (NPC сделал шаг, герой сделал удар, прошло n секунд и т.п.), и только потом строить картинку и выводить в буфер.
Мышь не советую использовать. В текстовом режиме она будет выглядеть как инвертированный относительно фона прямоугольник/квадрат (смотря сколько строк на экране). Плюс дополнительно курсор обрабатывать, где нажали и тому подобное... Нет, это сделать можно, но в консольной игре без графики это как-то никому не нужно. Курсор в текстовом режиме используется, например, в текстовых редакторах, чтобы быстро перейти к нужному фрагменту текста, переключить рабочие окна или пролистать текст...
Сообщение отредактировал TimKruz - Среда, 19 Сентября 2012, 22:32 |
|
| |
Saitei | Дата: Четверг, 20 Сентября 2012, 18:24 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Столкнулся с проблемой: а как нарисовать и отобразить массив map[][], но при этом не запутавшись? Чтобы я точно и ясно видел свою карту, сделал бы её из символов?
|
|
| |
TimKruz | Дата: Четверг, 20 Сентября 2012, 19:53 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Quote (Saitei) но при этом не запутавшись? А в чём конкретно ты путаешься? В строчках/столбцах или числах/символах? Используй map[строка][столбец]=код_элемента, а при выводе на экран преобразуй код_элемента в конкретный символ. Например, у земли код 0, но при выводе на экран она отображается, скажем, символом пробела на коричневом фоне.
|
|
| |
Saitei | Дата: Четверг, 20 Сентября 2012, 22:35 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| TimKruz, как можно написать и отобразить двумерный массив, чтобы в консоли отобразилось что-то вроде этого: Code #################### # # # # # # # # # # # # #################### ?
Сообщение отредактировал Saitei - Четверг, 20 Сентября 2012, 22:36 |
|
| |
Archido | Дата: Пятница, 21 Сентября 2012, 06:48 | Сообщение # 7 |
Сэнсэй
Сейчас нет на сайте
| Quote (Saitei) как можно написать и отобразить двумерный массив, чтобы в консоли отобразилось что-то вроде этого: Ну а собственной головой подумать? Это ж элементарные вещи совсем:
Code const int Width = 16; const int Height = 16;
char Map[Width][Height]; memset(Map, '#', sizeof(Map));
for (int i = 1; i < Width - 1; i++) for (int j = 1; j < Height - 1; j++) Map[i][j] = ' ';
//Render for (int i = 0; i < Width; i++) { for (int j = 0; j < Height; j++) { std::cout << Map[i][j]; } std::cout << '\n'; }
std::cout << '\n'; system("pause");
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
|