Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Разработка модели "куклы" персонажа и влияющего на его характеристики "шмота" (http://www.flasher.ru/forum/showthread.php?t=177329)

PlutDem 09.04.2012 23:50

Wolsh
Код AS3:

    (персонаж)
  ( (персонаж) +50 стамины )// надел шапку
( ( (персонаж) +50 стамины ) -50 стамины)// снял шапку

:) Тоже этот вопрос интересует.
P.S. Если это камень в мой эээ... код, то у меня декоратор используется только для создания шмота.

Wolsh 09.04.2012 23:55

Не не, по Вашему коду персонаж то не декорируется, он именно "применяет шапку", а не "становится шапкой".
По Вашему коду мой вопрос скорее касается самой шапки. Как с нее "снять" зачарование, убрать один из декораторов.

Цитата:

но думаю это можно как нибудь решить.
Код AS3:

override public function get strength():int {
        return item.strength + this._strength;
}

? ;)

Добавлено через 19 минут
Если хотите камней, то их есть у меня.
Шапка hat это экземпляр Item, так?
У Item есть свойства strength, stamina и т.д.?
Вопрос – чем ваше декорирование лучше прямой установки?
Код AS3:

var hat:IItem = new Item("Magic hat");
hat.stamina += 50;


alatar 10.04.2012 00:26

Цитата:

Но действует только 1 минуту. И что делать с этим декоратором через минуту? Как от него избавиться?
Ну как нацепил так и снял. Декоратор не должен менять свойства объекта, он просто возвращает базовое
значение + бонус.
PlutDem, возьмите уже наконец любой профайлер и посмотрите сколько ресурсов потребляет ваше приложение.

Wolsh 10.04.2012 00:36

Вот мне и непонятно. Технически.
Нацепил-то я вот так
Код AS3:

var hat:IItem = new Item("Magic hat");
hat = new StrenghtUpgrade(hat, 58);
hat = new DexterityUpgrade(hat, 15);

Как теперь "снять" например StrenghtUpgrade и оставить DexterityUpgrade?

PlutDem 10.04.2012 00:43

Цитата:

Сообщение от Wolsh (Сообщение 1073996)
По Вашему коду мой вопрос скорее касается самой шапки. Как с нее "снять" зачарование, убрать один из декораторов.

Я могу предложить только быдло-способ, загасить эффект ненужного декоратора другим декоратором либо создать новый объект с текущими декораторами кроме ненужного.
Цитата:

Сообщение от Wolsh (Сообщение 1073996)
Код AS3:

override public function get strength():int {
        return item.strength + this._strength;
}

? ;)

Посмотрите внимательнее на декоратор. У каждого из них есть свойство для хранения значения прибавляемого бонуса. Т. е. если применить к вещи 2 декоратора силы +5 и +10, то в памяти будут хранится эти два свойства со значениями 5 и 10. Если увлечься такими апгрейдами, то в конце концов объект вещи разжиреет.
Цитата:

Сообщение от Wolsh (Сообщение 1073996)
Если хотите камней, то их есть у меня.
Шапка hat это экземпляр Item, так?
У Item есть свойства strength, stamina и т.д.?
Вопрос – чем ваше декорирование лучше прямой установки?
Код AS3:

var hat:IItem = new Item("Magic hat");
hat.stamina += 50;


У Item нет свойств, только геттеры. Свойство для хранения значения бонуса добавляет декоратор, в этом то вся и фишка. Если правильно понимаю, то во эта конструкция будет существовать в единственном экземпляре для всех объектов класса.
Код AS3:

public function get armor():int {
                        return 12;
                }

P.S. Вопрос про измерение памяти все еще в силе, если эта белиберда сэкономит 5% памяти, то ну его нафиг.:)

Wolsh 10.04.2012 01:09

(да, проглядел, что Вы возвращаете константы, не храня их в переменных)
Цитата:

Если увлечься такими апгрейдами, то в конце концов объект вещи разжиреет.
Цитата:

в этом то вся и фишка.
15 наслоений полного комплекта углубляющихся геттеров легче одной переменной?
Ведь для изменения одного (не побоюсь этого слова) свойства декоратором Вам надо нагрузить предмет полным комплектом всех геттеров, цепляющихся к прошлым геттерам.
Вы так рассчитываете сэкономить память и увеличить быстродействие?
Вопрос "чем ваше декорирование лучше прямой установки?" всё ещё в силе. Ответа не было.

PlutDem 10.04.2012 02:02

Цитата:

Сообщение от Wolsh (Сообщение 1074021)
15 наслоений полного комплекта углубляющихся геттеров легче одной переменной?
Ведь для изменения одного (не побоюсь этого слова) свойства декоратором Вам надо нагрузить предмет полным комплектом всех геттеров, цепляющихся к прошлым геттерам.
Вы так рассчитываете сэкономить память и увеличить быстродействие?
Вопрос "чем ваше декорирование лучше прямой установки?" всё ещё в силе. Ответа не было.

У большинства вещей по 2-3 бонуса к характеристикам. Держать в объекте 2-3 свойства лучше чем все 25. В среднем около 3-5 наслоений.

В любом случае, метод себя оправдал на жалких 10%:)
Проще держать в вещи все возможные свойства. К тому же от их количества зависит далеко не многое.
Код AS3:

public class Main extends Sprite {
 
                public function Main():void {
 
                        var items:Array = new Array();
                        for (var i:int = 0; i < 200000; i++) {
                                items[i] = new TestItem;
                        }
 
                }
 
        }

Код AS3:

public class TestItem {
 
                public var testSkills:TestSkils = new TestSkils();
                public function TestItem() {
 
                }
 
        }

Код AS3:

public class TestSkils {
 
                public var ar_1:int =2;
                public var ar_2:int =2;
                public var ar_3:int =2;
                public var ar_4:int =2;
                public var ar_5:int =2;
                public var ar_6:int =2;
                public var ar_7:int =2;
                public var ar_8:int =2;
                public var ar_9:int =2;
                public var ar_10:int =2;
                public var ar_11:int =2;
                public var ar_12:int =2;
                public var ar_13:int =2;
                public var ar_14:int =2;
                public var ar_15:int =2;
                public var ar_16:int =2;
                public var ar_17:int =2;
                public var ar_18:int =2;
                public var ar_19:int =2;
                public var ar_20:int =2;
                public var ar_21:int =2;
                public var ar_22:int =2;
                public var ar_23:int =2;
                public var ar_24:int =2;
 
                public function TestSkils() {
                        }
 
        }

Всего потребляемой памяти: 9 256 Kb.
Если в TestSkils убрать все свойства кроме 3, то всего потребляемой памяти будет 8 776 Kb.
А если сделать так, то всего потребляемой памяти будет 4 624 Kb.
Код AS3:

public class Main extends Sprite {
 
                public function Main():void {
 
                        var items:Array = new Array();
                        for (var i:int = 0; i < 200000; i++) {
                                items[i] = 12;
                        }
 
                }
 
        }

В общем, занимаюсь экономией на спичках:D

Wolsh 10.04.2012 03:18

)) Вам это всю тему твердят. Рад что нашли способ убедиться.

alatar 10.04.2012 12:04

Цитата:

Сообщение от Wolsh (Сообщение 1074008)
Вот мне и непонятно. Технически.
Нацепил-то я вот так
Код AS3:

var hat:IItem = new Item("Magic hat");
hat = new StrenghtUpgrade(hat, 58);
hat = new DexterityUpgrade(hat, 15);

Как теперь "снять" например StrenghtUpgrade и оставить DexterityUpgrade?

Это как удалить элемент в однонаправленном списке. В видео декораторы используются для апгрейдов, они в принципе не снимаемые. Нужна реализация с доступом к декорируемому объекту.

Wolsh 10.04.2012 12:24

Ага, но не о видео речь. Я не нашел (может проглядел) этого ни у GOF, ни в книге по паттернам в AS3.0
И мне всегда это казалось странным. Как в данной ситуации – ну нацеплять декораторов на шапку навсегда еще куда ни шло. Но если декорировать перса, то нужен этот самый доступ к списку декораторов, что ли, чтобы вытаскивать экземпляр "до" и навешивать на него заново все что "после" удаляемого декоратора. То есть сама по себе красивая идея превращается в кошмар программиста. Ну, программиста моего уровня по крайней мере))))
А насчет чем мне видео помогло – в нем показан декоратор на интерфейсах. А в книге по паттернам AS3 рассматривается декоратор на наследовании, и меня всегда ужасало, что каждый декоратор вынужден наследовать фактически декорируемый класс)))) Только после видео я въехал, что речь о "пустом" абстрактном суперклассе. И всеравно на интерфейсах мне как-то комфортней и понятней. За это прозрение и спасибо))


Часовой пояс GMT +4, время: 17:38.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.