Форум 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)

Wolsh 30.03.2012 17:58

Цитата:

Можно, скажем, при расчете урона, наносимого персонажу, пройтись по всем слотам под вещи и проверить есть ли у вещей бонусы на защиту, если есть, то использовать их при расчете урона. Но этот способ очень ресурсоемок.
Для пяти слотов-то? Не, не страшно. Не страшнее ваших тысяч персонажей.
Потом, я не знаю как Вы представляете себе бой. Это может быть состояние, управляемое неким классом Fight. Ничто не мешает отдать ему один раз все бортовые параметры участников, и пусть он считает бафы, демэджи и резисты на протяжении боя, не дергая каждый раз непосредственно экземпляры участников.

maxkar 30.03.2012 20:21

Цитата:

Всего одновременно в мире находится около 3500 уникальных вещей.
Ну и? Пусть у каждой вещи 10 характеристик типа int. Это все займет (3500 * 10 * 4) = (150 000). Это 150 килобайт всего. Это как раз без изобретения отдельных "свойств", с отдельными "свойствами" памяти будет больше потребляться. Как будто 150Кб - это много. У вас несколько распакованных картинок столько памяти займут...

И это при том, что инвентарь чужой можно и не хранить. LOD здесь прекрасно действует. При попадании рейнджера в область видимости на основании его рассы/класса/уровня ему можно примерно сгенерировать инвентарь. И вы никак не отличите сегнерированный инвентать от "наторгованного". А уж магазины на планетах точно генерируют инвентарь при посещении (возможно - при посещении звездной системы).

Den_root 31.03.2012 17:37

"Вы ему про Фому,а он вам про Ерёму! Топикстартер видимо хочет реальный живой мир где характеристики сущностей случайно не генерируются когда попадают в зону влияния, а вы ему LOD предлагаете. В тех же КР2 корабли случайно генерируются на планетах вместе с оборудованием и дальше уже летают по вселенной и наличие поблизости игрока на них никак не влияет. Кстати оборудование в магазинах генерируется случайно, но не во время посещения игроком планеты, а каждый игровой цикл и реально присутствует на планете.

Кстати, господин Wolsh дал очень точное определение:
Цитата:

Сообщение от Wolsh (Сообщение 1072010)
...представляете игру как огромную вселенную с постоянной и равномерной плотностью объектов и событий. ...

В КР2 на другом конце галактики, на планете появляется случайно сгенерированный пират, вылетает и сбивает торговца, летящего продавать купленный в соседней системе товар. Пират может заменить свое оборудование на оборудование торговца если оно выпало во время его уничтожения, может собрать товар и продать его на планете и т.п. В этом и была вся фишка, игрок живет по тем же законам, что и все в этом мире и если игрока убрать мир продолжит существовать.

PlutDem
В КР2 была очень простая механика и никакой физики, да к тому же пошаговая. Если Ваш проект с физикой и в реальном времени, то придется удаленный бой просчитывать приблизительно т.е.:
Цитата:

Сообщение от Wolsh (Сообщение 1071926)
Исход боя может решаться вообще сравнением всего двух характеристик.

Это практикуется в космосиме серии X3:Reunion, правда там эти приблизительные расчеты часто врут и из за этого не так интересно как в КР2.
Но в любом случае тысячи кораблей AS3 не потянет, можно конечно сделать несколько сотен и в случае если проект выстрелит портировать уже на другую платформу.

Wolsh 31.03.2012 21:49

Цитата:

Топикстартер видимо хочет реальный живой мир где характеристики сущностей случайно не генерируются когда попадают в зону влияния
А мы вот все о том, что это абсолютно бессмысленно, занимать память нестреляющими ружьями.
Я ни одной игры кроме пятнашек и паззла в жизни не написал, так что все что я говорю можно смело делить на 16. Я обычной логикой оперирую.
Если нет суслика, пофиг сколько у него зубов и какого оттенка шкурка.
Как я вижу процесс:
При запуске игры с жесткого диска считывается последнее сохранение и создается временный (возможно, "распакованный", сейв, с которым игра общается пока юзер не выберет в меню "сохранить" (старыйй сейв естественно не подлежит модификации в процессе игры, он для истории): в случае этих ваших КР берем из сейва координаты и векторы кораблей, включаем жизнь, полетели. Никакие ништяки в слотах кораблей нас не интересуют в это время, и считывать их из сейва нет никакой необходимости.
Событие – два корабля встретились. Берем из сейва их характеристики. Если корабли дружественные, запускаем процесс торговли, если враждебные – процесс битвы. Торговля это передача от одного корабля другому случайной части ништяков на сумму не больше 75% от количества денег второй стороны. Можно усложнять интеллект как угодно в разумных пределах, делать списки приоритетов из необходимостей (скажем если у одного мало топлива то он обязательно покупает топливо, и немного зубного порошка прицепом) – я не думаю что такие события будут происходить по 10 штук на кадр, иначе самым расхожим товаром будет краска для обшивки кораблей.
Поторговали, записали новые состояния слотов в сейв, очистили от них память и полетели дальше.
Аналогично с битвой. Никто же не требует от интеллекта игры реального сражения (если конечно ГГ не является его свидетелем). Сравнили боевую мощь, разбавили случайностью, сгенерировали списки повреждений и затрат боеприпасов, записали в сейв и разлетелись; либо поверженный корабль захвачен, часть груза в соответствии с приоритетами и грузоподъемностью судна победителей отобрана у побежденных, записали слоты в сейв и разлетелись.
И как уже несколько раз сказали, все эти слоты, о которых был изначальный вопрос – ничто по ресурсам в сравнении с графикой и логикой. Но вам всеравно придется делать LOD для графики, таскать картинки кораблей, которые никто не видит – это же жесть вообще. А они ведь такие же свойства. Вам придется разграничивать свойства, необходимые для простого интеллекта "оно где-то там летает", от свойств "о боже, оно летит прямо на меня!"

PlutDem 01.04.2012 00:08

Цитата:

Сообщение от Wolsh (Сообщение 1072305)
При запуске игры с жесткого диска считывается последнее сохранение и создается временный (возможно, "распакованный", сейв, с которым игра общается

Вот отсюда можно поподробнее? Что из себя представляет сейв? Shared Object? Что имеется в виду под "распакованный"?

Wolsh 01.04.2012 00:29

Shared Object конечно, ФП другого не умеет.
"Распакованный" значит, что сохранение на жестком диске может храниться в сжатом виде, а для общения в процессе игры можно создать развернутую структурированную копию, более удобную для доступа к частям сейва. Можно создать полсотни отдельных SO "по темам". По окончании игры их можно просто удалить. При нормальном новом сохранении игры (от юзера) на их основе создается новый сейв, сжимается и сохраняется в один SO, имя и дата которого регистрируются в "самом главном SO" – списке всех сейвов. Когда игра запускается и игрок выбирает "загрузить", игра обращается к этому главному списку и предоставляет игроку список сейвов с именами, датами, может еще какими данными, хоть картинками)) Игрок выбирает, какое сохранение он хочет загрузить, игра обращается к этому сейву по имени из списка, распаковывает его во временные SO и формирует мир.

Добавлено через 9 минут
вот как-то выдумывал

PlutDem 09.04.2012 22:35

Кажется, я все таки нашел способ снизить потребляемую предметами память! В базовом классе 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 раза проапгрейдить вещь на один и тот же бонус, то в результате будут храниться два свойства на каждый апгрейд, но думаю это можно как нибудь решить.

alatar 09.04.2012 23:11

getSize.

PlutDem 09.04.2012 23:26

alatar
getSize измерит сам объект но, проигнорирует свойства имеющие ссылки на другие объекты, т.е. скажем, getSize измерит размер массива, но не учтет содержимое его ячеек. Хотелось бы что то более надежное и комплексное. Вроде можно измерить с помощью Sampler, но в справке как то все мутно расписано.

Wolsh 09.04.2012 23:42

Мне вот до сих пор непонятна одна тема в Декораторе. Стыдно, да, но почему-то все описания паттерна молчат об этом.
Вот декорировал ты себя шапкой +50 к мане.
А как теперь эту шапку снять? Особенно если потом еще сапоги нацепил.
А еще круче – хлебнул ты Зелье Силы и стамина подскочила на 75 децелов. Но действует только 1 минуту. И что делать с этим декоратором через минуту? Как от него избавиться?
Поясните кто-нибудь пожалуйста.


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

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