К сожалению, я делаю приключенческую игру с java и slick2d из-за моего школьного проекта по разработке объектно-ориентированного программного обеспечения.
Я применяю архитектуру MVC и создаю элементы, читая файл карты Tiled в классе ItemFactory. Кажется, они подходят для такой игры.
В игре есть несколько предметов, которые влияют на игру и особенно на персонажа. (персонаж такой же, как игрок в этом контексте)
Существует модель персонажа, и у нее есть внутренний класс Inventory, который в основном состоит из элементов ArrayList.
Контроллеры персонажей имеют функцию, называемую takeItem, которая принимает аргумент контейнера (т. е. полки), который также имеет список элементов ArrayList, а затем удаляет то, что внутри, и помещает в инвентарь.
И у него есть функция, которая называется useItem, принимает индекс int и использует элемент в соответствующем индексе.
До этого все нормально.
Теперь главная проблема в том, что эти предметы имеют специфическое применение. Например, зелье здоровья увеличивает здоровье персонажа, зелье невидимости делает его невидимым и т. д.
Чтобы поддерживать хороший дизайн, как и где я могу интерпретировать и придавать функции этим элементам?
Пока я думаю примерно так: 1- я не добавлял никакой функции в класс элемента. У него есть только имя, описание и Enumerated ItemType и int power 2. Я выполняю каждую работу в методе useItem() контроллера персонажа, т.е.
if (itemBeingUsed.getType() == Common.ItemType.POTION)
`characterModel.increaseHealth(itemBeingUsed.getPower())`
Как видите, это кажется странным, потому что контроллер символов действует как интерпретатор элементов.
3- Другой подход может заключаться в создании класса ItemInterpreter, который принимает контроллер символов. Хотя это кажется более элегантным, это заставит меня выполнять кучу ненужных функций в контроллере персонажей, таких как функция «increaseCharacterHealth», которая вызывает функцию увеличенияHelth() модели персонажа и так далее.
Другая возможная проблема заключается в том, что я использую функции Контроллера персонажа для использования предметов, но предметы также могут влиять на игру, то есть замедлять время, но Контроллер персонажа находится ниже иерархии классов игры и не имеет доступа к функциям Game/GameController. Замедление времени игры и т. д. кажется не так, по крайней мере, сейчас, поэтому похоже, что я могу использовать предметы в классе CharacterController, но я хотел бы знать ваше мнение, хороший ли это дизайн или что может быть лучше.
Некоторые коды для устранения проблем: (примечание: они не завершены) Примечание. Я помещаю перечисляемые типы, такие как ItemType, Direction и т. д., в общий класс, который является общим для всех классов.
Используйте функцию элемента в CharacterController:
public void useItem(int index){
Item item = ((Character)obj).inventory.takeItem(index);
if (item != null) {
if (item.getType() == Common.ItemType.POTION) {
((Character)obj).increaseHealth(item.getPower()); // I have extended a Person class, now I have to typecast to character everytime, which is also nonsense
}
else
System.out.println("and other items..");
}
else
System.out.println("Cannot use");
}
Я не весь код выложил, но могу, если непонятно объяснил.