Барионикс 0.5.3a

laber.rlgclub.ru

Модератор: Maelstrom

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Cfyz » 10 фев 2013, 15:59

Uvadzucumi писал(а):да. но есть 3-й вариант (если предполагается что одно действие может дикую портянку текста нагенерировать, а такое в принципе возможно, если там 500х500 заруб в экране, и в интерфейсе игры для него всего 2 строчки). можно малой кровью сделать окно лога, отдельным экраном и с прокруткой. несколько хуже будет этот вариант - если строчек всего 1-3 видно на основном экране, а действие 10 нагенерировало, но зато, не нужно 250 раз жать на пробел при одном ходе, если строчек 500 нагенерировало. если нужно - окрыли лог и посмотрели. не нужно - сразу другой ход делаем - а не давим все время далее, пока "неожиданно", нажали вместо "далее", "пропустить следующий ход".
Даже оставив в стороне чудовищность идеи отдельного окна на внутриигровой лог, все равно на это окно потребуется поток. Нельзя в одном потоке и висеть, и рисовать одновременно. Вообще ничего в одном потоке нельзя одновременно. Можно, конечно, придумать хак с обработкой очереди сообщений ОС и отрисовкой в том самом месте, где мы застопорились внутри некоторой функции, но это просто жуткий костыль какой-то.
Пытается раскуклиться

Аватара пользователя
Uvadzucumi
Сообщения: 365
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Uvadzucumi » 10 фев 2013, 16:16

Cfyz писал(а):Можно, конечно, придумать хак с обработкой очереди сообщений ОС и отрисовкой в том самом месте, где мы застопорились внутри некоторой функции, но это просто жуткий костыль какой-то.
так разумеется делать НЕЛЬЗЯ! мы в обработке делаем только например:

Код: Выделить всё

messages->puts("дварф Петя дал подзатыльник хоббиту Васе");
....
messages->puts("Петя скончался...");
messages->puts("Довольный хоббит, деловито, пошарил по карманам мертвого Пети");
.....
а уже весь рендер унас после результатов хода, разумеется. в приводимом выше псевдокоде, это в DrawScene, где мы - если не отображается окно лога, то рисум 3 последние записи из messages, или если окно с логом нужно отобразить, то рендерим окно. вот если у нас один ход занимает 100 милисекунд (не знаю чем можно так убить производительность), имеет смысл вызывать DrawScene в другом потоке. Ну и сеть, если у нас в игре, то тут тоже без отдельного потока не обойтись. а то видел я приложения, где при затыке в рендере - падает пинг.

правка: да. окно, разумеется - это не окно еще одного прриложения (или этого же)! это внутриигровое GUI. как, например, окно инвентаря, окно магазина, диалога с НПЦ и т.д.
Меня окружали милые, добрые люди... медленно сжимая кольцо

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Барионикс 0.5.3a

Сообщение kipar » 10 фев 2013, 17:02

Не совсем вкурил, в чем суть спора, но многопоточность в рогалике - по-моему оверкилл. Просто добавлять сообщения в специальный буфер, когда их больше чем надо - выводить <more> и блокировать обработку клавиш до нажатия Enter.

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Cfyz » 10 фев 2013, 17:14

kipar писал(а):Не совсем вкурил, в чем суть спора, но многопоточность в рогалике - по-моему оверкилл. Просто добавлять сообщения в специальный буфер, когда их больше чем надо - выводить <more> и блокировать обработку клавиш до нажатия Enter.
Это возможно, если у тебя во-первых, нет анимации и во-вторых, уже есть некоторый слой абстракции от системы ввода. Что характерно, этот самый слой абстракции все равно косвенно или явно заведет свой поток, будь это cmd.exe и системные потоки ввода вывода, будь то BearLibTerminal или движок общего назначения.

Если у тебя есть анимация, во время паузы нужно продолжать просчитывать всякие переменные и обновлять изображение. Если у тебя нет упомянутой абстракции от ввода, то придется ручками прокручивать всякие WM_KEYDOWN чтобы только получить искомое нажатие Enter. Прямо посередине процедуры обсчета мира, где может потребоваться поставить процесс на паузу, явно не место для подобных вещей. Поэтому или возвращаем управление туда, где этому место, или выполняем все параллельно.
Пытается раскуклиться

Аватара пользователя
Frolik
Сообщения: 624
Зарегистрирован: 08 мар 2011, 17:21

Re: Барионикс 0.5.3a

Сообщение Frolik » 10 фев 2013, 18:05

Ещё из нерешённых вопросов: как можно сделать замирание программы на <ещё>? Для меня это принципально, хочется такую фичу. Для тех, кто не помнит - если сообщений за раз слишком много, либо произошло что-то ключевое и требует внимания игрока, то он должен нажать пробел чтобы ход пошел дальше.
Вот именно такая реализация раздражает.

Аватара пользователя
Jolly Roger
Сообщения: 2973
Зарегистрирован: 27 ноя 2009, 09:10
Откуда: Minsk, Belarus

Re: Барионикс 0.5.3a

Сообщение Jolly Roger » 10 фев 2013, 18:20

Удесетеряю!
Если произошло, что-то очень интересное, я просто открываю большой лог и смотрю. А делать каждый ход 5869475897359073708973097 кликов по "ещё", раздражает нечеловечески.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Барионикс 0.5.3a

Сообщение kipar » 10 фев 2013, 19:36

Cfyz писал(а):Это возможно, если у тебя во-первых, нет анимации и во-вторых, уже есть некоторый слой абстракции от системы ввода. Что характерно, этот самый слой абстракции все равно косвенно или явно заведет свой поток, будь это cmd.exe и системные потоки ввода вывода, будь то BearLibTerminal или движок общего назначения.
Почему?
Условно говоря:
В основном цикле:

Код: Выделить всё

while true
  draw
  process_input
end
в draw - просчет анимации, вообще перерисовка
в process_input:

Код: Выделить всё

case game_state
  when waiting_for_enter
    #ждем нажатия на энтер, остальное пропускаем
  when playing_the_game
    #обрабатываем клавиши как обычно
end
в логе:

Код: Выделить всё

log_messages << "You killed #{enemy.name}"
if log_messages.length > 10
  state = waiting_for_enter
end

Аватара пользователя
Cfyz
Сообщения: 776
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Cfyz » 10 фев 2013, 20:45

kipar писал(а):Почему?
Условно говоря:
<...>
Потому что пауза, к примеру, нужна внутри пункта "#обрабатываем клавиши как обычно". Это же пошаговая игра, игрок нажал влево, атаковал тем самым одного противника, а монстров вокруг море и все они начинают ходить. И по одному нажатию клавиши, выходит, генерируется много текста. Поэтому не выйдет сменить флаг и начать по-другому обрабатывать ввод, пауза как бы глубоко внутри этой обработки ввода (или его последствий) как раз и находится.

Код: Выделить всё

int main()
{
    for(ever)
    {
        draw();
        process_input();
        
        // update world
        for(each something)
        {
            process(something());
        }
    }
}
И вот скажем на 5 итерации (из 50) цикла обновления мира, глубоко-глубоко в недрах process(something), переполняется лог. Нужно подождать. Как? Просто зависнуть нельзя, ввод проверяется не здесь. Просто перепрыгнуть к проверке ввода тоже, там же еще 45 необработанных итераций цикла. Ну а если ты предложишь выполнять не весь обсчет, а кусочками, по одному something за раз, то мы придем как раз к предложенной мною очереди микродействий.

Впрочем я присоединяюсь к мнению, что подобного рода надоедливый лог лишь раздражает. Отдельное, доступное в любое время внутриигровое окошко с логом — и хватит с него.
Пытается раскуклиться

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Барионикс 0.5.3a

Сообщение kipar » 10 фев 2013, 20:50

Я почему-то не подумал о том, что последствия действий тоже надо притормозить. Теперь и смысл предшествующей беседы до меня дошел :)

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Maelstrom » 11 фев 2013, 06:17

"Нравится/не нравится" отношения к делу вообще не имеет, т.к. эта проблема включает в себя ещё и внезапный ввод чего-нибудь дополнительного, будь то (Y/N) или выпадение целой менюшки с разными кнопочками.
Айв кнгенгах Йог-Сотот

Аватара пользователя
Uvadzucumi
Сообщения: 365
Зарегистрирован: 29 ноя 2011, 07:13
Откуда: Дубай, ОАЭ (Минск, Беларусь)
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Uvadzucumi » 11 фев 2013, 07:06

Maelstrom писал(а):"Нравится/не нравится" отношения к делу вообще не имеет, т.к. эта проблема включает в себя ещё и внезапный ввод чего-нибудь дополнительного, будь то (Y/N) или выпадение целой менюшки с разными кнопочками.
Y/N и менюшки с разными кнопочкоми в середине хода игрока вправо (во время "хода" мира)?, или в середине "действия" открытия двери (так как всякие настройки действия, y/n, подбор кода замка и т.д. задаются же ДО хода мира)? не могу представить себе такую ситуацию.
Меня окружали милые, добрые люди... медленно сжимая кольцо

Аватара пользователя
alexbard
Сообщения: 670
Зарегистрирован: 22 апр 2011, 17:15
Откуда: Украина
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение alexbard » 11 фев 2013, 07:22

Uvadzucumi писал(а): Y/N и менюшки с разными кнопочкоми в середине хода игрока вправо (во время "хода" мира)?, или в середине "действия" открытия двери? не могу представить себе такую ситуацию.
Просто это будет симулятор игры на фортепиано клавиатуре. 2013й год на дворе, а подход к реализации интерфейса, как в адоме(открыть дверь - у вас рядом есть одна дверь в какую сторону желаете открыть дверь?, а потом еще и проверку y/n )

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Барионикс 0.5.3a

Сообщение kipar » 11 фев 2013, 07:29

Нет, ну не только же дверь открыть.
Скажем, "колдун кастует по вам фаерболл, использовать контрзаклинание? Выберите уровень"
"Гоблин замахивается по вам мечом, использовать контратаку (осталось за ход: 2 из 3)?"

Вообще, если анимация не нужно, то по-моему можно обойтись костылем, встроив цикл обработки сообщений в эту паузу. Ну или делать два потока. Или даже разбивать ход на элементарные прерываемые действия, хотя это по-моему самый сложный путь.

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: Барионикс 0.5.3a

Сообщение Maelstrom » 11 фев 2013, 07:55

У кого в голове запертая дверь, мешаю добраться к мыслям о том, зачем это нужно - ваши проблемы :)

<ещё> в случае переполнения окна сообщений я уберу, можно и лог почитать, да и окно сообщений в одном из вариантов интерфейса будет больше. А вот паузы на ключевых событиях (осталось мало хп, удар снёс больше половины хп, получено мегамерзкое проклятие и т.д.) буду таким образом выделять. Ну и возможность отключить это в опциях для любителей сначала весело барабанить по кнопкам, а потом смотреть на мертвого персонажа с мыслью "ой, как это я не заметил!"
Вообще, если анимация не нужно, то по-моему можно обойтись костылем, встроив цикл обработки сообщений в эту паузу.
Это как? Бесконечный цикл, ждущий нажатия нужной кнопки и запускающий перерисовку экрана?
Айв кнгенгах Йог-Сотот

Аватара пользователя
kipar
Сообщения: 2120
Зарегистрирован: 10 мар 2010, 13:16
Откуда: Москва

Re: Барионикс 0.5.3a

Сообщение kipar » 11 фев 2013, 09:53

Maelstrom писал(а):А вот паузы на ключевых событиях (осталось мало хп, удар снёс больше половины хп, получено мегамерзкое проклятие и т.д.) буду таким образом выделять.
Это можно и после завершения хода делать, тогда вообще никаких проблем. Проблема именно с действиями происходящими на середине хода, типа всяких блоков.

Maelstrom писал(а):Это как? Бесконечный цикл, ждущий нажатия нужной кнопки и запускающий перерисовку экрана?
Да, как-то так. Наверное, можно поизящнее - рекурсивно вызвать основной цикл игры с параметром, но это надо продумать.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя