Показать сообщение отдельно
Старый 09.04.2012, 22:35
PlutDem вне форума Посмотреть профиль Отправить личное сообщение для PlutDem Найти все сообщения от PlutDem
  № 37  
Ответить с цитированием
PlutDem
 
Аватар для PlutDem

Регистрация: Feb 2012
Сообщений: 212
Кажется, я все таки нашел способ снизить потребляемую предметами память! В базовом классе Item прописываем геттеры на все возможные характеристики, а через декоратор добавляем нужные бонусы и храним их значения в свойствах. Таким образом предмет хранит в себе только те свойства характеристик к которым есть бонус, а на все остальное возвращает ноль. К сожалению, не знаю как измерить занимаемую всей этой конструкцией память, но наверняка это лучше чем 25 элементный массив.
Код AS3:
public class Main extends Sprite {
 
		public function Main():void {
 
			var person:Person= new Person(0,10,5)
 
			var hat:IItem = new Item("Magic hat");
			hat = new StrenghtUpgrade(hat, 58);
			hat = new DexterityUpgrade(hat, 15);
 
			person.wearItem(hat);
 
		}
 
	}
Код AS3:
public class Person extends Sprite{
 
		public var strength:int;
		public var dexterity:int;
		public var stamina:int;
 
		public function Person(strength:int,dexterity:int,stamina:int) {
 
			this.strength = strength;
			this.dexterity = dexterity;
			this.stamina = stamina;
		}
		public function wearItem(item:IItem):void {
			this.strength+=item.strength;
			this.dexterity+=item.dexterity;
			this.stamina+=item.stamina;
		}
	}
Код AS3:
public interface ISkills {
 
		function get strength():int;
		function get dexterity():int;
		function get stamina():int;
 
	}
Код AS3:
public interface IItem extends ISkills{
 
		function get name():String;
	}
Код AS3:
public class Item implements IItem{
 
		protected var _name:String;
 
		public function Item(name:String){
			this._name = name;
		}
 
		public function get strength():int {
			return 0;
		}
		public function get dexterity():int {
			return 0;
		}
		public function get stamina():int {
			return 0;
		}
		public function get name():String {
			return _name;
		}
	}
Код AS3:
public class ItemDecorator implements IItem{
 
		protected var _item:IItem;
 
		public function ItemDecorator(item:IItem){
 
			this._item = item;
		}
 
		public function get strength():int {
 
			return _item.strength;
		}
 
		public function get dexterity():int {
 
			return _item.dexterity;
		}
 
		public function get stamina():int {
 
			return _item.stamina;
		}
 
		public function get name():String {
 
			return _item.name;
		}
	}
Код AS3:
public class StrenghtUpgrade extends ItemDecorator{
 
		protected var _strength:int;
 
		public function StrenghtUpgrade(item:IItem,value:int) {
			super(item);
			this._strength = value;
		}
		override public function get strength():int {
			return super.strength + this._strength;
		}
	}
Правда если захотеть 2 раза проапгрейдить вещь на один и тот же бонус, то в результате будут храниться два свойства на каждый апгрейд, но думаю это можно как нибудь решить.