Моя попытка
Модератор: Jolly Roger
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Моя попытка
Я не хотел круто, хотел просто, но изящно!
А то, что ты описал, это круто, но АХТЫЖПИЗДЕЦНАХ!
А то, что ты описал, это круто, но АХТЫЖПИЗДЕЦНАХ!
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
- Maelstrom
- Мастер
- Сообщения: 2062
- Зарегистрирован: 26 ноя 2006, 14:19
- Откуда: г. Усть-Кирдык
- Контактная информация:
Re: Моя попытка
Ты только что простой и изящный способ назвал ущербным.Я не хотел круто, хотел просто, но изящно!
Рогалики основаны либо на авансе-кулдауне, либо вообще на фиксированной ходовой системе.
Например, как в Powder, там есть 5 фаз (вроде)
Slow
Fast
Normal
Slow
Very Fast
В каждую фазу может ходить тот, у кого скорость больше или равна значению этой фазы. Соостветсвенно, со скоростью Normal ходишь 3 фазы из 5, а Very Fast - все 5
Но, сам понимаешь, это ещё хуже
Айв кнгенгах Йог-Сотот
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Моя попытка
Он как демократия, не лучший, просто остальные хуже.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: Моя попытка
У меня аналогичная система. Если игрок нажимает какую-нибудь кнопку, совершается действие и у игрока переменная lastActionTime заполняется текущим временем, а переменная actionPeriod - кул-дауном данного действия. После этого запускается цикл по мобам, в котором крутится время до тех пор пока текущее время не станет больше либо равно игрокового lastActionTime+actionPeriod. Дальше все останавливается до следующего нажатия игроком кнопки. В этом цикле процессится логика мобов на аналогичных условиях: действие и дальше кулдаун.Jolly Roger писал(а): В настоящий момент сделал ущербную систему:
существо мгновенно, можно сказать авансом, выполняет действие, а потом сидит в кулдауне.
Еще есть отдельный хак - метод setDecision в классе мобов и игрока. Его можно дернуть, передав туда в качестве аргумента какое-то действие и это действие сразу будет выполнено. Это механизм заставить моба что-то сделать, поуправлять им (например оттолкнуть при выстреле в него - заставить переместиться на клетку назад). Вот в этом методе я пока не до конца продумал, как его тайминги совместить с основной ходовой системой, и там все тупо мгновенно делается и это не есть хорошо...
И да, суть вопроса: почему ты все-таки считаешь такую систему ущербной??
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Моя попытка
Например:
есть два существа, одно с быстрой атакой, другое с медленной.
Они бьют друг друга мгновенно, просто второе быстрее отойдёт.
есть два существа, одно с быстрой атакой, другое с медленной.
Они бьют друг друга мгновенно, просто второе быстрее отойдёт.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: Моя попытка
ну, и следующее действие того, кто с быстрой атакой пройдет быстрее же.
Почему плохо, что быстрый и медленный в какой-то момент совершили какое-то действие одновременно? Во втором варианте, когда сначала кул-даун, а потом действие, тайминги тоже могут так совпасть, что у обоих их разные кулдауны закончатся в одно и тоже время, и они совершат очередные действия одновременно
Почему плохо, что быстрый и медленный в какой-то момент совершили какое-то действие одновременно? Во втором варианте, когда сначала кул-даун, а потом действие, тайминги тоже могут так совпасть, что у обоих их разные кулдауны закончатся в одно и тоже время, и они совершат очередные действия одновременно
Re: Моя попытка
паузу перед действием делать можно, если готовы к куче дополнительных сложностей.
например, в WQ как я понял, полный обхват подсчета ссылок на объекты, т.е. гарантировано не будет "дохлых" указателей.
Нужно учитывать ВСЕ, что может произойти между моментом начала действия и моментом его окончания.
Если не уверены, то однозначно лучше как проще.
например, в WQ как я понял, полный обхват подсчета ссылок на объекты, т.е. гарантировано не будет "дохлых" указателей.
Нужно учитывать ВСЕ, что может произойти между моментом начала действия и моментом его окончания.
Если не уверены, то однозначно лучше как проще.
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Моя попытка
Выводы из обсуждения следующие:
1. В разумных и даже не очень разумных пределах, отдельно взятое подземелье (не один этаж, а весь комплекс) со всеми монстрами и преметами, современные компьютеры легко удержат в памяти и ещё мнооого останется. Глупо этим не воспользоваться.
2. Система времени с анвансом и кулдауном, является самой сбалансированной в вопросе: сложность реализации/ удовлетворительность результата.
1. В разумных и даже не очень разумных пределах, отдельно взятое подземелье (не один этаж, а весь комплекс) со всеми монстрами и преметами, современные компьютеры легко удержат в памяти и ещё мнооого останется. Глупо этим не воспользоваться.
2. Система времени с анвансом и кулдауном, является самой сбалансированной в вопросе: сложность реализации/ удовлетворительность результата.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: Моя попытка
Спасибо!
Забегая вперёд, хочу посоветоваться вот насчёт чего.
Хочется сделать систему опыта для каждого из основных навыков.
К примеру, ударяя кого-то мечом, увеличивается "опыт владения оружием", при достижении определённого количества опыта, увеличивается "уровень владения оружием", что влияет на повреждения, наносимые врагу.
Схема такова:
1. ГГ ударяет оружием по монстру.
2. Проверяется ловкость ГГ и монстра, рассчитывается вероятность, с какой ГГ вообще попадёт по монстру, проверяется генератор случайных чисел. Если ГГ промазал - дальнейшие пункты не учитываются.
3. Итак, попадание. Рассчитываем уровень повреждения: базовая сила повреждения оружия, уровень владения оружия ГГ (сила атаки), уровень защиты монстра (сила защиты), различные бонусы. Если damage = 0, то удар совсем слабый (не повезло, плохое оружие или слишком бронированный монстр).
4. HP монстра уменьшаем на damage (проверяем, погиб ли монстр), опыт владения оружием ГГ увеличиваем на 1, опыт защиты монстра тоже увеличиваем на 1. (или на damage?) Проверяем, увеличились ли уровни.
Как-то так.
На практике пока ломаю голову, как сделать обработку клавиатуры и мыши (пока различную скорость ГГ/монстров опускаю).
Нечто так?
Забегая вперёд, хочу посоветоваться вот насчёт чего.
Хочется сделать систему опыта для каждого из основных навыков.
К примеру, ударяя кого-то мечом, увеличивается "опыт владения оружием", при достижении определённого количества опыта, увеличивается "уровень владения оружием", что влияет на повреждения, наносимые врагу.
Схема такова:
1. ГГ ударяет оружием по монстру.
2. Проверяется ловкость ГГ и монстра, рассчитывается вероятность, с какой ГГ вообще попадёт по монстру, проверяется генератор случайных чисел. Если ГГ промазал - дальнейшие пункты не учитываются.
3. Итак, попадание. Рассчитываем уровень повреждения: базовая сила повреждения оружия, уровень владения оружия ГГ (сила атаки), уровень защиты монстра (сила защиты), различные бонусы. Если damage = 0, то удар совсем слабый (не повезло, плохое оружие или слишком бронированный монстр).
4. HP монстра уменьшаем на damage (проверяем, погиб ли монстр), опыт владения оружием ГГ увеличиваем на 1, опыт защиты монстра тоже увеличиваем на 1. (или на damage?) Проверяем, увеличились ли уровни.
Как-то так.
На практике пока ломаю голову, как сделать обработку клавиатуры и мыши (пока различную скорость ГГ/монстров опускаю).
Код: Выделить всё
class Main {
/** Массив всех монстров в игре. */
ArrayList<Creature> creatures;
/** Основной цикл игры. */
public void run() {
for (Creature creature : creatures) creature.move();
}
}
class Monster extends Creature {
/** Тут будет AI, передвижение монстра, атаки и т.п. */
void move() {
}
}
class Hero extends Creature {
/** А это ГГ. */
void move() {
while (true) {
GameEvent event = events.getEvent();
if (event instanceof KeyGameEvent) {
// обработка клавиатуры
} else if (event instanceof MouseGameEvent) {
// обработка мыши
}
}
}
}
Re: Моя попытка
Я бы разделил игровую логику и процесс взаимодействия с клавиатурой и мышкой. Чтобы герой не парился на тему, мышкой его пинают или клавиатурой, а вместо этого ему приходили осмысленные команды - идти, посидеть, пожрать, поспать.
Re: Моя попытка
твой вариант более подходит для риалтаймовой игры, а не для походового рогалика.Newman писал(а):Нечто так?
насколько я понял (поправьте, кто-нибудь, если не прав), специфика рогалика не позволяет сделать главгера технически совсем неотличимым от мобов и итерировать его в одном контейнере с ними. Коротко говоря - нужно обеспечивать, чтобы его логика вызывалась первой, раньше логики мобов. В конце концов, у тебя же нажатие клавиши вообще инициирует всю процедуру расчета следующего хода, этот цикл в методе run() должен запускаться, когда кнопку нажали, а не постоянно крутится.
И ArrayList по идее не стоит использовать, в операциях простого последовательного итерирования LinkedList быстрее (в несколько раз).
Re: Моя попытка
В случае "утром деньги, вечером стулья" есть еще один момент.
Все действия должны быть объектами и их надо сохранять в save.
Это всё несколько усложняет.
Когда сначала идёт действие, потом тратится время,
логику действия, особенно если оно простое, можно прям тут же нафигачить.
Про реализацию игрока и монстров - если сделать некий общий
базовый интерфейс для всего, что движется, и для монстров реализовывать
в виде AI а для игрока в виде UI, то вроде получается достаточно единообразно.
Единственно что, объект с параметрами монстра/игрока я бы агрегировал
в управляющую обёртку, а не реализовывал в наследнике.
В wq из-за того, что всё сделано через наследование,
а не через агрегацию невозможен морфинг.
Все действия должны быть объектами и их надо сохранять в save.
Это всё несколько усложняет.
Когда сначала идёт действие, потом тратится время,
логику действия, особенно если оно простое, можно прям тут же нафигачить.
Про реализацию игрока и монстров - если сделать некий общий
базовый интерфейс для всего, что движется, и для монстров реализовывать
в виде AI а для игрока в виде UI, то вроде получается достаточно единообразно.
Единственно что, объект с параметрами монстра/игрока я бы агрегировал
в управляющую обёртку, а не реализовывал в наследнике.
В wq из-за того, что всё сделано через наследование,
а не через агрегацию невозможен морфинг.
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Моя попытка
Почему герой не может быть полностью идентичен мобам?
Такой подход значительно облегчит дальнейшее усовершенствование игры.
Сделать же игрока первым парнем на деревне не так уж сложно, от банального резервирования игроку первой позиции в массиве (отстойный вариант), принудительная обработка монстра-игрока первым, или вообще не заморачиваться с этим и делать как обычно, но при этом не трогать монстра-игрока при обработке монстров.
Такой подход значительно облегчит дальнейшее усовершенствование игры.
Сделать же игрока первым парнем на деревне не так уж сложно, от банального резервирования игроку первой позиции в массиве (отстойный вариант), принудительная обработка монстра-игрока первым, или вообще не заморачиваться с этим и делать как обычно, но при этом не трогать монстра-игрока при обработке монстров.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: Моя попытка
Агрегация - это значит добавить в класс Creature поле type, к примеру, определяющее, ГГ это или монстр?
И, казалось, как раз принципиально нужно не особенно отличать ГГ от всех остальных.
Что-то я теряюсь... Если попытаться охватить сразу всё задуманное (управление мышью, разные скорости существ и т.п.), то порог получается слишком большой. Если же начать с примитивного - боюсь, потом элегантно расширять возможности не получится.
Может, зря задумал такой серьёзный проект? За плечами (из законченного) только "змейка"...
В любом случае, пока не перемещайте тему в свалку, пожалуйста.
Буду думать.
И, казалось, как раз принципиально нужно не особенно отличать ГГ от всех остальных.
Что-то я теряюсь... Если попытаться охватить сразу всё задуманное (управление мышью, разные скорости существ и т.п.), то порог получается слишком большой. Если же начать с примитивного - боюсь, потом элегантно расширять возможности не получится.
Может, зря задумал такой серьёзный проект? За плечами (из законченного) только "змейка"...
В любом случае, пока не перемещайте тему в свалку, пожалуйста.
Буду думать.
- Maelstrom
- Мастер
- Сообщения: 2062
- Зарегистрирован: 26 ноя 2006, 14:19
- Откуда: г. Усть-Кирдык
- Контактная информация:
Re: Моя попытка
Ну, начнёшь потому с нуля на основе приобретённого опыта, ничего страшногоЕсли же начать с примитивного - боюсь, потом элегантно расширять возможности не получится.
Айв кнгенгах Йог-Сотот
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 51 гость