Моя попытка

Закрытые или заброшенные проекты, не состоявшие в Клубе, но имевшие ветку на форуме.

Модератор: Jolly Roger

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

Re: Моя попытка

Сообщение Jolly Roger » 02 мар 2010, 10:32

Я не хотел круто, хотел просто, но изящно!
А то, что ты описал, это круто, но АХТЫЖПИЗДЕЦНАХ!
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

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

Re: Моя попытка

Сообщение Maelstrom » 02 мар 2010, 10:39

Я не хотел круто, хотел просто, но изящно!
Ты только что простой и изящный способ назвал ущербным.
Рогалики основаны либо на авансе-кулдауне, либо вообще на фиксированной ходовой системе.
Например, как в Powder, там есть 5 фаз (вроде)
Slow
Fast
Normal
Slow
Very Fast

В каждую фазу может ходить тот, у кого скорость больше или равна значению этой фазы. Соостветсвенно, со скоростью Normal ходишь 3 фазы из 5, а Very Fast - все 5

Но, сам понимаешь, это ещё хуже :)
Айв кнгенгах Йог-Сотот

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

Re: Моя попытка

Сообщение Jolly Roger » 02 мар 2010, 10:48

Он как демократия, не лучший, просто остальные хуже. :lol:
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

dunno
Сообщения: 26
Зарегистрирован: 29 дек 2009, 20:57

Re: Моя попытка

Сообщение dunno » 02 мар 2010, 11:53

Jolly Roger писал(а): В настоящий момент сделал ущербную систему:
существо мгновенно, можно сказать авансом, выполняет действие, а потом сидит в кулдауне.
У меня аналогичная система. Если игрок нажимает какую-нибудь кнопку, совершается действие и у игрока переменная lastActionTime заполняется текущим временем, а переменная actionPeriod - кул-дауном данного действия. После этого запускается цикл по мобам, в котором крутится время до тех пор пока текущее время не станет больше либо равно игрокового lastActionTime+actionPeriod. Дальше все останавливается до следующего нажатия игроком кнопки. В этом цикле процессится логика мобов на аналогичных условиях: действие и дальше кулдаун.

Еще есть отдельный хак - метод setDecision в классе мобов и игрока. Его можно дернуть, передав туда в качестве аргумента какое-то действие и это действие сразу будет выполнено. Это механизм заставить моба что-то сделать, поуправлять им (например оттолкнуть при выстреле в него - заставить переместиться на клетку назад). Вот в этом методе я пока не до конца продумал, как его тайминги совместить с основной ходовой системой, и там все тупо мгновенно делается и это не есть хорошо...

И да, суть вопроса: почему ты все-таки считаешь такую систему ущербной??

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

Re: Моя попытка

Сообщение Jolly Roger » 02 мар 2010, 12:42

Например:
есть два существа, одно с быстрой атакой, другое с медленной.
Они бьют друг друга мгновенно, просто второе быстрее отойдёт.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

dunno
Сообщения: 26
Зарегистрирован: 29 дек 2009, 20:57

Re: Моя попытка

Сообщение dunno » 02 мар 2010, 13:08

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

Аватара пользователя
Anfeir
Сообщения: 876
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: Моя попытка

Сообщение Anfeir » 02 мар 2010, 14:39

паузу перед действием делать можно, если готовы к куче дополнительных сложностей.
например, в WQ как я понял, полный обхват подсчета ссылок на объекты, т.е. гарантировано не будет "дохлых" указателей.
Нужно учитывать ВСЕ, что может произойти между моментом начала действия и моментом его окончания.
Если не уверены, то однозначно лучше как проще.

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

Re: Моя попытка

Сообщение Jolly Roger » 03 мар 2010, 07:04

Выводы из обсуждения следующие:
1. В разумных и даже не очень разумных пределах, отдельно взятое подземелье (не один этаж, а весь комплекс) со всеми монстрами и преметами, современные компьютеры легко удержат в памяти и ещё мнооого останется. Глупо этим не воспользоваться.
2. Система времени с анвансом и кулдауном, является самой сбалансированной в вопросе: сложность реализации/ удовлетворительность результата.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
Newman
Сообщения: 144
Зарегистрирован: 23 фев 2010, 15:30

Re: Моя попытка

Сообщение Newman » 03 мар 2010, 07:57

Спасибо! :)
Забегая вперёд, хочу посоветоваться вот насчёт чего.
Хочется сделать систему опыта для каждого из основных навыков.
К примеру, ударяя кого-то мечом, увеличивается "опыт владения оружием", при достижении определённого количества опыта, увеличивается "уровень владения оружием", что влияет на повреждения, наносимые врагу.

Схема такова:
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) {
    // обработка мыши
   }
  }
 }
}
Нечто так?

Аватара пользователя
Anfeir
Сообщения: 876
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: Моя попытка

Сообщение Anfeir » 03 мар 2010, 10:07

Я бы разделил игровую логику и процесс взаимодействия с клавиатурой и мышкой. Чтобы герой не парился на тему, мышкой его пинают или клавиатурой, а вместо этого ему приходили осмысленные команды - идти, посидеть, пожрать, поспать.

dunno
Сообщения: 26
Зарегистрирован: 29 дек 2009, 20:57

Re: Моя попытка

Сообщение dunno » 03 мар 2010, 10:07

Newman писал(а):Нечто так?
твой вариант более подходит для риалтаймовой игры, а не для походового рогалика.
насколько я понял (поправьте, кто-нибудь, если не прав), специфика рогалика не позволяет сделать главгера технически совсем неотличимым от мобов и итерировать его в одном контейнере с ними. Коротко говоря - нужно обеспечивать, чтобы его логика вызывалась первой, раньше логики мобов. В конце концов, у тебя же нажатие клавиши вообще инициирует всю процедуру расчета следующего хода, этот цикл в методе run() должен запускаться, когда кнопку нажали, а не постоянно крутится.

И ArrayList по идее не стоит использовать, в операциях простого последовательного итерирования LinkedList быстрее (в несколько раз).

Аватара пользователя
Xecutor
Мастер
Сообщения: 758
Зарегистрирован: 25 мар 2008, 08:32

Re: Моя попытка

Сообщение Xecutor » 03 мар 2010, 10:42

В случае "утром деньги, вечером стулья" есть еще один момент.
Все действия должны быть объектами и их надо сохранять в save.
Это всё несколько усложняет.
Когда сначала идёт действие, потом тратится время,
логику действия, особенно если оно простое, можно прям тут же нафигачить.

Про реализацию игрока и монстров - если сделать некий общий
базовый интерфейс для всего, что движется, и для монстров реализовывать
в виде AI а для игрока в виде UI, то вроде получается достаточно единообразно.

Единственно что, объект с параметрами монстра/игрока я бы агрегировал
в управляющую обёртку, а не реализовывал в наследнике.
В wq из-за того, что всё сделано через наследование,
а не через агрегацию невозможен морфинг.

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

Re: Моя попытка

Сообщение Jolly Roger » 03 мар 2010, 10:46

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

Сделать же игрока первым парнем на деревне не так уж сложно, от банального резервирования игроку первой позиции в массиве (отстойный вариант), принудительная обработка монстра-игрока первым, или вообще не заморачиваться с этим и делать как обычно, но при этом не трогать монстра-игрока при обработке монстров.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
Newman
Сообщения: 144
Зарегистрирован: 23 фев 2010, 15:30

Re: Моя попытка

Сообщение Newman » 03 мар 2010, 10:53

Агрегация - это значит добавить в класс Creature поле type, к примеру, определяющее, ГГ это или монстр?
И, казалось, как раз принципиально нужно не особенно отличать ГГ от всех остальных.
Что-то я теряюсь... Если попытаться охватить сразу всё задуманное (управление мышью, разные скорости существ и т.п.), то порог получается слишком большой. Если же начать с примитивного - боюсь, потом элегантно расширять возможности не получится.
Может, зря задумал такой серьёзный проект? :) За плечами (из законченного) только "змейка"... :(
В любом случае, пока не перемещайте тему в свалку, пожалуйста.
Буду думать.

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

Re: Моя попытка

Сообщение Maelstrom » 03 мар 2010, 11:02

Если же начать с примитивного - боюсь, потом элегантно расширять возможности не получится.
Ну, начнёшь потому с нуля на основе приобретённого опыта, ничего страшного
Айв кнгенгах Йог-Сотот

Ответить

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

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