Понедельник, 02 Декабря 2024, 15:38

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Нужны идеи (программные) для реализации консольной игры
SaiteiДата: Среда, 19 Сентября 2012, 17:30 | Сообщение # 1
старожил
Сейчас нет на сайте
Вообщем у меня появилось совсем малось свободного времени и в голову стукнула мысль: написать консольную игру. С генератором "карты" (в качестве "почвы" или же "земли" будет служить символ "#") и "игроком" (ему символ не придумал (: ). Интересует вот что: а как, собственно, будет обновляться экран? Через цикл - это понятно. Ну а как саму генерацию осуществить + прыжок "игрока"?
LetsOffBrainsДата: Среда, 19 Сентября 2012, 17:59 | Сообщение # 2
Project SoRDeLKa
Сейчас нет на сайте
Недавно прошедший конкурс на ИГДЦ. Качай архив, чуть ниже.
Там имеются исходники нескольких консольных игр (2-х happy ).
Лучшая игра у Широна и там осуществляется генерация, но вид какбы сверху.
Во второй игре вроде бы как платформер.
Как раз то, что нужно. Если я не ошибаюсь...





Сообщение отредактировал 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 цветов) и бит мерцания (если включен - символ мигает).
Для использования кириллицы в консольной игре потребуется установить в системе русификатор консоли, потому что по умолчанию там только латиница и символы с диакритическими знаками... sad

***
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++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
  • Страница 1 из 1
  • 1
Поиск:

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