Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.05.2018, 16:25
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 11  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Appleman,
Предложенный мною способ основан на реляционной модели данных, где каждая сущность имеет свой уникальный ключ (id) для связи с другими. Effect и EffectData это разные сущности, первая описывает действующий эффект, вторая - его описание.

__________________
Дети не должны знать о своих родителях

Старый 17.05.2018, 16:29
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 12  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Кейси, прикол в том, что .hasForce у автора в виде строки "hasForce", так что Классы или Интерфейсы, тут два сапога params.
__________________
Reality.getBounds(this);

Старый 17.05.2018, 16:48
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 13  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Ребята, давайте я чуть подробнее своё решение опишу, а вы покритикуйте.

Вот смотрите. Если у меня в классе Character есть свойство _strength, отвечающее за силу, то я, написав
Код AS3:
public function get strength(): uint {return _strength}
сразу же открываю класс IDs и вписываю туда статическую константу
Код AS3:
static public const PROP_STRENGTH: String = "strength"
Всё. Теперь где бы мне ни потребовалось передать обращение (подчёркиваю, не обратиться, а именно передать необходимость обращения) к свойству силы, я знаю как это сделать. Например, я записываю таблицу условий на выполнение действия или использования предмета в вектор:
Код AS3:
_activeConds.push(new ACRange(IDs.PROP_STRENGTH, 15)); //Наследник класса проверки условий
В каждом из наследников есть метод проверки переданного в конструктор условия. Метод refreshActions() в Модели пробежит их все, и если хотя бы по одному получит false, кнопка действия будет неактивной.

А если в результате какого-то действия нужно изменить силу на -5, то я могу добавить экземпляр класса
Код AS3:
new PropUpdates(IDs.PROP_STRENGTH, -5);
и вызвать у Character метод

Код AS3:
private function parsePropUpdates(updates: Vector.<PropUpdates>) : void
{
for each (var update:PropUpdates in updates) this[update.PropID] += update.value;
}
При этом использование констант в общедоступной библиотеке гарантирует от того, что я назавтра забуду, как правильно называется свойство, отвечающее за силу. Это я в хелпе про события подсмотрел. Там же точно такой же принцип заложен - обращаться к константам вместо непосредственно строк. Плюс с таким подходом я могу хоть в XML какие-то конструкции передать, хоть ещё как-нибудь. Как-то так...
__________________
Не сломано - не чини!


Последний раз редактировалось Appleman; 17.05.2018 в 16:59.
Старый 17.05.2018, 17:35
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 14  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от Appleman Посмотреть сообщение
.. сразу же открываю класс IDs и вписываю туда статическую константу
Код AS3:
static public const PROP_STRENGTH: String = "strength"
Всё. Теперь где бы мне ни потребовалось передать обращение (подчёркиваю, не обратиться, а именно передать необходимость обращения) к свойству силы, я знаю как это сделать.
В принципе, это норм, только класс я бы назвал CharacterProperty и значения использовал не строковые, а целочисленные. (Int, Uint). Строки - жирные и тормознутые.

Цитата:
Сообщение от Appleman Посмотреть сообщение
Например, я записываю таблицу условий на выполнение действия или использования предмета в вектор:
Код AS3:
_activeConds.push(new ACRange(IDs.PROP_STRENGTH, 15)); //Наследник класса проверки условий
Вот это фигня какая-то, я бы сделал по другому, описал 2 таблички - "Условия" и "Действия". Допустим, в игре есть используемые предметы, тогда, сущность "Предмет" будет выглядеть так:
Код:
class Item {
    var id:Uint; // ID Предмета
    var useCondition:Uint; // ID Условия, которое должно выполняться для использования предмета
    var useAction:Uint; // ID Выполняемого действия.
}
class Condition {
    var id:Uint;
    var minStrength:Number;
}
class Action {
    var id:Uint;
    var type:Uint; // Тип действия. (ActionType)
    var strength:Number;
    var agility:Number;
}
class ActionType {
    static const ADD:Uint = 1; // Добавить.
    static const MUL:Uint = 2; // Умножить.
    static const SET:Uint = 3; // Установить.
}
Обрати внимание, как сущности связаны между собою, я это хочу донести. Один предмет может ссылаться на одно и то-же действие, например. (Предметы id=2, id=3 могут иметь общее условие condition=8)
Или так:
Код:
class Item {
    var id:Uint; // ID Предмета
    var use; // ID Использоания.
}
class Use {
    var id:Uint; // ID Применения.
    var condition:Uint; // ID Условия, которое должно выполняться для этого использования.
    var action:Uint; // ID Выполняемого действия.
}
Сперва нужно разобраться со структурой данных и связями между ними. Все связи должны быть так-же выражены в отдельных таблицах (Class), а не разбросаны по коду в виде иерархий наследования или огромных стеков из if.

пс. Больше я не буду предлагать решение для задачи, которую не знаю целиком.
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 17.05.2018 в 18:00.
Старый 17.05.2018, 18:31
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 15  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Насколько я понял, ты говоришь о том, что у тебя в Персонаже есть вектор, в котором находятся пары "имя свойства" - "значение", и по вызову updateProps все эти штуки применяются. То есть для каждого персонажа в игре, для каждой фигулечки, с которой что-то происходит, нужно наполнять этот вектор действий.
Я бы, наверное, пошел по другому - у меня были бы сущности Действия, в которые я бы передавал тех, с кем они происходят и вытворял бы с ними там уже что хочешь. Без вот этих заморочек. Зачем это все?
__________________
while(live()) { hope(); }

Старый 17.05.2018, 19:20
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 16  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Я бы, наверное, пошел по другому - у меня были бы сущности Действия, в которые я бы передавал тех, с кем они происходят и вытворял бы с ними там уже что хочешь. Без вот этих заморочек. Зачем это все?
В чем преимущество? Тебе все равно нужно будет где-то хранить эти сущности. А так как для разных персонажей значения могут быть разными, то и разные сущности бы пришлось создавать для разных персонажей. По мне так всё то же самое, только шиворот-навыворот
__________________
Ко мне можно и нужно обращаться на ты)

Старый 17.05.2018, 19:51
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 17  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Мою ссылку на библиотеку решили не смотреть, ну ок
__________________
местонахождение

Старый 18.05.2018, 00:26
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 18  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 479
Цитата:
Сообщение от Tails Посмотреть сообщение
В принципе, это норм, только класс я бы назвал CharacterProperty и значения использовал не строковые, а целочисленные. (Int, Uint). Строки - жирные и тормознутые.
Согласен. Решил делать строки, чтобы в отладке удобно было. Пишешь trace("чего-нибудь " + PropID) и сразу понятно, о чём идёт речь. Возможно, потом поменяю для оптимизации.

Цитата:
Вот это фигня какая-то, я бы сделал по другому, описал 2 таблички - "Условия" и "Действия". Допустим, в игре есть используемые предметы, тогда, сущность "Предмет" будет выглядеть так:
Код:
class Item {
    var id:Uint; // ID Предмета
    var useCondition:Uint; // ID Условия, которое должно выполняться для использования предмета
    var useAction:Uint; // ID Выполняемого действия.
}
class Condition {
    var id:Uint;
    var minStrength:Number;
}
Я с тобой тут поспорю. Во-первых, условия могут отличаться как количественно, так и качественно. В твоём варианте получается, что любое количественное изменение (сила не 5, а 10) - это появление нового экземпляра, а любое качественное (т.е. не только сила, а сила 5 и ловкость 8 вместе) - новый класс или наследник. Или ты предлагаешь воссоздавать в Condition все свойства проверяемого объекта и устанавливать значения для тех, которые должны быть проверены? Там ещё экипированные предметы, статус-эффекты и хрен знает что ещё.

Во-вторых, при таком подходе имеем туеву хучу плохо читаемых объектов. Как потом разбираться, что из себя представляет Condition id8 или id28? Imho, запись вроде {IDs.PLAYER, IDs.PROP_STRENGTH, 15} читается лучше.

В-третьих, я не совсем понял, откуда метод, выполняющий проверку условия id8 "знает", что свойство minStrength в экземпляре Condition связано именно со свойством _strength персонажа, а не с каким-нибудь другим?

СлаваRa, а я подумал, это троллинг такой с твоей стороны
__________________
Не сломано - не чини!

Старый 18.05.2018, 01:37
ZergMaster вне форума Посмотреть профиль Отправить личное сообщение для ZergMaster Найти все сообщения от ZergMaster
  № 19  
Ответить с цитированием
ZergMaster
 
Аватар для ZergMaster

Регистрация: May 2008
Адрес: Питер
Сообщений: 385
Отправить сообщение для ZergMaster с помощью ICQ Отправить сообщение для ZergMaster с помощью Skype™
Цитата:
Сообщение от caseyryan Посмотреть сообщение
В чем преимущество? Тебе все равно нужно будет где-то хранить эти сущности. А так как для разных персонажей значения могут быть разными, то и разные сущности бы пришлось создавать для разных персонажей.
Преимущество чисто субъективное в понятности. Что мы имеем сущности-действия, в которые закидываем нечто, производя с этим нечто некие действия. Причем действиям не в курсе, кого именно мы закидываем в них. Таким образом нам нужно лишь прописать все действия, и все субъекты. А далее их просто в разных комбинациях совмещать, расширять, как нам будет угодно, производя разнообразные манипуляции с субъектами во всевозможных позах.
__________________
while(live()) { hope(); }

Старый 18.05.2018, 03:45
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 20  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от Appleman Посмотреть сообщение
Я с тобой тут поспорю. Во-первых, условия могут отличаться как количественно, так и качественно. В твоём варианте получается, что любое количественное изменение (сила не 5, а 10) - это появление нового экземпляра
Да, всё верно, это будет новое условие. (Новая запись в таблице)

Цитата:
Сообщение от Appleman Посмотреть сообщение
Или ты предлагаешь воссоздавать в Condition все свойства проверяемого объекта и устанавливать значения для тех, которые должны быть проверены? Там ещё экипированные предметы, статус-эффекты и хрен знает что ещё.
Да. У тебя же характеристики персонажа не являются отдельными сущностями, они у тебя - свойства Character. Вот если-бы у тебя характеристики были отдельными сущностями, как например:
Код:
class Attribute {
    var id:Uint;
    var value:Number;
}
class AttributeData {
    var id:Uint;
    var min:Number;
    var max:Number;
    var name:String;
}
То тогда бы ты мог добавить отдельное под. условие:
Код:
class ConditionAttribute {
    var id:Uint; // ID Записи.
    var condition:Uint; // ID Условия, к которому относится эта запись.
    var minValue:Number;
    var maxValue:Number;
}
Аналогично для условий по эффектам, предметам или любым другим сущностям. Получается, что Condition может содержать в себе несколько ConditionAttribute, ConditionItem и т.п.

Цитата:
Сообщение от Appleman Посмотреть сообщение
Во-вторых, при таком подходе имеем туеву хучу плохо читаемых объектов. Как потом разбираться, что из себя представляет Condition id8 или id28? Imho, запись вроде {IDs.PLAYER, IDs.PROP_STRENGTH, 15} читается лучше.
Если заполнение в блокноте становится слишком сложным - пишется админка.

Цитата:
Сообщение от Appleman Посмотреть сообщение
В-третьих, я не совсем понял, откуда метод, выполняющий проверку условия id8 "знает", что свойство minStrength в экземпляре Condition связано именно со свойством _strength персонажа, а не с каким-нибудь другим?
Condition относится к Character, поэтому повторяет все его свойства, по которым нужно что-то проверить. ConditionItem будет иметь свойства для сравнения Item, ConditionEffect - Effect.
__________________
Дети не должны знать о своих родителях

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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