![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 12
|
Привет!
Делаю пошаговую флэш-игрушку. С as3 только знакомлюсь. Встал вопрос по поводу того, как грамотно хранить пользовательские данные в экшнскрипте. Представьте, у меня есть мышки. У мышек есть инвентарь и скин. Игрок Имя. Доступные скины Инвентарь Вася Белый, Веселый, Зомби Книжка Толя Белый, Шаман (ничего) Скин Скин Действие Картинка Белый Бежит asdfsadfvvv.png Белый Сидит gfhjfgjhgjgh.png Белый Чихает etywreetwe.png Игра Имя. Скин. Вася Белый Толя Шаман Оля Кролик Вот подскажите пожалуйста, как бы мне хранить такую структуру лучше? Ясно что один игрок конкретный - это Object. UserVasya.name = "Вася"; UserVasya.skin = "White"; UserVasya.actionRun.png = "asdfsadfvvv.png"; Но как бы вместо UserVasya использовать просто User["Vasya"], получать по ключу "name" нужный параметр? В общем, нужен ассоциативный массив. Хочется что-то вроде такого: Спасибо заранее. |
|
|||||
|
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
Цитата:
|
|
|||||
|
Да, то есть тут принцип не выбирать структуру и разбрасывать по всему проекту код, который в этой структуре что-то ищет, а по нашему, по ООП-шному сделать класс "Инвентарь", и добавить в него методы для доступа и _поиска_ объектов. А что он там будет внутри использовать - это решите по ходу. У нас например часто одновременно массив и пара хешей (Object или Dictionary) используется одновременно.
Например, Надо взять у инвентаря объект по типу. Нет проблем - добавляем метод getItemByType(type:String):Item Надо взять список объектов - добавляем метод get items():Vector.<Item> Надо найти все неактивные объекты - добавляем метод getActiveItems():Vector.<Item> Надо найти все объекты с уровнем больше 5, добавляем метод getItemsWithLevel5... СТОП! Стираем нафиг оба метода getActiveItems():Vector<Item> и getItemsWithLevel5, а лепим один getFilteredItems(filter:Function):Vector.<Items> И т.д. А как внутри реализовать - решаем уже в зависимости от того, какие методы появились у Inventory. Эта реализация может даже меняться с развитием игры. Ещё же: надо диспетчить события при добавлении итемов в инвентарь наверно? Т.е. специальные методы делаем для добавления и удаления addItem(item) и removeItem(itemType), с голыми структурами пришлось бы самому диспетчить или вьюшку обновлять. Хотя! Если опыта с активной моделью нет - лучше наверно оставить данные просто данными, реализовать минимум функционала, не диспетчить ничего внутри этих классов. Может просто для типизации и пары методов поиска создать классы. Тут как-бы лучше иметь размазанная логика работы с моделью по всему приложению + модель без логики чем размазанная логика работы с моделью по всему приложению + неадекватная логика в модели Последний раз редактировалось expl; 17.02.2012 в 21:58. |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 12
|
Спасибо обоим за очень хорошие ответы и типизированный профиль с геттерами и сеттерами, но тем не менее, в игрушке есть особенность - надо хранить до фига пользователей в памяти. И у каждого есть инвентарь, имя, настроение и куча других данных. Не задумывайтесь сильно над метафорой, пожалуйста.
Окей, типизированный профиль у нас есть, но теперь мне нужна прорва таких профилей и возможность обратиться к каждому из них по определенному имени в виде стринга, например, то есть мне нужен ассоциативный массив объектов. Вроде бы. // не настоящий as3, просто идея.
// увидели нового (зашел в комнату, прибежал):
User["tolik"]:MyGameUser = new MyGameUser (get_profile_from_server());
// используем его потом
DrawUserSkin(user:string){ User[user].GetCurrentSkinPng()};
// выкидываем определенного
User["tolik"].destroy();
Просто правда инвентарь и харакеристики хотелось бы иметь именно как модель в которой просто хранятся данные (поиск особо и не нужен), а что конкретно с ним делать, как добавлять пользователей, какие данные вытягивать при каких событиях - это решает вышестояший контроллер. Последний раз редактировалось mooncar; 01.03.2012 в 19:51. |
|
|||||
|
Модрон-ветеринар
|
cuteblondie, псевдокод тоже лучше оформлять тегами.
__________________
Идите первым! |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Ассоциативный массив с ключом строкой - Object. С ключом целым числом (по крайней мере может без особых зазрений так использоваться) - Array. С ключом-чем угодно - Dictionary. Последний лучше всего использовать с ключом-ссылкой на обьект, ну да он вам вроде не нужен.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 12
|
И все-таки, уже голова сломалась
![]() Как хранить такую структуру? Где пользователей и уникальных идентификаторов может быть сколько угодно, чтобы обращаться к ним как-то так: xx = User["billgates@microsoft.com"].age; ? |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 12
|
P.S. as3 object идеально справляется с одним
но у меня-то их целая толпа и новые периодически записываются, причем обращаться нужно по уникальному id. |
|
|||||
|
Господи, что же вы воротите то.
Используйте что-то вроде этого: class Main{ private var _userList : UserList = new UserList(); public function Main(){ var steveJobsId : String = "stevejobs@apple.com"; _userList.addUser(new User("billgates@microsoft.com", 56, "Bill Gates", "doesnt like pies")); _userList.addUser(new User(steveJobsId, 58, "Steve Jobs", "favourite dish - big macs")); trace(_userList.getUserById(steveJobsId)); //stevejobs@apple.com : Steve Jobs } } internal class UserList{ private var _users : Vector.<User> = new Vector.<User>(); public function UserList(){ } public function getUserById(id : String):User{ var numUsers : uint = _users.length; var user : User; while(numUsers--){ var currentUser : User = _users[numUsers]; if(currentUser.id == id){ user = currentUser; break; } } return user; } public function addUser(user : User):void{ _users.push(user); } } internal class User{ private var _id : String; private var _age : uint; private var _name : String; private var _notes : String; public function User(id : String, age : uint, name : String, notes : String){ _id = id; _age = age; _name = name; _notes = notes; } public function toString():String{ return _id + " : " + _name; } public function get notes():String { return _notes; } public function get name():String { return _name; } public function get age():uint { return _age; } public function get id():String { return _id; } }
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. Последний раз редактировалось ChuwY; 10.03.2012 в 02:39. |
|
|||||
|
Чем свой плох?
Можно добавить выборку по любому полю. И все инкапсулировано в логичную абстракцию -- список юзеров. Если айдишник действительно уникален, а пробежка по вектору так режет вам глаз, то пусть заведет хэш с парами ключ -- ид, а значение -- индекс в векторе. Но придется обновлять этот хэш при удалении-добавлении объектов. Зато если нужно получить целиком список персонала, то вектор будет удобнее.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:04. |
|
|
« Предыдущая тема | Следующая тема » |
|
|