Цитата:
|
В моём понимании, это свойство 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);
}
как-то так
Цитата:
|
В-третьих, создав классы для предметов, где-то в программе необходимо создать и сами предметы
|
Ну, например в резделе инвентаря в магазине. И там же отображется что из них используется в данный момент