Моя попытка

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

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

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

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

Сообщение Xecutor » 04 мар 2010, 06:21

Newman писал(а):Агрегация - это значит добавить в класс Creature поле type, к примеру, определяющее, ГГ это или монстр?
Нет. Агрегация это когда один объект является мембером другого.

Сейчас в wq цепочка наследования выглядит так:
GameObject->Unit->Monster->NeutralAI->GiantRat
А для игрока:
GameObject->Unit->Player
Что бы мутировать крысу во что-то другое, мне нужно создать
новый объект. И как-то переносить парамерты и возможно инвентарь.
Если было так:
GameObject->Unit(Creature)->Monster->NeutralAI
Creature->GiantRat
то бишь внутри unit было бы поле Creature*
которое полностью заведовало бы параметрами,
и методы по работе с параметрами делегировались из unit в creature.
Тогда какой-нить ray of mutation мог бы спокойно замнеить
creature в unit монстра на другой, запомнив старый, и монстр бы изменился.

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

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

Сообщение Newman » 04 мар 2010, 08:44

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

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

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

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

Newman писал(а):Понятно, спасибо за разъяснения. :)
Сейчас ломаю голову, как сделать обработку мыши параллельно с клавиатурой, чтобы генерировались одинаковые игровые события...
Хм. Что ты сейчас делаешь когда игрок жмёшь стрелку?
По идее должно быть что-то типа:
player.Move(direction);
И тогда для нажатия мышой куда-то, берёшь направление от игрока
в эту точку, нормируешь и вызываешь тот же метод.
ну или как-то так:
if(map[player.getPosition().Add(direction)].isOccupiedByMonster())
{
player.Attack(direction);
}else
{
player.Move(direction);
}
Newman писал(а): А магию хотелось бы свести к минимуму. Как мне кажется, почти во всех играх больше внимания уделяется волшебникам, и маг 40 уровня к примеру играючи умерщвляет воина 40 уровня. :(
Таки да, баланс милишников и кастеров очень тяжкая штука.
Но насчёт "больше внимания уделяется" я не согласен :)
ИХМО как раз в рогаликов больше милишников.
Ибо проще реализовать, и bump to attack интерфейс очень прост.
Я в wq поэтому и не стал вообще делать каких-то классов,
что б не надо было балансировать их между собой.
Просто хотелось что бы была мощная магия не ограниченная
потенциалом милишного класса :)

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

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

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

Помню на форуме было обсуждение мыши и в результате пришли к выводу, что мышь не очень нужна.
Более того, если на мышь повешена часть управления, отсутсвующая на клавиатуре, это даёт игре -100 к интерфейсу.
Иными словами, рогалик должен обладать полностью законченным клавиатурным управлением и, по возможности, поддерживать дублирование некоторых функций клавиатуры на мыши.
Последний раз редактировалось Jolly Roger 05 мар 2010, 11:39, всего редактировалось 1 раз.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

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

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

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

Xecutor писал(а):
Newman писал(а):Понятно, спасибо за разъяснения. :)
Сейчас ломаю голову, как сделать обработку мыши параллельно с клавиатурой, чтобы генерировались одинаковые игровые события...
Хм. Что ты сейчас делаешь когда игрок жмёшь стрелку?
По идее должно быть что-то типа:
player.Move(direction);
И тогда для нажатия мышой куда-то, берёшь направление от игрока
в эту точку, нормируешь и вызываешь тот же метод.
ну или как-то так:
if(map[player.getPosition().Add(direction)].isOccupiedByMonster())
{
player.Attack(direction);
}else
{
player.Move(direction);
}
Newman писал(а): А магию хотелось бы свести к минимуму. Как мне кажется, почти во всех играх больше внимания уделяется волшебникам, и маг 40 уровня к примеру играючи умерщвляет воина 40 уровня. :(
Таки да, баланс милишников и кастеров очень тяжкая штука.
Но насчёт "больше внимания уделяется" я не согласен :)
ИХМО как раз в рогаликов больше милишников.
Ибо проще реализовать, и bump to attack интерфейс очень прост.
Я в wq поэтому и не стал вообще делать каких-то классов,
что б не надо было балансировать их между собой.
Просто хотелось что бы была мощная магия не ограниченная
потенциалом милишного класса :)
Кстати никогда этого не понимал, ладно если это стратегия или мультиплеер, тогда баланс важен, а в рогалике? Они же не появляются в игре одновременно.
Скаже честно, я поставил перед собой план принципиально не балансировать классы и расы.
Имхо лучше будет ощутимое разнообразие, чем стерильный баланс.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

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

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

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

Разные классы и рас = разные уровни сложности, вот и всё
Айв кнгенгах Йог-Сотот

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

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

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

Maelstrom писал(а):Разные классы и рас = разные уровни сложности, вот и всё
Не совсем.
Например понятно, что тролль+варвар, это куда более сильная комбинация, чем хоббит+варвар.
Я хотел сказать, что например расы, в принципе, стараются балансировать,если не считать людей, которых обычно использую в качестве значения по умолчанию и они обычно оказываются вторсырьём. В тоже время, справделивости нет и не будет и скажем ангел или демон, будут в любом случае сильнее гоблина или троглодита, просто по причине полной расовой неполноценности последних.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

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

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

Сообщение Xecutor » 04 мар 2010, 11:14

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

В идеале игровой мир должен быть достаточно сложным,
что бы при игре разными расами/классами нужно
было обращать внимание на разные элементы террэйна,
по разному оценивать угрозу одних и тех же монстров и т.д.
ИМХО конечно.

Я не вижу смысла делать классы, если отличие чисто косметическое.
В wq есть перки и очень много разных спелов, которые
невозможно получить все вместе. Это создаёт немало разнообразия.
Одни и те же монстры могут представлять разную степень угрозы,
некоторыми чарами проще драться в коридоре, некоторыми в комнатах.

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

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

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

Xecutor писал(а):Просто если уж делать расы и классы, то они должны
предоставлять существенно разный игровой опыт.
В DCSS вагон рас. Но существенно разных раз два и обчёлся.
Классов как таковых там вообще нет. Они только стартовый шмот и скилы задают.
В ангбанде классы более-менее разные, зато от расы зависит
только самое начало игры. Дальше всё выравнивается.
Да и классы частично сливаются. Визард с мечём
наносящий 5 удров за ход - да легко.

В идеале игровой мир должен быть достаточно сложным,
что бы при игре разными расами/классами нужно
было обращать внимание на разные элементы террэйна,
по разному оценивать угрозу одних и тех же монстров и т.д.
ИМХО конечно.

Я не вижу смысла делать классы, если отличие чисто косметическое.
В wq есть перки и очень много разных спелов, которые
невозможно получить все вместе. Это создаёт немало разнообразия.
Одни и те же монстры могут представлять разную степень угрозы,
некоторыми чарами проще драться в коридоре, некоторыми в комнатах.
Золотые слова!
Хуже создания кучи одинаковых рас, только создание разных, а потом последующее их балансирование.
У меня какая мысль, каждая раса должна иметь как минимум один особый недоступный никому навык, а лучше парочку. Если в результате этого играбелных рас будет всего три, так это даже и лучше.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

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

Сообщение Aerton » 04 мар 2010, 11:51

Xecutor писал(а):GameObject->Unit(Creature)->Monster->NeutralAI
Creature->GiantRat
то бишь внутри unit было бы поле Creature*
которое полностью заведовало бы параметрами,
и методы по работе с параметрами делегировались из unit в creature.
AI тоже бы имело смысл делать через агрегацию: во-первых это понятия из другой плоскости, чем определение монстра, и у него может быть своя иерархия наследования, не имеющая общего с видами монстров. К тому же, он может меняться на лету - например, монстра приручили, или какая-нибудь магия, берущая под контроль, или сюжетная ситуация, когда монстр должен вести себя не как обычно. Если есть выбор, агрегация почти всегда предпочтительнее наследования.
Xecutor писал(а):В DCSS вагон рас. Но существенно разных раз два и обчёлся.
Вроде как они от этого пытаются уйти, порезали подвиды гномов и эльфов. В каком-то из вариантов *band было штук 40 рас, с различиями вида +1 к силе, а у этого +1 к ловкости, - неудивительно, что он не стал популярным. Ты прав - выбор без выбора почти всегда является недостатком.
Jolly Roger писал(а):
Maelstrom писал(а):Разные классы и рас = разные уровни сложности, вот и всё
Не совсем.
Например понятно, что тролль+варвар, это куда более сильная комбинация, чем хоббит+варвар.
Я хотел сказать, что например расы, в принципе, стараются балансировать
Во всех основных роглайках есть явно более сильные и более слабые расы/классы, и разработчики это делали намеренно.

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

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

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

Вопрос.
Есть класс MapPanel - собственно, это панель, на которой рисуется карта.
Есть класс World, в котором описан мир (карта и существа).
Как лучше организовать их взаимодействие? В частности, указать, что данные для отображения в MapPanel нужно брать из World?
Сделать в MapPanel метод setWorld(World world); ?

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

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

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

Newman писал(а):Вопрос.
Есть класс MapPanel - собственно, это панель, на которой рисуется карта.
Есть класс World, в котором описан мир (карта и существа).
Как лучше организовать их взаимодействие? В частности, указать, что данные для отображения в MapPanel нужно брать из World?
Сделать в MapPanel метод setWorld(World world); ?
В принципе, это не так существенно, главное, логическое представление - два отдельных класса. Можно и setWorld, можно world сделать синглтоном (World world - статическая глобальная переменная, доступная откуда угодно. Правда, это будет не очень хорошо, если планируется сохранение/загрузка без выхода из игры.) Можно вообще World сделать статическим классом.
Думаю, желательно, чтобы world по возможности не вникал в конкретные детали реализации MapPanel.
MapPanel - удачное название? Там будет только карта? Ни сообщений, ни статистики?

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

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

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

Anfeir писал(а): Думаю, желательно, чтобы world по возможности не вникал в конкретные детали реализации MapPanel.
MapPanel - удачное название? Там будет только карта? Ни сообщений, ни статистики?
Ага. Сообщения будут в LogPanel, статистика - в StatPanel. И всё.
(Долго думал, может, сообщения рисовать поверх карты, но потом решил, что это, пожалуй, лишнее...)
Спасибо за ответ!
P.S. Пожалуй, сделаю World статическим.

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

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

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

Anfeir писал(а):
Newman писал(а):Вопрос.
Есть класс MapPanel - собственно, это панель, на которой рисуется карта.
Есть класс World, в котором описан мир (карта и существа).
Как лучше организовать их взаимодействие? В частности, указать, что данные для отображения в MapPanel нужно брать из World?
Сделать в MapPanel метод setWorld(World world); ?
В принципе, это не так существенно, главное, логическое представление - два отдельных класса. Можно и setWorld, можно world сделать синглтоном (World world - статическая глобальная переменная, доступная откуда угодно. Правда, это будет не очень хорошо, если планируется сохранение/загрузка без выхода из игры.) Можно вообще World сделать статическим классом.
Думаю, желательно, чтобы world по возможности не вникал в конкретные детали реализации MapPanel.
MapPanel - удачное название? Там будет только карта? Ни сообщений, ни статистики?
Самый правильный подход, как говорится, проблемы негров шерифа не интересуют.
Думаю, что в идеале и проблемы шерифа, также не интересуют негров.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

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

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

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

В итоге, переписываю весь первоначальный код заново.
Карта - массив объектов Tile.

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

class Tile {
 /* id = 0 - трава, 1 - дерево, 2 - вода, 3 - стена пещеры, 4 - пол пещеры и т.п. */
 int id;
 /* Существо, находящееся в клетке (null - никого нет) */
 Creature creature;
 /* Предметы в клетке (null - ничего нет) */
 List<Thing> things;

 /* Возвращает картинку (тайл) для данной клетки */
 Image getImage();
}
Вот примерно в таком направлении двигаюсь.
Показывать пока нечего. :(

Ответить

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

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