Как реализовать систему инвентаря для игры? - PullRequest
2 голосов
/ 26 июня 2009

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

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

Чтобы уточнить: это браузерная игра mmo, и инвентарь каждого игрока должен сохраняться в течение всей игры. Наличие класса для каждого предмета (может быть сотни предметов), кажется, трудно поддерживать, если какие-либо изменения должны быть сделаны.

Ответы [ 2 ]

4 голосов
/ 26 июня 2009

В дополнение к реализации класса baseItem, как было предложено, вы также можете рассмотреть возможность разработки класса интерфейса для описания методов, которые должны иметь все элементы. Затем каждый тип элемента может реализовывать эти методы по-разному.

Например, для всех предметов может потребоваться метод equip (), но реализуйте его по-разному в зависимости от того, к какому виду предметов это относится. Возможно, вам не нужно создавать класс для каждого отдельного элемента, но вам, вероятно, следует создавать классы, которые способны создавать уникальные экземпляры элементов на основе некоторой структуры данных, которую вы предоставляете (которую можно хранить в базе данных).

Действительно общий пример может быть:

class Leather_Armor extends Armor_Base implements Equippable
{
     // these would probably be defined in the base class instead of here
     protected $_itemName;
     protected $_itemDescription;
     protected $_defenseRating;

     public function __construct(params)
     {
         // intialize properties with data from the db
     }


     // the Equippable interface requires us to define this function
     public function equip()
     {
        // call a function from the base class
        $this->recalculateDefenseRating($this->defenseRating)
     }

}

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

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

3 голосов
/ 26 июня 2009

Используя PHP, вам нужно настроить класс инвентаря и классы для каждого из ваших предметов - включая класс «baseItem», от которого наследуются предметы, который включает в себя вещи, общие для всех предметов (значок «звук» количество »).

Вам нужно будет сохранить пользовательский экземпляр класса инвентаря в переменной сеанса. Если вы хотите сохранить его, он должен быть в базе данных.

Любая страница, которая обращается к инвентарю, должна ссылаться на файл, содержащий классы предмета и инвентаря.

Эта ссылка показывает установку объекта для сеанса и доступ к нему через страницы.

РЕДАКТИРОВАТЬ: набрал слишком быстро и перепутал пару ключевых терминов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...