Как сделать?

Re: Как сделать?

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

Byte
useravatar
Offline
732 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Byte,
Спасибо.

Вполне себе
useravatar
Offline
45 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Всем привет, Хотел поинтересоваться как сделать проще всего инвентарь?Посмотрел много вариантов скачал много игр на QSP но что более прощее для начинающего?

Lucifer
Новичок
useravatar
Offline
18 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Lucifer,
ХЗ... Я свой писал. Мне стандартный вообще не зашел. С новым КуСП (5.9.1) это вообще просто. Зато функционал любой. И степень "вложенности"
Например так (для снаряжения):
Создаем некий "общий Предмет"

Код:

$Предмет['Название']=''

$Предмет['Картинка']=''
Предмет['Вид']=0 &!(1-кинжал, 2-меч, 3-топор, 4-копье, 5-молот, 6-щит, 7-шлем, 8-наруч, 9-кираса, 10.11...N)
Предмет['Слот']=0 &!(1-прав.рука, 2-лев.рука, 3-прав.плечо, 4-лев.плечо, 5-голова, 6-ноги, 7-грудь, 8.9...N)
Предмет['Владелец']=0 &!(0-в свободном доступе, 1-у игрока в инвентаре, 2-надето, 3-в хранилище, 4-у торговца, 5.6...106...N)
Предмет['Количество']=0 &!(Не всем нужно, но оставил для универсальности)
Предмет['Свойство 1']=0 &!(например Сила удара или Степень защиты)
Предмет['Свойство 2']=0
...
Предмет['Свойство К']=0

Это общий пресет без какой-либо привязки
Затем формируем предмет. Весь инвентарь формируются по простому принципу: НазваниеПредмета_Номер (Снаряжение_0, Снаряжение_1, Снаряжение_2, Зелье_1, Зелье_14... и пр. ). Можно для каждого типа создать свой пересет - кому как нравится. У меня отдельные. Для всяких индивидуальных предметов - свой, для тех, что по счету - свои.
Сначала определяем первый пустой, я вынес в функцию

Код:

# GetFreeID

! Определение первого "свободного" номера в снаряжении (и пр.)
! $Args[0] - Преффикс ('Снаряжение', 'Непись', 'Свиток' и прочее)
Result=0
Local i=0
Local j=Off
Local $SearchStr=''
Loop While j=Off:
  $SearchStr=$Args[0]+'_'+Str(i)
    If ArrType($SearchStr)='':
      j=On
    Else
      I+=1
    End
End
Result=i
--- GetFreeID ---

Дальше все просто:

Код:

NewID=@GetFreeID('Снаряжение')

Функция среди всех массивов "Снаряжение_k" находит первый "неопределенный" и возвращает его номер
Формируем предмет простым копированием стартового пресета

Код:

$NewItem='Снаряжение_'+NewID

CopyArr $NewItem, 'Предмет'

И устанавливаем нужные свойства

Код:

SetVar($NewItem,'Топор','Название')

SetVar($NewItem,'./pic/weapon/axes/axe_1.png','Картинка')
...
SetVar($NewItem,7,'Свойство 1')
...

Лично я все вношу в отдельные функции, так удобнее. Внутри можно описать дополнительный обработчик
Вот как получается у меня - Стартовое получение Меча и Случайной амуниции.

Код:

#Дайте_Меч

Local NewID=@GetFreeID('Снаряжение')
If @Set_Ammo('Снаряжение_<<NewID>>',МЕЧ,ОБЫЧН,-1,0,0,-1)=On:
  $АммоИгрока[]='Снаряжение_<<NewID>>' & !Сразу заполняю массив снаряжения у игрока (это можно вставить в функцию SetSlot, но пока вынесено)
   @SetSlot('Снаряжение_<<NewID>>', ИГР)
End
NewID=@GetFreeID($DataName)
If @Set_Ammo('Снаряжение_<<NewID>>',RAND(0,7),ОБЫЧН,-1,0,0,-1)=On:
  $АммоИгрока[]='Снаряжение_<<NewID>>'
  @SetSlot('Снаряжение_<<NewID>>', ИГР)
End
--- Дайте_Меч ---

Функция Set_Ammo возвращает 1 в случае если все прошло удачно или 0 - при любой неудаче вовремя формирования Снаряжения. Все нужные данные я передаю как параметры функции.
И в конце создаю деструктор Снаряжения - например игрок продал, или потерял, или использовал все под чистую. Чтобы не хранить "пустые" переменные, память не резиновая.

Код:

#KillAmmo

!Очистка массива Снаряжения
If $Args[0]<>'':
  Dynamic('Killvar ''<<$Args[0]>>''
  Killvar ''$<<$Args[0]>>''')
Else
  msg('Имя массива снаряжения не может быть пустым.<br> Проверьте правильность вызыва функции "KillAmmo"')
End
--- KillAmmo ---

Вполне себе
useravatar
Offline
45 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Lucifer,
начни с основ, что называется:
https://aleksversus.github.io/howdo_faq … s/add_item

В этом справочнике много ответов на самые часто задаваемые вопросы, поэтому есть вероятность, что один из этих вопросов даст подсказку, как сделать инвентарь конкретно с твоим уровнем знаний. Особенно рекомендую посмотреть вопросы про многоуровневый рюкзак, считаемые предметы и предметы не в окне предметов.

Aleks Versus
воздвигатель башни
useravatar
Offline
1757 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Вполне себе,
не разбирался в коде, но вот это:

Код:

Dynamic('Killvar ''<<$Args[0]>>''

  Killvar ''$<<$Args[0]>>''')

по идее эквивалентно

Код:

killvar $args[0]

killvar '$<<$args[0]>>'

Т.е. можно и без dynamic. Правда я не понимаю зачем вызывать второй killvar - это один и тот же массив.

Byte
useravatar
Offline
732 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Byte,
Я это еще не переписывал. Каюсь. Я просто скопировал работающий код в пример.
Но на тот момент (когда создавался код) я еще плохо понимал логику КуСПа, как-то, что-то не так делал и у меня не работало просто КillVar $Переменная. Точнее с конкретными массивами. У меня данные сохранялись. Я обязательно этот момент перепишу.
А двойной вызов на всякий случай (я опять не помню почему), наверное чисто для страховки... Логика с ООП - в деструкторе обязательно надо очистить память внутри объекта, а затем удалить сам объект, иначе мусор накапливается.

Вполне себе
useravatar
Offline
45 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Всех С Новым Годом!!!! cool

Lucifer
Новичок
useravatar
Offline
18 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Алекс с этим я разобрался) и работает уже с этим довольно не плохо, хочу уже сделать что более красивое но все же по проще

Lucifer
Новичок
useravatar
Offline
18 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: Как сделать?

Я начал делать инвентарь но зашел в тупик уже что тока не пробовал но показатели не увеличивается
Я скину проще кодом
Это при выборе персонажа. Чтобы отображалось в самом начале 
$object_lev_1[0]='Персонаж'
$object_lev_1[1]='Статы'
$object_lev_1[2]='Кошелёк'
$object_lev_1[3]='Связка ключей'
$object_lev_1[4]='Рюкзак'
$onobjsel = 'выделение_предметов'
GOSUB 'выделение_предметов'

выделение_предметов
Там код прописан
if $selobj='' or $selobj='Назад':
killobj
i=0    &
:уровень1
if i<arrsize('$object_lev_1'):
addobj $object_lev_1[i]
i = i +1
jump 'уровень1'
end
elseif $selobj='Рюкзак':
killobj
addobj 'Назад'
addobj 'Назад
i=0    &
:уровень2
if i<arrsize('$object_lev_2'):
addobj $object_lev_2[i]
i = i +1
jump 'уровень2'
end
end
if $selobj='Статы':
killobj
Здоровье=100
addobj 'Здоровье <<здоровье>>','',1
Скрытность=0
addobj 'Скрытность <<Скрытность>>','',1
End
addobj 'Назад'
end
unsel

После на другой локе пытаюсь прокачать скрытность
                money=money-100
                Act 'Держи':
                if $selobj='Статы':
                Скрытность=Скрытность+1
                obj 'Скрытность <<Скрытность>>','',1
                End

Но по и тогу остается так же ноль, можете обьяснить почему

Lucifer
Новичок
useravatar
Offline
18 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
1062
Всего опросов:
14
Всего сообщений:
16791271
Бездействующий:
Пользователи форума:
 
Всего пользователей:
2901
Последним зарегистрировался:
IIIUT