|
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
|
|
Смерть персонажей в консольной игре26.04.2018, 15:03. Показов 4380. Ответов 21
Метки нет (Все метки)
Добрый день. Для тренировки пишу консольную action rpg. Встал вопрос, как организовать корректно смерть главного персонажа и врагов что бы потом можно было с них собрать предметы. Нужно подсказать с логикой алгорима.
С со смертью главного персонажа вроде как придумал создать отдельный класс для старта игры и отдельный класс для проверки состояния главного персонажа с методом в потоке, который проверяет жив ли персонаж, если он умер, то метод возвращает занчение false, и метод StratGame()перестает выполняться и игра игра заканчивается. С врагами сложнее, не могу сообразить как заставить мертвых врагов удалиться после смерти, тоесть по тоей же логике создаю отдельный класс с проверкой на состояние жив ли враг, и при появлении врага запускается поток с проверкой жив/мертв, после чего если он мертв, метод Fight(), перестает работать и запускается екземплярный метод Die(){Console.WriteLine($"{EnemyName} побежден")}; . Но как мне потом убрать персонажа из памяти, а враг в состоянии смерти находиться, и получается чем дольше я играю тем больше плодиться врагов. Может как то с помощью событий это реализуется, но я не могу никак понять нужный алгоритм. Прошу помочь.
0
|
|
| 26.04.2018, 15:03 | |
|
Ответы с готовыми решениями:
21
Обработка столкновений в консольной игре Как добавить звук для персонажей в 2d игре?
|
|
645 / 529 / 324
Регистрация: 20.05.2015
Сообщений: 1,471
|
|
| 27.04.2018, 02:45 | |
Сообщение было отмечено Alone11 как решение
Решение
Подбираете лут с противника и вызываете для класса Dispose.
1
|
|
|
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
|
||
| 27.04.2018, 02:54 | ||
|
Aferuga, идеальное решение))
Добавлено через 1 минуту Aferuga,
0
|
||
|
645 / 529 / 324
Регистрация: 20.05.2015
Сообщений: 1,471
|
||||||||
| 27.04.2018, 07:13 | ||||||||
|
Тут все зависит от вашей реализации, если у вас есть список противников вроде List<Enemy> то для элемента можно вызвать Remove или RemoveAt. Кликните здесь для просмотра всего текста
1
|
||||||||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 27.04.2018, 08:35 | ||
Сообщение было отмечено Alone11 как решение
РешениеИ если что то вообще и параллелить - то только этот цикл. Вплоть до отдельного потока на каждый элемент сцены. И ждать когда все доработают. После этого перерисовка. т.е. главный цикл игры Update - Draw. Между Update и Draw проверять жив ли перс и если совсем не жив выходить из цикла. Еще вариант - завести таймер -очередь приоритетов и список кого апдейтить. Тогда меньше мертвые тела ждущие выноса дергать надо. Т.е. мертвое тело при умирании убирает себя из списка апдейтов и заносит в очередь таймера. Очередь сортирована по номеру таймфрейма в котором наступает событие. На каждом своем апдейте таймер отправляет со сцены в очередь на спавн всех у кого номер заданного таймфрейма совпал с текущим. Это чисто технические варианты решения. А можно сделать эстетические аки в Сталкере. Т.е. завести милых песиков которые кроме главных героев питаются невинно убиенными монстрами (в сталкере реально собаки могут мертвые тела прямо с поля боя утаскивать).
3
|
||
|
645 / 529 / 324
Регистрация: 20.05.2015
Сообщений: 1,471
|
|
| 27.04.2018, 09:14 | |
|
Fulcrum_013,
Кхм... так-то речь идет о консольной action rpg(см топик), поэтому тут врядли будет какая-то отрисовка. Не по теме: З. Ы. Хотя у самого руки чесались написать нечто подобное.
1
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 27.04.2018, 09:23 | |
|
Aferuga, Ну как бы вывод текста это тоже отрисовка. DirectX это просто такая реализация класса Console в графических играх. Ну а пошаговая она или реалтаймовая - разница только в том что пошаговая ждет ввода пользователя перед каждым проходом главного цикла, реалтаймовая не ждет.
0
|
|
|
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
|
|
| 27.04.2018, 13:22 | |
|
Fulcrum_013, чувак, кто ты?))) откуда столько знаешь про потоки ?!))) поделись какой то литературой
Добавлено через 34 секунды Aferuga, Ваш вариант мне более симпатичен
0
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 27.04.2018, 14:11 | |
|
Esso11, Да как бы из логики вещей знаю. Параллелить нужно там где не нужно потом плясать с бубном вокруг синхронизации. А там где можно событийным управлением заменить лучшее вообще не параллелить. Когда активных процессов больше чем вычислителей то от параллеленья только лосы на тасксвитчинг вместо профита. А поскольку ядер ну никак не более 12 то их найдется чем загрузить в таких задачах чтобы они без тасксвитчинга молотили. Имеется в виду класс подобных AAA задач - игровая имитация мира со всей его физикой и т.д. Потому что конкретно в этой задачке древнего 8086 чересчур много без всякого параллеленья.
1
|
|
|
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
|
||
| 27.04.2018, 16:04 [ТС] | ||
|
лут в List<Item> персонажа (Это рюкзак его), а потом вызываю Dispose в екземляре битва.Экземпляр битва со всеми врагами удаляется, как я надеюсь. Персонаж двиаегтся к следующей клетке. Как то так. С корректируйте если чего не так. ps/ Ощущения пока как в том анекдоте про советского разведчика "- Говорили мне в штабе - учи! Учи!"
0
|
||
|
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
|
|
| 27.04.2018, 16:23 | |
|
Alone11, не мое конечно дело, но может стоит сделать вначале на том уровне на котором понять легче самому ... и позже модернизировать восполняя знания все новой и новой инфой.
как говорили в одном х/ф ("Бери ношу по себе что бы не падать при ходьбе")
0
|
|
|
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
|
|
| 27.04.2018, 16:28 [ТС] | |
|
Так и делаю, но нужно видеть как делать правильно или придеться топтаться на месте.
0
|
|
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 28.04.2018, 05:50 | |
|
Alone11, Ну не знаю какие у вас там правила игры. Но не совсем понятно зачем там вообще класс битвы. Насколько понимаю такая штука в архитектуре появилась в результате прикручивания движка "комнатных" битв а-ля БК к какой то из ранних браузерных mmorg ну а дальше копипастится везде.
Вообще лут который в ней лежит должна хранить клетка. Вообще суть разбиения поля на клетки - это двумерный индекс ускоряющий поиск сущностей находящихся вблизи заданной координаты.
0
|
|
|
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
|
|
| 28.04.2018, 06:09 | |
|
Fulcrum_013, ох великий бк))) скучаю по нему)
0
|
|
|
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
|
||
| 28.04.2018, 10:51 [ТС] | ||
|
Класс для битв создавался мною потому, что, как я понимаю, так должно быть по SOLID (S - принцип единоответственности в часности), отсюда старался разбить каждую сущность или поведение в отдельный класс. Вы, как я понимаю, исходите больше из практического опыта, связанного с реальным опытом разработки на движках, мой скромный опыт использования Unity3D показывает, что там есть свои нюансы, отсюда, пока, у меня нет вообще координат и прочего, Есть только массив Биом, по которым перебором перемещается персонаж, встречает в ней битву или нет, и переходит к следующей. Скажите, почему для поведения битвы не стоит отводить отдельный класс? У меня лут находитсья внутри екземпляров врага, которые могут быть в биоме, а могут и не быть.Как я понимаю, если бы у меня было поле по которому игрок перемещался то правильнее класть лут в ячеку поля? Так? Почему?
0
|
||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 28.04.2018, 11:07 | ||
|
Alone11, Лут должен однообразно хранится и подбираться вне зависимости от его происхождения. А происхождения кроме выпал со врага может быть еще и выброшен игроком и вырос/проспавнился и т.д.
Добавлено через 4 минуты
0
|
||
|
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
|
||
| 28.04.2018, 11:14 [ТС] | ||
|
А если все же добавлю сетевую возможность, как тогда? В чем то логику нужно же описывать битвы? Я кроме как создаение экземаляра битвы в которую будут передаваться персонажи ничего не придумал, на этот счет. Ну тоесть это как если в старых Final Fantasy/Heroes of Might and Magic нарвался на моба - попадаешь на поле битвы, в ней враг либо бот, либо игрок.
0
|
||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 28.04.2018, 11:20 | |
|
Alone11, Ну разве что по принципу как в БК. Т.е. когда те кто в битве до конца битвы друг от остальных изолированы. И лут не может просто лежать. Тогда в принципе смысл есть. Опять же если мултиплеер то возникает вопрос - а что делать если кто то еще зашел в туже комнату тогда когда битва уже идет?
0
|
|
|
4 / 4 / 0
Регистрация: 14.10.2017
Сообщений: 85
|
||
| 28.04.2018, 11:47 [ТС] | ||
|
Вы же говорите про открытые, в основном, игры, где бои происходят в любой момент и урон идет уже от просчета попаданий (те же Танчики на nes, ну или WOT/BF/CS/DOTA2 ...), то там создавать класс битвы не нужно. Я согласен. По существу, исходя из вышеописанной концепции, Комната - инстанс, битва- инстанс, есть ли какие либо рекомендации, так как в проектировании я опыта не набил, то пока из ваших рекомендаций принял что потоки там нафиг не нужны, по сути, асинхронность нужна только если выводить какой либо таймер на продолжительность хода, да и в общем то все.
0
|
||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 28.04.2018, 12:05 | ||
Сообщение было отмечено Alone11 как решение
Решение
Alone11, ну в принципе да. никакого мультипотока там не нужно. Мало того его вообще обычно практически не нужно. Потому что даже в реалтайм играх действие обычно идет по таймфрейам. т.е. к примеру таймфрейм 1/64 секунды. Сначала каждый объект должен просчитать что с ним за эти 1/64 секунды произошло, а только потом переходить к счету следующего кадра опять же для каждого. Так получается потому что объекты могут взаимодействовать, а соответсвенно все должны находится в одном и том же моменте времени. Создание по потоку на каждый объект именно эту синхронизацию и затрудняет. Более логичный подход когда каждый поток обрабатывает все объекты модели но разные части их действий. К примеру один поток считает физику/анимацию для следующего кадра, другой отрисовывает то что первый поток насчитал для этого кадра пока он рисовал прошлый. Пошаговые же игры отличаются от реалтаймовых только тем что ждут ввода пользователя перед каждым шагом. т.е. время считается не в реальном масштабе, а в ходах. т.е. тут даже такое разделение между потоками не нужно. 99,9% времени она будет заниматься ожиданием ввода.
Добавлено через 5 минут
0
|
||
| 28.04.2018, 12:05 | |
|
Помогаю со студенческими работами здесь
20
Метеориты в консольной игре Недопрорисовка персонажей Параметры персонажей Анимации 3d персонажей Создать БД сказочных персонажей Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|