Даже оставив в стороне чудовищность идеи отдельного окна на внутриигровой лог, все равно на это окно потребуется поток. Нельзя в одном потоке и висеть, и рисовать одновременно. Вообще ничего в одном потоке нельзя одновременно. Можно, конечно, придумать хак с обработкой очереди сообщений ОС и отрисовкой в том самом месте, где мы застопорились внутри некоторой функции, но это просто жуткий костыль какой-то.Uvadzucumi писал(а):да. но есть 3-й вариант (если предполагается что одно действие может дикую портянку текста нагенерировать, а такое в принципе возможно, если там 500х500 заруб в экране, и в интерфейсе игры для него всего 2 строчки). можно малой кровью сделать окно лога, отдельным экраном и с прокруткой. несколько хуже будет этот вариант - если строчек всего 1-3 видно на основном экране, а действие 10 нагенерировало, но зато, не нужно 250 раз жать на пробел при одном ходе, если строчек 500 нагенерировало. если нужно - окрыли лог и посмотрели. не нужно - сразу другой ход делаем - а не давим все время далее, пока "неожиданно", нажали вместо "далее", "пропустить следующий ход".
Барионикс 0.5.3a
Модератор: Maelstrom
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Барионикс 0.5.3a
Пытается раскуклиться
- Uvadzucumi
- Сообщения: 365
- Зарегистрирован: 29 ноя 2011, 07:13
- Откуда: Дубай, ОАЭ (Минск, Беларусь)
- Контактная информация:
Re: Барионикс 0.5.3a
так разумеется делать НЕЛЬЗЯ! мы в обработке делаем только например:Cfyz писал(а):Можно, конечно, придумать хак с обработкой очереди сообщений ОС и отрисовкой в том самом месте, где мы застопорились внутри некоторой функции, но это просто жуткий костыль какой-то.
Код: Выделить всё
messages->puts("дварф Петя дал подзатыльник хоббиту Васе");
....
messages->puts("Петя скончался...");
messages->puts("Довольный хоббит, деловито, пошарил по карманам мертвого Пети");
.....
правка: да. окно, разумеется - это не окно еще одного прриложения (или этого же)! это внутриигровое GUI. как, например, окно инвентаря, окно магазина, диалога с НПЦ и т.д.
Меня окружали милые, добрые люди... медленно сжимая кольцо
Re: Барионикс 0.5.3a
Не совсем вкурил, в чем суть спора, но многопоточность в рогалике - по-моему оверкилл. Просто добавлять сообщения в специальный буфер, когда их больше чем надо - выводить <more> и блокировать обработку клавиш до нажатия Enter.
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Барионикс 0.5.3a
Это возможно, если у тебя во-первых, нет анимации и во-вторых, уже есть некоторый слой абстракции от системы ввода. Что характерно, этот самый слой абстракции все равно косвенно или явно заведет свой поток, будь это cmd.exe и системные потоки ввода вывода, будь то BearLibTerminal или движок общего назначения.kipar писал(а):Не совсем вкурил, в чем суть спора, но многопоточность в рогалике - по-моему оверкилл. Просто добавлять сообщения в специальный буфер, когда их больше чем надо - выводить <more> и блокировать обработку клавиш до нажатия Enter.
Если у тебя есть анимация, во время паузы нужно продолжать просчитывать всякие переменные и обновлять изображение. Если у тебя нет упомянутой абстракции от ввода, то придется ручками прокручивать всякие WM_KEYDOWN чтобы только получить искомое нажатие Enter. Прямо посередине процедуры обсчета мира, где может потребоваться поставить процесс на паузу, явно не место для подобных вещей. Поэтому или возвращаем управление туда, где этому место, или выполняем все параллельно.
Пытается раскуклиться
Re: Барионикс 0.5.3a
Вот именно такая реализация раздражает.Ещё из нерешённых вопросов: как можно сделать замирание программы на <ещё>? Для меня это принципально, хочется такую фичу. Для тех, кто не помнит - если сообщений за раз слишком много, либо произошло что-то ключевое и требует внимания игрока, то он должен нажать пробел чтобы ход пошел дальше.
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Барионикс 0.5.3a
Удесетеряю!
Если произошло, что-то очень интересное, я просто открываю большой лог и смотрю. А делать каждый ход 5869475897359073708973097 кликов по "ещё", раздражает нечеловечески.
Если произошло, что-то очень интересное, я просто открываю большой лог и смотрю. А делать каждый ход 5869475897359073708973097 кликов по "ещё", раздражает нечеловечески.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: Барионикс 0.5.3a
Почему?Cfyz писал(а):Это возможно, если у тебя во-первых, нет анимации и во-вторых, уже есть некоторый слой абстракции от системы ввода. Что характерно, этот самый слой абстракции все равно косвенно или явно заведет свой поток, будь это cmd.exe и системные потоки ввода вывода, будь то BearLibTerminal или движок общего назначения.
Условно говоря:
В основном цикле:
Код: Выделить всё
while true
draw
process_input
end
в 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
Потому что пауза, к примеру, нужна внутри пункта "#обрабатываем клавиши как обычно". Это же пошаговая игра, игрок нажал влево, атаковал тем самым одного противника, а монстров вокруг море и все они начинают ходить. И по одному нажатию клавиши, выходит, генерируется много текста. Поэтому не выйдет сменить флаг и начать по-другому обрабатывать ввод, пауза как бы глубоко внутри этой обработки ввода (или его последствий) как раз и находится.kipar писал(а):Почему?
Условно говоря:
<...>
Код: Выделить всё
int main()
{
for(ever)
{
draw();
process_input();
// update world
for(each something)
{
process(something());
}
}
}
Впрочем я присоединяюсь к мнению, что подобного рода надоедливый лог лишь раздражает. Отдельное, доступное в любое время внутриигровое окошко с логом — и хватит с него.
Пытается раскуклиться
Re: Барионикс 0.5.3a
Я почему-то не подумал о том, что последствия действий тоже надо притормозить. Теперь и смысл предшествующей беседы до меня дошел
- Maelstrom
- Мастер
- Сообщения: 2062
- Зарегистрирован: 26 ноя 2006, 14:19
- Откуда: г. Усть-Кирдык
- Контактная информация:
Re: Барионикс 0.5.3a
"Нравится/не нравится" отношения к делу вообще не имеет, т.к. эта проблема включает в себя ещё и внезапный ввод чего-нибудь дополнительного, будь то (Y/N) или выпадение целой менюшки с разными кнопочками.
Айв кнгенгах Йог-Сотот
- Uvadzucumi
- Сообщения: 365
- Зарегистрирован: 29 ноя 2011, 07:13
- Откуда: Дубай, ОАЭ (Минск, Беларусь)
- Контактная информация:
Re: Барионикс 0.5.3a
Y/N и менюшки с разными кнопочкоми в середине хода игрока вправо (во время "хода" мира)?, или в середине "действия" открытия двери (так как всякие настройки действия, y/n, подбор кода замка и т.д. задаются же ДО хода мира)? не могу представить себе такую ситуацию.Maelstrom писал(а):"Нравится/не нравится" отношения к делу вообще не имеет, т.к. эта проблема включает в себя ещё и внезапный ввод чего-нибудь дополнительного, будь то (Y/N) или выпадение целой менюшки с разными кнопочками.
Меня окружали милые, добрые люди... медленно сжимая кольцо
Re: Барионикс 0.5.3a
Просто это будет симулятор игры на фортепиано клавиатуре. 2013й год на дворе, а подход к реализации интерфейса, как в адоме(открыть дверь - у вас рядом есть одна дверь в какую сторону желаете открыть дверь?, а потом еще и проверку y/n )Uvadzucumi писал(а): Y/N и менюшки с разными кнопочкоми в середине хода игрока вправо (во время "хода" мира)?, или в середине "действия" открытия двери? не могу представить себе такую ситуацию.
Re: Барионикс 0.5.3a
Нет, ну не только же дверь открыть.
Скажем, "колдун кастует по вам фаерболл, использовать контрзаклинание? Выберите уровень"
"Гоблин замахивается по вам мечом, использовать контратаку (осталось за ход: 2 из 3)?"
Вообще, если анимация не нужно, то по-моему можно обойтись костылем, встроив цикл обработки сообщений в эту паузу. Ну или делать два потока. Или даже разбивать ход на элементарные прерываемые действия, хотя это по-моему самый сложный путь.
Скажем, "колдун кастует по вам фаерболл, использовать контрзаклинание? Выберите уровень"
"Гоблин замахивается по вам мечом, использовать контратаку (осталось за ход: 2 из 3)?"
Вообще, если анимация не нужно, то по-моему можно обойтись костылем, встроив цикл обработки сообщений в эту паузу. Ну или делать два потока. Или даже разбивать ход на элементарные прерываемые действия, хотя это по-моему самый сложный путь.
- Maelstrom
- Мастер
- Сообщения: 2062
- Зарегистрирован: 26 ноя 2006, 14:19
- Откуда: г. Усть-Кирдык
- Контактная информация:
Re: Барионикс 0.5.3a
У кого в голове запертая дверь, мешаю добраться к мыслям о том, зачем это нужно - ваши проблемы
<ещё> в случае переполнения окна сообщений я уберу, можно и лог почитать, да и окно сообщений в одном из вариантов интерфейса будет больше. А вот паузы на ключевых событиях (осталось мало хп, удар снёс больше половины хп, получено мегамерзкое проклятие и т.д.) буду таким образом выделять. Ну и возможность отключить это в опциях для любителей сначала весело барабанить по кнопкам, а потом смотреть на мертвого персонажа с мыслью "ой, как это я не заметил!"
<ещё> в случае переполнения окна сообщений я уберу, можно и лог почитать, да и окно сообщений в одном из вариантов интерфейса будет больше. А вот паузы на ключевых событиях (осталось мало хп, удар снёс больше половины хп, получено мегамерзкое проклятие и т.д.) буду таким образом выделять. Ну и возможность отключить это в опциях для любителей сначала весело барабанить по кнопкам, а потом смотреть на мертвого персонажа с мыслью "ой, как это я не заметил!"
Это как? Бесконечный цикл, ждущий нажатия нужной кнопки и запускающий перерисовку экрана?Вообще, если анимация не нужно, то по-моему можно обойтись костылем, встроив цикл обработки сообщений в эту паузу.
Айв кнгенгах Йог-Сотот
Re: Барионикс 0.5.3a
Это можно и после завершения хода делать, тогда вообще никаких проблем. Проблема именно с действиями происходящими на середине хода, типа всяких блоков.Maelstrom писал(а):А вот паузы на ключевых событиях (осталось мало хп, удар снёс больше половины хп, получено мегамерзкое проклятие и т.д.) буду таким образом выделять.
Да, как-то так. Наверное, можно поизящнее - рекурсивно вызвать основной цикл игры с параметром, но это надо продумать.Maelstrom писал(а):Это как? Бесконечный цикл, ждущий нажатия нужной кнопки и запускающий перерисовку экрана?
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 22 гостя