Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2015, 14:35   #11
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Serg-Grin Посмотреть сообщение
Croessmah, подскажите а как сделать для каждого одинакового предмета свое состояние?
Ну, можно через структуры. Можно и через классы. Смотря, чего Вы хотите добиться. Я, вот сделал-бы класс. Там, хотя-б ы можно рализацию скрытую сделать. Но, в любом случае, Вам решать. Юзики в экзешнике всё равно копаться не будут. Работает и ладушки.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 19.09.2015, 21:29   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Давайте сначала узнаем какой язык...
waleri вне форума Ответить с цитированием
Старый 19.09.2015, 21:45   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Давайте сначала узнаем какой язык...
В топе темы паскаль.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.12.2015, 01:27   #14
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Сделайте несколько массивов. Один - база - у Вас уже есть. Теперь сделайте инвентарь скажем на 20 предметов. И в цикле каждому элементу присвойте предмет "нет предмета", то есть просто пусто. Когда покупаете или находите предмет просто копируете (присваиваете) его из базы в инвентарь. Аналогично для торговцев. Аналогично для куклы персонажа, чтобы одевать предмет.
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 14.12.2015, 06:34   #15
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

apromix, не очень грамотный подход, имхо, и вот почему - при переносе вещей из инвентаря в сундук (это для примера, а суть будет для любых движений объектов та же самая) получится необходимо копировать вещи как записи туда сюда, по факту создавая разные экземпляры одной и той же вещи в разных местах, потом удалять из источника и прочий оверхед. Особенно больно будет, когда к вещи добавится характеристика и копирование придётся модифицировать по всем местам в коде (где-то можно, конечно, поработать через память, для унификации, но это не всегда спасёт, например со строками, с которыми потом может получиться множественная финализация), либо писать набор функций копирования, учитывающий специфики разных "инвентарей"-хранилищ.
Весело также будет при вводе понятий характеристики конкретной вещи (экземпляра), которых нет в характеристиках базовой вещи, например, прочность, суффиксы, сокеты и вставки, заряды(чарджи), "патроны", чанты, гравировки, крафты - их обработка должна быть выстроена в отдельной логической манере. Об этом и спрашивает автор.
Отсюда выходит простой принцип - базовая вещь и конкретная вещь - разные системы, и писать одну через другую не стоит (не в смысле что они не связаны, а в смысле, что одно - не подмножество другого, между ними скорее понятие агрегации), а лучше писать работу с базовыми вещами в одном месте - это будет некое хранилище эталонов, а работу с конкретными вещами отдельно, каждая вещь лежит (и управляется) в одном экземпляре в некоей коллекции, а в игровых инвентарях на неё ссылка, и эта ссылка просто гуляет туда сюда, из инвентаря персонажа в инвентарь торговца при продаже.

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

Последний раз редактировалось phomm; 14.12.2015 в 06:38.
phomm вне форума Ответить с цитированием
Старый 14.12.2015, 08:16   #16
Virtuallab
Пользователь
 
Регистрация: 03.08.2012
Сообщений: 38
По умолчанию

Предложение: если этого ещё нет, добавить в Predmets[] свойство, характеризующее на какую часть тела данный предмет одевается. Например: 0-голова (головной убор), 1-голова (корона, подшлемник), 2-Голова(для морды лица: маска, очки), 3-шея, 4-грудь, 5-спина (для плаща) и т.д. Здесь желательно определиться, будут ли рюкзаки, сумки, кошели привязываться к какой либо части тела. Будет проще с куклой. Про голову можно так не заморачиваться, если предполагается одевание на нее одной только вещи, но если думать о перспективе развития ...
Необходимо сразу определиться с вопросами:
1. Предполагается ли ремонт вещей?
2. Сдавать вещь торговцу только отремонтированную или можно изношенную?

Согласен с apromix'ом насчет массивов. Должен быть базовый массив вещей (эталонный) и те, что попадут в save: массивы торговцев (содержащие ограниченные перечни дескрипторов из базового массива) и для тех вещей, которые у игрока.
Понятно, что у предметов игрока со своими уникальными дескрипторами должна быть ссылка на дескриптор базовой вещи (для оценки процента износа её и, соответственно, цены сдачи торговцу или до какой величины восстанавливать её состояние при ремонте, если он предполагается). А после продаже торговцу конкретная вещь возвращает свой базовый дескриптор. Но тут возникает вопрос по сокетам, как предупреждал тов. phomm. Дефолтное обнуление сокетов при возврате к торговцу?
Virtuallab вне форума Ответить с цитированием
Старый 15.12.2015, 14:38   #17
Serg-Grin
Дивиджей
Пользователь
 
Аватар для Serg-Grin
 
Регистрация: 05.01.2009
Сообщений: 84
По умолчанию

apromix, у меня по началу так реализовано как Вы написали.
Есть рынок, там я покупаю вещи, если ячейка рюкзака пуста то он добавляется туда. При создании формы создаются все предметы вещей в массиве, которые будут использоваться в игре.

Код:
Const
MaxThings = 128; // примерно
var
Things: array [1..MaxThings] of TBitmap;
Дальше в создании формы описываю каждый предмет с его характеристикой. Как написано в первом посту.
При покупке вещи на рынке пишу следующий код:

Код:
var
ID: integer; // номер вещи
begin
if (rukzak[i]=0) and (Hero.Gold>=Vesh[VeshID].Gold) then
Hero.Gold:=Hero.Gold-Vesh[VeshID].Gold;
rukzak[i]:=ID;
так в свободный слот добавляется вещь с определенной картинкой и состоянием.
Но проблема состоит в том, если я покупаю вещь допустим (Кожаный шлем) она у меня идет из базы текстур под номером 1. И есть состояние как для неё так и для всех остальных вещей.
Но если я куплю две одинаковые вещь этот же самый (Кожаный шлем), то при проигрыше в бою состояние уменьшится у двоих этих же вещей.
Так как писал Croessmah

Цитата:
Да тут, походу у ТС в инвентаре "дескрипторы" предметов, сами предметы лежат где-то в массиве, в единственном экземпляре, то есть если у персонажа два одинаковых предмета, то у них один и тот же дескриптор (например указатель на предмет или индекс в массиве), поэтому, если изменяется один предмет, то у него изменяются и другие такие же. Я так понял
И вот. Как можно сделать состояние вещей отдельным объектом?
Цитирую

Цитата:
Каждый купленный предмет должен быть отдельным объектом и тогда изменения его свойств не будет затрагивать другие копии этого предмета.
Заранее спасибо.
Впишите в google:
DVJ Serg-Grin
И вы услышите мои песни
Serg-Grin вне форума Ответить с цитированием
Старый 15.12.2015, 20:02   #18
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Если нужна прочность у предметов, то алгоритм модифицируется элементарно просто: добавляется 1 свойство durability, и при присваивании из базы в эту переменную заносится число из maxdurability записи предмета из базы (ну или там число немного меньшее maxdurability, если предмет не покупается у торговца, а, скажем, его нашли и он немного поврежден).

Я наведу примерный код:
Код:
type
  // Предмет-шаблон для базы
  TBaseItem = record
    ...
    MaxDurability: Byte; // Прочность целого предмета
    ...
  end;

type
  // Предмет в инвентаре, на полу или одетый на игрока
  TItem = record
    ...
    Durability: Byte; // Текущая прочность предмета
    MaxDurability: Byte; // Прочность целого предмета
    ...
  end;
Вот мы нашли предмет и решили взять себе, значит добавляем его в пустую ячейку инвентаря:

Код:
Inv[I] := BaseItems[ID]; // ID - это ID предмета в базе
Inv[I].Durability := BaseItems[N].MaxDurability - (BaseItems[N].MaxDurability div 10);
Обращайтесь в скайп - помогу с радостью!
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 15.12.2015, 20:11   #19
Serg-Grin
Дивиджей
Пользователь
 
Аватар для Serg-Grin
 
Регистрация: 05.01.2009
Сообщений: 84
По умолчанию

apromix, спасибо Вам большое. Теперь мне всё стало ясно) +
Впишите в google:
DVJ Serg-Grin
И вы услышите мои песни
Serg-Grin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет числа предметов в расписании уроков Polly_Panika Microsoft Office Access 5 27.03.2014 10:14
Сортировка предметов (Delphi) grongost Помощь студентам 1 07.09.2011 23:57
Разделение предметов по весу niki123 Общие вопросы C/C++ 13 04.04.2011 12:13
Структура данных для хранения предметов L_M Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 15.11.2010 21:08
Задача на С++. формирование выбора предметов Veina Помощь студентам 9 23.12.2009 00:39