Форум программистов, компьютерный форум, киберфорум
Наши страницы
ActionScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/2: Рейтинг темы: голосов - 2, средняя оценка - 5.00
agiliter
1 / 1 / 0
Регистрация: 13.12.2012
Сообщений: 102
1

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

17.09.2014, 11:51. Просмотров 430. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2014, 11:51
Ответы с готовыми решениями:

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

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

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

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

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

6
Theoryofgames
253 / 237 / 50
Регистрация: 20.12.2011
Сообщений: 707
17.09.2014, 12:42 2
В классе 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
agiliter
1 / 1 / 0
Регистрация: 13.12.2012
Сообщений: 102
17.09.2014, 13:14  [ТС] 3
Theoryofgames, спасибо за общую схему. Однако, остались вопросы
Цитата Сообщение от agiliter Посмотреть сообщение
1. Как наделить каждый предмет индивидуальностью? Нужно создавать для каждого предмета свой класс?
2. А если предметов сотни? У меня возникала идея воспользоваться декоратором. Правда, не знаю что из этого выйдет.
3. Или же каждому предмету задавать полный набор характеристик: жизнь, броня, урон, крит, уворот, и если предмет добавляет только броню, то остальные приравнять нулю.
Цитата Сообщение от agiliter Посмотреть сообщение
6. как инициализировать предмет по конкретному itemID? Откуда грузить? Хранить в БД таблицу всех предметов? Как хранить характеристики предметов?
0
Theoryofgames
253 / 237 / 50
Регистрация: 20.12.2011
Сообщений: 707
17.09.2014, 14:29 4
Цитата Сообщение от 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
agiliter
1 / 1 / 0
Регистрация: 13.12.2012
Сообщений: 102
17.09.2014, 16:29  [ТС] 5
Цитата Сообщение от 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
253 / 237 / 50
Регистрация: 20.12.2011
Сообщений: 707
17.09.2014, 18:06 6
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
Модератор
2798 / 1652 / 168
Регистрация: 19.02.2011
Сообщений: 6,011
Завершенные тесты: 2
17.09.2014, 21:54 7
Цитата Сообщение от agiliter Посмотреть сообщение
Я имел ввиду не как создавать два уникальных экземпляра класса, а стоит ли делать вообще отдельные классы для каждого предмета.
Почему бы не отличать id предмета от id типа предмета. Это свойство можно вынести в отдельный класс, от которого бы наследовались другие.
0
17.09.2014, 21:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2014, 21:54

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

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

В массиве хранятся сведения о стоимости 12 различных предметов. Определить общую стоимость всех предметов
В массиве хранятся сведения о стоимости 12 различных предметов. Определить общую стоимость всех...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru