Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 13.12.2012
Сообщений: 102

Как задавать свойства предметов в инвентаре и передавать их персонажу?

17.09.2014, 11:51. Показов 1146. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Продолжаю работу над созданием инвентаря к игре. Реализовал базовый инвентарь, который состоит из слотов, в которые помещаются базовые предметы. Реализовал удаление, добавление, замену, drag-and-drop и пр.
Я реализовал класс инвентаря-сумки и инвентаря-надетых вещей. Между ними реализованы все операции. Теперь думаю над тем, как наделить каждый предмет так сказать индивидуальностью.
Есть базовый класс Item. Каждый предмет имеет свойства
ActionScript 3
1
2
3
4
5
private var itemID:uint;//ID в некой таблице предметов
private var price:uint;//цена
private var description:String = "Обычный предмет";//Описание     
private var typeItem:String;//Тип предмета, например, = "armor"
private var imageName:String;//Путь к изображению для иконки предмета
При создании экземпляра класса задается только itemID
ActionScript 3
1
2
3
4
5
public function Item(_itemID:uint) 
{
    itemID = _itemID;
    init();
}
В init() каким-то образом по itemID должны задаваться остальные свойства. Наверное, из какого-нибудь внешнего файла или БД подгружать нужно. Я пока делаю тупо в классе, причем не заморачиваюсь и делаю ни для каждого itemID, а для диапазона
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
if (itemID >= 0 && itemID < 1999)
{
    typeItem = "Armor";
    imageName = "armor.jpg";
    price = 100;
    description = "Хорошая броня. Стоимость: " + String(price) + ". Вес: " + weight;
}
    else if (itemID >= 2000 && itemID < 3999)
    {
        typeItem = "Gun";
        ...
    }
    else if ...
это временно. Потом буду думать как инициализировать по конкретному itemID.
Более важный для меня вопрос состоит в том, как предмет должен передавать свои свойства игровому персонажу при надевании.

Например, персонаж обладает рядом характеристик: жизнь, броня, урон, крит, уворот и пр.
Я надеваю на него броню, которая обладает характеристиками: жизнь, броня. При надевании как-то должны измениться характеристики персонажа. Я могу, конечно сделать что-то вроде персонаж.setHP(armorHP) и т.д. для каждой из характеристик. А если у всех предметов разные характеристики? Например, один щит повышает только здоровье, а другой повышает броню и уворот. Как это реализовывать? Я плохо представляю себе как реализовать класс персонажа и надевание на него предметов. Сами надетые предметы находятся в классе инвентаря-надетых вещей. Резюмирую:
1. Как наделить каждый предмет индивидуальностью? Нужно создавать для каждого предмета свой класс?
2. А если предметов сотни? У меня возникала идея воспользоваться декоратором. Правда, не знаю что из этого выйдет.
3. Или же каждому предмету задавать полный набор характеристик: жизнь, броня, урон, крит, уворот, и если предмет добавляет только броню, то остальные приравнять нулю.
4. Как собственно создать класс персонажа, чтобы в нем была информация пусты ли слоты инвентаря-надетых вещей, и чтобы добавлять характеристики надетых вещей.
5. Есть ли у кого-нить рабочий пример? Гуглил по-русски - не нашел ничего. А на англоязычных искать не получается. Если кто готов поделиться своими разработками (хотя бы в личку), то я буду очень признателен. Хочется просто увидеть, как это делается у грамотных людей. Хотя бы какие-то базовые вещи.

Добавлено через 24 минуты
Впрочем,
6. как инициализировать предмет по конкретному itemID? Откуда грузить? Хранить в БД таблицу всех предметов? Как хранить характеристики предметов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2014, 11:51
Ответы с готовыми решениями:

Вращение предметов в инвентаре
Привет меня интересует ваше мнение: как можно реализовать вращение предметов в инветаре при наведение на них мышкой пример из игры...

Скрипт, которым можно задавать свойства печати.
Набо бы скрипт, по которому печать документа производилась. но не просто window.print();! надо предварительно задать настройку, чтоб...

Как задавать строковую переменную? 2) Как задавать рандом?
У меня собственно два вопроса. 1) Как задавать строковую переменную? (string - пишет, что нет такого) 2) Как задавать рандом?

6
 Аватар для Theoryofgames
254 / 238 / 50
Регистрация: 20.12.2011
Сообщений: 707
17.09.2014, 12:42
В классе Character будет массив одетых предметов, например
ActionScript 3
1
var equipped:Vector.<Item> = new Vector.<Item>;
У персонажа есть внутренний метод, который пересчитывет характеристики всех надетых предметов
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
private function updateScore() : void
{
  var totalHealthBonus:int = 0;
  var totalManaBonus:int = 0;
  for each (var item:item in equipped)
  {
    health += item.healthBonus;
    mana += item.manaBonus;
  }
  // обновляем данные персонажа
  allEquipedHealthBonus = health;
  allEquipedManaBonus = mana
}
Этот метод вызывается каждый раз, когда вы снимаете или одеваете вещь
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
public function equipItem(item:Item) : void
{
  if (equipped.indexOf(item) >= 0) return;
  equipped.push(item);
  updateScore();
}
public function removeItem(item:Item) : void
{
  var index:int = equipped.indexOf(item);
  if (index == -1) return;
  equipped.splice(index, 1);
  updateScore();
}
И напоследок - у класса Item есть геттеры healthBonus и manaBonus.

В массиве equipped будет лежать ссылка на экземпляр класса, а экземпляр класса по своей сути индивидуален.
1
1 / 1 / 0
Регистрация: 13.12.2012
Сообщений: 102
17.09.2014, 13:14  [ТС]
Theoryofgames, спасибо за общую схему. Однако, остались вопросы
Цитата Сообщение от agiliter Посмотреть сообщение
1. Как наделить каждый предмет индивидуальностью? Нужно создавать для каждого предмета свой класс?
2. А если предметов сотни? У меня возникала идея воспользоваться декоратором. Правда, не знаю что из этого выйдет.
3. Или же каждому предмету задавать полный набор характеристик: жизнь, броня, урон, крит, уворот, и если предмет добавляет только броню, то остальные приравнять нулю.
Цитата Сообщение от agiliter Посмотреть сообщение
6. как инициализировать предмет по конкретному itemID? Откуда грузить? Хранить в БД таблицу всех предметов? Как хранить характеристики предметов?
0
 Аватар для Theoryofgames
254 / 238 / 50
Регистрация: 20.12.2011
Сообщений: 707
17.09.2014, 14:29
Цитата Сообщение от agiliter Посмотреть сообщение
1. Как наделить каждый предмет индивидуальностью? Нужно создавать для каждого предмета свой класс?
ActionScript 3
1
2
var helmet1:Helmet = new Helmet();
var helmet2:Helmet = new Helmter();
у Вас есть 2 шлема, оба уникальны, вы можете экипировать один из них. Можете дописать метод equipItem так, чтобы он проверял одета ли вещь данного типа и если одета, то снимал ее, тогда будет примерно следующее:
ActionScript 3
1
2
equipItem(helmet1); // одет первый шлем
equipItem(helmet2); // первый шлем снят, одет второй
Цитата Сообщение от agiliter Посмотреть сообщение
А если предметов сотни?
Что это изменит? одновременно у Вас может быть одета только 1 вещь определенно типа (ну или n-noe количество - например кольца).
Цитата Сообщение от agiliter Посмотреть сообщение
3. Или же каждому предмету задавать полный набор характеристик: жизнь, броня, урон, крит, уворот, и если предмет добавляет только броню, то остальные приравнять нулю.
Это вопрос реализации - вообще при инициализации предмета вы можете отдавать ему некие данные (которые уже не будут меняться).
ActionScript 3
1
2
var helmet1:Helmet = new Helmet({healthBonus:5, manaBonus:5});
var helmet2:Helmet = new Helmter({healthBonus:10});
Теперь первый шлем и второй шлем дают разные прибавки к статам (естественно все это должнеог быть обработано в конструкторе). Базjовый класс Item будет содержать геттеры на общие св-ва (например бонус жизни, бонус маны), а в наследуемвых классах Вы можете дописывать различные геттеры (например у класса Щит будет геттер на шанм блока).
Цитата Сообщение от agiliter Посмотреть сообщение
6. как инициализировать предмет по конкретному itemID? Откуда грузить? Хранить в БД таблицу всех предметов? Как хранить характеристики предметов?
Если Вам нужны предметы, которое не генерируются автоматичски по какому-то закону, то да, нужно будет хранить все такие предметы в базе данных (можно хранить ее в клиенте, можно на сервере, зависит от реализации и требованиям к безопасности).
хранить можно примерно в след виде:
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
  {
     id:0,
     type:0, // шлем
     reqLevel:5,
     healthBonus:10,
     manaBonus:10
  },
  {
    id:1,
    type:1, // перчатки
    reqLevel:10,
    healthBonus:20,
    manaBonus:20
  }
]
тогда в конструктор вы можете отдавать этот массив с данными и там он уже будет обрабатываться
0
1 / 1 / 0
Регистрация: 13.12.2012
Сообщений: 102
17.09.2014, 16:29  [ТС]
Цитата Сообщение от Theoryofgames Посмотреть сообщение
ActionScript 3
1
2
var helmet1:Helmet = new Helmet();
var helmet2:Helmet = new Helmte();
Я имел ввиду не как создавать два уникальных экземпляра класса, а стоит ли делать вообще отдельные классы для каждого предмета. И в таком случае натыкался на вопрос что делать, если их сотни. В целом, Вы натолкнули меня на мысль ограничиться только общими классами-наследниками (щит, меч и т.д.)
Цитата Сообщение от Theoryofgames Посмотреть сообщение
хранить можно примерно в след виде:
[
{
id:0,
type:0, // шлем
reqLevel:5,
healthBonus:10,
manaBonus:10
},
{
id:1,
type:1, // перчатки
reqLevel:10,
healthBonus:20,
manaBonus:20
}
]
тогда в конструктор вы можете отдавать этот массив с данными и там он уже будет обрабатываться
Я и хотел сначала заворачивать всё в json. Однако возникла проблема. Например, мне нужно хранить предмет
JSON
1
2
3
4
5
6
7
{
 id:0,
 type:0, // шлем
 reqLevel:5,
 healthBonus:10,
 manaBonus:10
 }
и предмет
JSON
1
2
3
4
5
6
7
{
 id:1,
 type:1, // перчатки
 reqLevel:10,
 healthBonus:20,
 chanceBlock:7
 }
Я, например, не знаю как можно будет потом всё это извлекать из строки json, не зная заранее какие поля есть у каждого объекта.
0
 Аватар для Theoryofgames
254 / 238 / 50
Регистрация: 20.12.2011
Сообщений: 707
17.09.2014, 18:06
var data
Цитата Сообщение от agiliter Посмотреть сообщение
, например, не знаю как можно будет потом всё это извлекать из строки json, не зная заранее какие поля есть у каждого объекта.
например getter может выглядеть так
ActionScript 3
1
public function get healthBonus() : int { return data.hasOwnProperty("healthBonus") ? data["healthBonus"] : 0; }
хотя на самом деле если вы сделаете геттер следующим образом, то он будет аналогичен предыдущему
ActionScript 3
1
public function get healthBonus() : int { return data["healthBonus"]; }
Если не будет поля "healthBonus", то data["healthBonus"] будет равно null, а автоматическое приведение типов приравняет результат к 0, но лучше не использовать автоматическое приведение, так как оно чревато ошибками.
0
Модератор
 Аватар для TanaTiX
2936 / 1795 / 180
Регистрация: 19.02.2011
Сообщений: 6,552
17.09.2014, 21:54
Цитата Сообщение от agiliter Посмотреть сообщение
Я имел ввиду не как создавать два уникальных экземпляра класса, а стоит ли делать вообще отдельные классы для каждого предмета.
Почему бы не отличать id предмета от id типа предмета. Это свойство можно вынести в отдельный класс, от которого бы наследовались другие.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2014, 21:54
Помогаю со студенческими работами здесь

JTree. Каким образом при добавлении ветки в дерево можно задавать свойства этой ветки
День добрый. По служебным целям понадобилось программу написать. Яву раньше почти не использовал. Так вот, вопрос такой: каким образом при...

Не понимаю как сделать управление персонажу 3D
Я расскажу как я понимаю, а вы будьте добры объясните на пальцах. Для начала нужно создать переменную скорости, с какой скоростью...

Как удалить объект по тегу не по очереди, а по расстоянию к персонажу?
В общем, есть два сундука. Они оба как префабы. Персонаж имеет возможность эти сундуки открыть. На сундуках висят триггеры, при вхождении в...

Известна масса каждого из 12 предметов, определить общую массу всего набора предметов
известна масса каждого из 12 предметов определить общую массу всего набора предметов ?

Известна масса каждого из 12 предметов, определить общую массу всего набора предметов
Известна масса каждого из 12 предметов. Определить общую массу всего набора предметов.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru