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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.02.2012, 20:21
cuteblondie вне форума Посмотреть профиль Отправить личное сообщение для cuteblondie Найти все сообщения от cuteblondie
  № 1  
Ответить с цитированием
cuteblondie

Регистрация: Feb 2012
Сообщений: 12
Question Оптимальное хранение пользовательских данных: Dictionary, Array, Object

Привет!

Делаю пошаговую флэш-игрушку. С as3 только знакомлюсь.

Встал вопрос по поводу того, как грамотно хранить пользовательские данные в экшнскрипте.
Представьте, у меня есть мышки. У мышек есть инвентарь и скин.

Игрок
Имя. Доступные скины Инвентарь
Вася Белый, Веселый, Зомби Книжка
Толя Белый, Шаман (ничего)

Скин
Скин Действие Картинка
Белый Бежит asdfsadfvvv.png
Белый Сидит gfhjfgjhgjgh.png
Белый Чихает etywreetwe.png


Игра
Имя. Скин.
Вася Белый
Толя Шаман
Оля Кролик


Вот подскажите пожалуйста, как бы мне хранить такую структуру лучше?
Ясно что один игрок конкретный - это Object.

UserVasya.name = "Вася";
UserVasya.skin = "White";
UserVasya.actionRun.png = "asdfsadfvvv.png";

Но как бы вместо UserVasya использовать просто User["Vasya"], получать по ключу "name" нужный параметр? В общем, нужен ассоциативный массив.

Хочется что-то вроде такого:
Код AS3:
User["Толик"].Skin["Белый"].Action["Run"].Png;
Спасибо заранее.

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

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Цитата:
Сообщение от cuteblondie Посмотреть сообщение
Хочется что-то вроде такого:
Код AS3:
User["Толик"].Skin["Белый"].Action["Run"].Png;
— это отстой, вам этого не хочется на самом деле. Создайте типизированный профиль и работайте с ним

Код AS3:
public class Profile{
  public function get skin(){
    return _skin;
  }
}
 
public class Skin{
  public function get actions():Object{
    return {run:actionRun};
  }
  public function getActionByType(type:String):Action{
 
  }
}
 
public function getProfileByName(name:String):Profile{
//...
}

Старый 17.02.2012, 21:51
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Да, то есть тут принцип не выбирать структуру и разбрасывать по всему проекту код, который в этой структуре что-то ищет, а по нашему, по ООП-шному сделать класс "Инвентарь", и добавить в него методы для доступа и _поиска_ объектов. А что он там будет внутри использовать - это решите по ходу. У нас например часто одновременно массив и пара хешей (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.
Старый 01.03.2012, 19:35
cuteblondie вне форума Посмотреть профиль Отправить личное сообщение для cuteblondie Найти все сообщения от cuteblondie
  № 4  
Ответить с цитированием
cuteblondie

Регистрация: Feb 2012
Сообщений: 12
Спасибо обоим за очень хорошие ответы и типизированный профиль с геттерами и сеттерами, но тем не менее, в игрушке есть особенность - надо хранить до фига пользователей в памяти. И у каждого есть инвентарь, имя, настроение и куча других данных. Не задумывайтесь сильно над метафорой, пожалуйста.

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


Код:
// не настоящий as3, просто идея.

// увидели нового (зашел в комнату, прибежал):
  User["tolik"]:MyGameUser = new MyGameUser (get_profile_from_server());

// используем его потом
  DrawUserSkin(user:string){  User[user].GetCurrentSkinPng()};

// выкидываем определенного
  User["tolik"].destroy();
Что-то такое. В общем, главный затык в том, как по имени пользователя получить объект со всеми его характеристиками. Во AS3 наверняка должен быть какой-нибудь встроенный механизм для работы с такими вещами..

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


Последний раз редактировалось mooncar; 01.03.2012 в 19:51.
Старый 01.03.2012, 19:51
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 5  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
cuteblondie, псевдокод тоже лучше оформлять тегами.
__________________
Идите первым!

Старый 01.03.2012, 19:59
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 6  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Ассоциативный массив с ключом строкой - Object. С ключом целым числом (по крайней мере может без особых зазрений так использоваться) - Array. С ключом-чем угодно - Dictionary. Последний лучше всего использовать с ключом-ссылкой на обьект, ну да он вам вроде не нужен.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 10.03.2012, 02:18
cuteblondie вне форума Посмотреть профиль Отправить личное сообщение для cuteblondie Найти все сообщения от cuteblondie
  № 7  
Ответить с цитированием
cuteblondie

Регистрация: Feb 2012
Сообщений: 12
И все-таки, уже голова сломалась

Как хранить такую структуру?

Код:
billgates@microsoft.com
    name: Bill Gates
    age: 56
    notes: doesn't like pies

stevejobs@
    name: Steve Jobs
    age: 58
    favourite dish: big macs
Где пользователей и уникальных идентификаторов может быть сколько угодно, чтобы обращаться к ним как-то так: xx = User["billgates@microsoft.com"].age; ?

Старый 10.03.2012, 02:26
cuteblondie вне форума Посмотреть профиль Отправить личное сообщение для cuteblondie Найти все сообщения от cuteblondie
  № 8  
Ответить с цитированием
cuteblondie

Регистрация: Feb 2012
Сообщений: 12
P.S. as3 object идеально справляется с одним

Код AS3:
var UserSteve:Object = new Object;
UserSteve.name = "Steve";
UserSteve.age = 58;
 
trace(UserSteve.age);
но у меня-то их целая толпа и новые периодически записываются, причем обращаться нужно по уникальному id.

Старый 10.03.2012, 02:37
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 9  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Господи, что же вы воротите то.

Используйте что-то вроде этого:

Код AS3:
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.
Старый 10.03.2012, 02:46
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 10  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Чем свой плох?
Можно добавить выборку по любому полю.
И все инкапсулировано в логичную абстракцию -- список юзеров.
Если айдишник действительно уникален, а пробежка по вектору так режет вам глаз, то пусть заведет хэш с парами ключ -- ид, а значение -- индекс в векторе. Но придется обновлять этот хэш при удалении-добавлении объектов.
Зато если нужно получить целиком список персонала, то вектор будет удобнее.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

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

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

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


 


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


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