Помогите отделить игровой дизайн - PullRequest
0 голосов
/ 03 февраля 2011

Вот текущий график зависимости (с нарисованными от руки кругами для TheTXI ) Dependencies

В игре есть игроки и одна доска, которой они делятся. Игрок также имеет доступ к доске, чтобы иметь возможность добавлять / перемещать / удалять юниты с нее. Игрок имеет доступ к принадлежащим ему юнитам, как на доске, так и за ее пределами (юнит также знает своего владельца, но его, вероятно, можно удалить и просто выполнить поиск). На доске есть юниты, и они знают позиции юнитов. У юнитов есть способности (возможно, игроки тоже могут)

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

Как я могу иметь способности, которые могут повлиять на что-либо, не имея ссылки на все? Я понимаю, что каждая способность может и должна иметь ссылки только на то, что ей нужно, но у класса юнитов есть встроенные способности, поэтому, если способность юнита влияет на доску, ему нужно каким-то образом получить ссылку на доску от юнита?

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

Даже несмотря на то, что доска / карта вообще все еще в воздухе, поэтому отряды должны быть отделены от того, чем они являются в настоящее время. Там нет ни глобального состояния, ни какого-либо «божьего объекта» (пока), и я бы хотел оставить его таким.

В частности, речь идет о веб-приложении на Python, поэтому, хотя сам вопрос не зависит от языка, любая специфика, основанная на динамическом языке с функциями первого класса, безусловно, приветствуется.

1 Ответ

1 голос
/ 04 февраля 2011

Во-первых, позвольте мне указать вам на замечательный gamedev StackExchange .Возможно, вам повезет больше, если вы разместите этот вопрос там.

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

Сложно объяснить, поэтому позвольте мне написать это в psuedocode ...

Game {
 getMe(); //Returns reference to singleton class. 
 list of players
 list of boards
}

Board { 
 list of units 
}

Unit {
 int health
}

function Unit.notifyAbility(source, targeting-condition, ability-code) {
  Game::getMe()->sendNotification(source, targeting-condition, ability-code);
}

function Game.sendNotification(source, targeting-condition, ability-code) {
 for each unit in list of units {
   if(unit matches targeting condition) {
     apply ability-code
   }
 }
}

Условие цели и код способности сами по себе могут быть структурами данных, которые передают соответствующую информацию.Более того, сделайте их виртуальными классами и используйте некоторую форму полиморфизма для обработки уникальных случаев.

Пример:

AbilityCode {
 virtual function applyToUnit(target Unit)
 virtual function applyToPlayer(target Unit)
}

AbilityGainHP: child of AbilityCode {
 function applyToUnit(target Unit) { target.hp+= gainAmt; }
 int gainAmt;
}

Надеюсь, это имеет смысл.

...