Как сделать?
…
Миль пардон, если подобное уже обсуждалось, но у меня не получается динамически сформировать имя массива и вывести его содержимое на экран.
Поясню.
Есть несколько массивов данных. Это строки на разные случаи “жизни”. По мере изменения тех или иных характеристик название массивов формируется динамически. Но я не могу получить содержимое полученного массива.
Например.
$Text_Param1_Param2_0[0]='A'
$Text_Param1_Param2_0[1]='B'
$Text_Param1_Param2_0[2]='C'
---
$Text_Param1_Param2_1[0]='D'
$Text_Param1_Param2_1[1]='E'
$Text_Param1_Param2_1[2]='F'
---
$Text_Param1_Param2_2[0]='G'
$Text_Param1_Param2_2[1]='H'
$Text_Param1_Param2_2[2]='I'
--- ets ----
$Command={'$Text_<<$Args[0]>>_<<$Args[1]>>_<<$Args[2]>>[<<$Args[3]>>]'}
$Dyneval($result=$Command, Param1, Param2, 0, 3)
Но в итоге получаю - 0!
Я пробовал менять На “”
$Command='$Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]'
$Dyneval($result=$Command)
Но итог тот же, при этом, если вывести $Command, то она совершенно правильная с точки зрения названия массива…
Я понимаю, что где-то ошибаюсь, но не могу понять где.
Вполне себе,
Вики говорит так делать.
$Command='$Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]'
$Dyneval('$result=$Command')
dmvikar:
Вики говорит так делать.
$Command='$Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]' $Dyneval('$result=$Command')
Делал… Вместо 0 пишет строку $Command. Все равно, что написать:
$Command='$Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]'
*P $Command
Я потому и начал проводить эксперименты и добился “0”… Прекрасно работает с операциями и условиями, выводом, но не более.. Получить значение из массива с динамически сформированным именем - не получилось. Буду пробовать передать имя и индекс как параметр… Хотя чую, что та же шляпа.
Как я и предполагал, шляпа приобрела фееричный размах. Попробовал сделать умное лицо и написал в скобках (фигуристых - как советовал Вики)
Получил бяку:
$Command={$Тав_<<$Param1>>_<<$Param2>>_<<Args[0]>>[<<Args[1]>>]}
$Command
’$Тав_>_>_>[>]’
А результатом работы
$dyneval('$Command', 1, 2)
Стало: $Тав_Param1_Param2_1[2] - Собственно, от чего и начал… ))))
Но задачку я, таки, решил плюнув на Dyneval (хотя это было удобнее с т.з. применения в виде функции. Но это я сделал через Локацию) и запузырил через Dynamic
#Массивчик
$Command='$Тав_<<$Args[0]>>_<<$Args[1]>>_<<Args[2]>>[<<Args[3]>>]'
dynamic "$FullStr=<<$Command>>" & !с $Result напрямую тоже какая-то шляпа. Через раз ругается на разные стоки кода.
$result=$FullStr
--- Массивчик ---
.....
.....
@Массивчик($Param1, $Param2, Args[0], Args[1])
Результат такой как положено: Я пришел к тебе с приветом!
Разобрался! Тьху! Столько времени?!
$Command='$Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]'
$Dyneval('$Result=<<$Command>>')
На было поставить выражение $Command в, сцк, <<>>!!!
<<$Command>> И ВСЁ!!!!
Вполне себе,
в плеере 5.8.0. можно получить содержимое динамически созданного массива без $dyneval.
Используй функцию ARRITEM.
*pl $arritem('$Text_<<Param1>>_<<Param2>>_<<Args[0]>>',args[1])
Если у тебя 5.7.0. и функцию arritem использовать нельзя, то ты усложняешь. Вот так должно сработать:
*pl $Dyneval('$Result = $Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]')
Объясню. $dyneval выполняет строку, переданную ей, как код. Но перед выполнением раскроются подвыражаения в этой строке: << >>. То есть вместо них подставятся значения. Это происходит у тебя в первой строчке
$Command='$Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]'
, а затем ты заставляешь плеер выполнить раскрытие подвыражения в следующей строчке
$Dyneval('$Result=<<$Command>>')
и в итоге у тебя всё равно в $dyneval передаётся такая же строка, как если бы ты прописал сразу
*pl $Dyneval('$Result = $Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]')
.
Теперь, если это всё понятно, сам себе ответь на вопрос, почему здесь
$Command='$Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]'
$Dyneval('$result=$Command')
и здесь
$Command='$Text_<<Param1>>_<<Param2>>_<<Args[0]>>[<<Args[1]>>]'
$Dyneval($result=$Command)
не сработало как нужно.
Сиба! Я уже вкурил.
Через $Command я написал, потому, что от чего-то не сработала “строка”. Я стал разбираться и для контроля всадил через $Command.
Видимо, экспериментируя, я что-то исправил и не заметил как, но успел забраться в дебри. )))
Меня по-прежнему интересует, а можно ли узнать размеры “Основного окна” или разрешение монитора из-под плеера QSP? Если можно, то как?
Вполне себе,
в классическом плеере этого седлать нельзя.
Теоретически можно в qSpider, используя JS, но я ещё не испытывал. Werewolf говорит, если упрощать, что пока что это в полной мере не реализовано. Но в qSpider такая передача размеров окон фактически и не нужна, т.к. если ты владеешь CSS и JS, сделать более менее адаптивный дизайн не составит труда, а зачем ещё такое может понадобиться, я не вижу.
Подобное имеет смысл для меня только в одном случае: мне нужно разбить длинный текст на страницы, а я не знаю изначально, какой длины текст, и какой ширины страница. Но и в этом случае в qSpider текст можно выводить кодом QSP полностью, а уже с помощью JS скрывать его части и делать своего рода “карусель”/слайдер только с текстом.
Плюс, такие штуки, как относительные единицы измерения (vh, vw, насчёт vmax и vmin пока не уверен), прекрасно поддерживаются qSpider’ом, так что сварганить общую резиновую вёрстку страницы, а затем отдельные её элементы сделать адаптивными — как никогда просто. Передавать в QSP код остаётся только данные введённые игроком. А на этот случай у qSpider уже есть инструменты.
я ваще балдею от этого вашего ксп:
5.7 и 5.8, но покопавшись выяснил, что это вроде как про сам плеер, но в различиях говориться именно про инструменты разработки,
вот этого я в справке не помню. Укажи, пожалуйста, конкретно, где прямо говорится, или делаются намёки, что 5.7.0 и 5.8.0 — это про инструменты разработки?
Aleks Versus:
Плюс, такие штуки, как относительные единицы измерения (vh, vw, насчёт vmax и vmin пока не уверен), прекрасно поддерживаются qSpider’ом, так что сварганить общую резиновую вёрстку страницы, а затем отдельные её элементы сделать адаптивными — как никогда просто. Передавать в QSP код остаётся только данные введённые игроком. А на этот случай у qSpider уже есть инструменты.
Для Спайдера переверстывать крайне лень из-за “стандартных” положений окна. Оно меня полностью не устраивает.
А вот сделать в классическом плеере было бы очень кстати. Я уже писал. Я верстаю на большом экране, но когда пересел за ноут, то вся верстка полезла багами. Стройный текст в 1920х1080 совершенно не айс при 1330x768. Убегает длинным вертикальным столбцом. Тут или картинку уменьшать и другие части верстки, или выносить текст вниз. Уменьшать картинки - такое себе, так как тогда текст все едино выбьется за границы. А выносить вниз - надо понимать когда! Вот тут-то и нужна возможность определения размеров окна. Определил 1 раз (изменение окна игроком - это уже проблемы игрока) и все прекрасно.
Помогите кодом, кто разбирается. Как сделать динамический топ-лист? Внизу я написал базу, как я бы начал генерировать список. Но я не умею сортировать массивы по содержимому от наибольшей переменной массива к наименьшей
$scr_top_gen={
:newlist
$toplist=''
staff=1
:new_staff
coderand=rand(1000,9999)
$toplist_name_staff[staff]='A-<<coderand>>'
toplist_totalscrap_staff[staff]=rand(100,1000)
if staff<50: staff+=1 & jump'new_staff'
!тут уже нужно будет сортировать получившиеся списки "<<$toplist_name_staff[staff]>> <<toplist_totalscrap_staff[staff]>>" по убыванию, сверху вниз. Плюс, чтобы строчка с данными игрока перемещалась внутри этого списка, когда он до него дорастёт. Данные игрока $name и all_time_scrap. А потом это вся мощная лабуда просто записывается в переменную $toplist
}
Попрошу заметить, что приложил скриншот из вики. С помощью совета от туда я смогу вывести на экран топ 1го сотрудника рейтинга, но а как же остальные 49? и Как среди них игрока разместить?
Замутил кое что сам, но из 50 человек отображаются 3-5, и не отображается мой игрок. Что я не так сделал?
$scr_top_gen={
:newlist
$toplist=''
staff=1
max_staff=50
:new_staff
coderand=rand(1000,9999)
$toplist_name_staff[staff]='A-<<coderand>>'
toplist_totalscrap_staff[staff]=rand(100,1000)
$tl[staff]='<br><<$toplist_name_staff[staff]>> <<toplist_totalscrap_staff[staff]>>'
if staff<max_staff: staff+=1 & jump'new_staff'
if staff=max_staff: staff+=1 & toplist_totalscrap_staff[staff]=career_loot_cost & $toplist_name_staff[staff]=$name & $tl[staff]='<br><font color=rgb(0,200,200)><<$toplist_name_staff[staff]>> <<toplist_totalscrap_staff[staff]>></font>'
st_sort=0
:staff_sort
sort_staff=arrpos(min('toplist_totalscrap_staff'),'toplist_totalscrap_staff', max('toplist_totalscrap_staff')-st_sort)
$toplist+=$tl[sort_staff]
if st_sort<max_staff: st_sort+=1 & jump'staff_sort'
!тут уже нужно будет сортировать получившиеся списки "<<$toplist_name_staff[staff]>> <<toplist_totalscrap_staff[staff]>>" по убыванию, сверху вниз. Плюс, чтобы строчка с данными игрока перемещалась внутри этого списка, когда он до него дорастёт.
}
$scr_top={
*p'<br> <<$toplist>>'
}
Дамир Белялов,
1. Генерируешь массив со значениями.
2. Делаешь копию массива и добавляешь в него значение игрока.
3. Либо сортируешь массив путем создания нового массива либо просто выводишь список.
c=max('sorttemp')
b=arrpos('sorttemp',c)
killvar'sorttemp',b
Получаешь максимальное значение из временного массива, делаешь с ним что нужно и удаляешь из временного массива. И так, пока временный массив не закончится.
Я сделал то же, что ты мне посоветовал, у меня так и есть. Проблема в том, что некоторые позиции пустые. Отображаются все 50 но они не записаны. 
Я добавил нумерацию списка и увидел что отображаются все позиции. И кстати каждая с разницей 1 очко рейтинга. Если у меня рейтинг будет в разы выше остальных то останется только строка с рейтингом игрока и пустота.
$scr_top_gen={
:newlist
$toplist='' & !топлист
staff=1
max_staff=60 & !максимальное количество участников рейтинга
:new_staff
coderand=rand(1000,9999)
$toplist_name_staff[staff]='A-<<coderand>>'
toplist_totalscrap_staff[staff]=rand(900,1010)
$tl[staff]='<<$toplist_name_staff[staff]>> <<toplist_totalscrap_staff[staff]>>'
if staff<max_staff: staff+=1 & jump'new_staff'
if staff=max_staff: staff+=1 & toplist_totalscrap_staff[staff]=career_loot_cost & $toplist_name_staff[staff]=$name & $tl[staff]='<font color=rgb(0,200,200)><<$toplist_name_staff[staff]>> <<toplist_totalscrap_staff[staff]>></font>' & !наш игрок
st_sort=0
position=1
:staff_sort
sort_staff=arrpos(min('toplist_totalscrap_staff'),'toplist_totalscrap_staff', max('toplist_totalscrap_staff')-st_sort)
$toplist+='<br><<position>>. '+$tl[sort_staff]
if st_sort<max_staff-31: st_sort+=1 & position+=1 & jump'staff_sort'
}
Дамир Белялов,
Может с выводом что-то не то или с исходным массивом. Скинь прогу в личку, посмотрю на досуге. Или у ребят в дискорде попроси помощи.
Дамир Белялов,
А ты посмотри, что у тебя выводит arrpos. Там местами -1, а таких элементов в массиве у тебя очевидно нет (если так и надо, тогда просто сделай проверку на -1 и не увеличивай position да не добавляй в список на вывод). Следовательно, алгоритм сортировки не подходит.
Spoiler
Это для 5.8.*
$formated_list = ''
local temp_arr
local size, position = 1
local max_value, staff_pos
local $not_included, $values
max_staff = 60
loop local i=0 while i<max_staff step i+=1:
name_seed = rand(1000,9999)
$top_list_name[i] = ' A-<<name_seed>>'
top_list_total_scrap[i] = rand(900,1010)
$top_list[i] = '<<$top_list_name[i]>> <<top_list_total_scrap[i]>>'
end
!@ - Игрок
$top_list_name[] = "Dominus"
top_list_total_scrap[] = 500
$top_list[] = '<font color=rgb(0,200,200)><<$top_list_name[size]>> <<top_list_total_scrap[size]>></font>'
!@ - Значения
size = arrsize('top_list_total_scrap')
loop local i=0 while i<size step i+=1:
temp_arr[i] = top_list_total_scrap[i]
end
loop local i=0 while i<size step i+=1:
max_value = max('temp_arr')
staff_pos = arrpos('top_list_total_scrap', max_value)
if arrpos('$values', $top_list[staff_pos]) = -1:
$formated_list += '<br><<position>>. ' + $top_list[staff_pos]
position += 1
else
$not_included += '<br><<i>>. ' + $top_list[staff_pos]
end
$values[] = $top_list[staff_pos]
killvar 'temp_arr', arrpos('temp_arr', max_value)
end
*PL $formated_list
*PL $not_included