Показать сообщение отдельно
Старый 20.10.2017, 10:54
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 75  
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
В моём понимании, это свойство hatUsed:ItemHat класса Character.
Это не гибкий подход. Что если ты захочешь добавить какой-то новый предмет, например ItemCap, вместо ItemHat? Тоже одевается на голову, но класс уже другой и в эту переменную не записать. При таком подходе придется каждый раз добавлять и новые свойства персонажу. Я бы сделал массив, в котором хранил экземпляры добавленных предметов. Сами придметы должны все расширять какой-то базовый класс, например Item, и добавляться персонажу они тоже должны как Item. В самом классе можно сделать несколько констант, которые отвечают за те свойства, которые модифицирует предмет, например так
Код AS3:
// в классе Item
public static const TYPE_HEALTH:String = "health";
public static const TYPE_ARMOR:String = "armor";
 
public var type:String = null; // назначается в наследниках
public var value:Number = 0; 
 
// в конструкторе наследника
public function HatItem() {
     type = Item.TYPE_ARMOR; // шапка увеличивает защищенность
     value = .15 // на 15% от текущей защищенности персонажа
}
 
// в классе персонажа
private var _items:Array = [];
private var _health:Number = 100; // базовая величина здоровья, без 
private var _healthIncrease:Number = 0; // величина прироста, которую могут давать преметы
private var _armor:Number = 50;
private var _armorIncrease:Number = 0; 
 
public function addItem(newItem:Item):void {
     if (item) {
         for each (var item:Item in _items) {
             if (item.type == item.type) {
                  trace("предмет такого типа уже надет, сначала нужно снять его"); // если не нужно, чтобы игрок использовал предметы одного типа несколько раз
                  return;
             }
         }
         _items.push(newItem);
         calculateValues(); // пересчитываем показатели игрока после добавления нового предмета
 
     }
}
public function removeItem(item:Item):void {
    if (item) {
        var index:int = _items.indexOf(item);
        if (index > -1) {
            _items.removeAt(index);
        }
        calculateValues();
    }
}
 
private function calculateValues():void {
      _healthIncrease = 0;
      _armorIncrease = 0; // обнуляем все показатели, чтобы записать новые без багов
      for each (var item:Item in _items) {
          switch (item.type) {
              case Item.TYPE_HEALTH:
                    _healthIncrease = item.value;
                    break;
              case Item.TYPE_ARMOR:
                    _armorIncrease = item.value;
                    break;
          } 
      }
}
 
// используем где надо с учетом прибавок
public function get health():Number {
     return _health + (_health * _healthIncrease);
}
public function get armor():Number {
     return _armor + (_armor* _armorIncrease);
}
как-то так

Цитата:
В-третьих, создав классы для предметов, где-то в программе необходимо создать и сами предметы
Ну, например в резделе инвентаря в магазине. И там же отображется что из них используется в данный момент
__________________
Ко мне можно и нужно обращаться на ты)


Последний раз редактировалось caseyryan; 20.10.2017 в 11:08.