QooSP
В языке c++ есть библиотека Boost, в которой есть дофига свистелок и перделок. Правда и весит она дофига… но мы сейчас не её обобсуждаем.
Что такое библиотека? Это набор функций/классов/шаблонов (а в qsp - локаций), которые программист может использовать у себя в проекте, не особо вникая в то, как это устроено внутри (это называется “использовать как чёрный ящик”). Программист библиотеки может поменять её внутренности, не меняя интерфейс (”способ использования”), что в большинстве случаев не должно попортить приложения, её использующие.
Предлагаю собрать библиотеку локаций, решающих типовые задачи авторов, вроде вывода прогрессбара, миниигр (карты, ним, покер, блекджек, крестики-нолики, визуальные кодовые замки), спецэффектов, менюшек …. Постите в этот тред свои куски кода, оформленные в виде локаций, которые можно вызывать с помощью gs. Локации не должны производить сторонних эффектов, которые могут попортить игры. Параметры передаются в операторе gs, а не через переменные. В комментарии опишите, как использовать. Желательно привести пример.
Далее соберём это в файл qsp, который нужно будет склеить с файлом вашей игры, чтобы получить возможность использовать локации, определённые в ней.
А какую длину может иметь название переменной? и сколько первых символов имени переменной имеют значение? Вот в старых реализациях языка C было ограничено, вроде как 6 первых символов, потом расширили до 30 и т.д.
Grass,
длина имени переменной не больше чем максимальная длина строки.
Уже давно реализована поддержка локальных переменных, но я никак не могу собраться и доделать рабочую версию плеера.
Локальные переменные будут объявляться через “local”:
local a,b
local m,a=67,$b='dfdf'
Byte,
очень ждём!
Да!!!
К вопросу в теме “Как сделать”, если не ошибаюсь. Спрашивали, как выбрать слова из текста. Немного решил развить и написал небольшую функцию (процедуру?), вырезающую из текста строки (между разделителями), и помещающую их в массив. В качестве разделителя может выступать что угодно: пробельный символ, символ переноса строки, слово, или целая строка. Задержка от применения функции к блоку текста зависит не от объёма текста, а от количества разделителей. Текст в пять сотен разделителей у меня обрабатывался 38 миллисекунд.
Пользуясь простым регулярным выражением, можно включить в обработку несколько разделителей и по примеру исходной задачи выбрать из текста только слова. Код функции (процедуры?):
Spoiler
! #cut.str.inArray
! вырезает строки из текста и помещает в массив
! $args[0] - текст
! $args[1] - массив
! $args[2] - разделитель строк
$args[3] = UCASE($args[3]) & ! дополнительные опции (можно комбинировать, записав через пробел):
! TRIM - разделители, которыми начинается или кончается блок текста игнорируются
! NOTSPACE - игнорируются все пустые строки, т.е. когда между разделителями ничего нет
! LEFT - сохранить в строке разделитель, поместив его слева (в начале строки)
! RIGHT - сохранить разделитель в строке, поместив его справа (в конце строки)
! REGULAR - задействована обработка регулярного выражения. Если не указано, значение, переданное во втором аргументе, будет считаться настоящим разделителем.
if $args[2] = '':
$args[2]='
'
end
if $strfind($args[3],'REGULAR')='': $args[0] = $args[0]+$args[2] else $args[0]=$args[0]
if $args[1]='':
exit
elseif instr($args[1],'$')<>1:
$args[1]='$'+$args[1]
end
:for
if len($args[0])>0:
if $strfind($args[3],'REGULAR')='':
args['div']=instr($args[0],$args[2])
$args['div.']=$args[2]
else
args['div']=strpos($args[0],$args[2])
$args['div.']=$strfind($args[0],$args[2])
end
if args['div']>0:
$args['вырезанная строка'] = $mid ($args[0],1,args['div']-1)
$args[0] = $mid($args[0],args['div']+len($args['div.']))
else
$args['вырезанная строка']=$args[0]
$args[0]=''
end
if ($args['вырезанная строка']<>'' and $strfind($args[3],'NOTSPACE')<>'') or $strfind($args[3],'NOTSPACE')='':
dynamic "if $args[1]='LEFT' and $strfind('<<$args[3]>>','REGULAR')<>'REGULAR': $args[1]='<<$args[2]>>'
if $args[2]='RIGHT' and $strfind('<<$args[3]>>','REGULAR')<>'REGULAR': $args[2]='<<$args[2]>>'
<<$args[1]>>[]=$args[1]+$args[0]+$args[2]",$args['вырезанная строка'],$strfind($args[3],'LEFT'),$strfind($args[3],'RIGHT')
end
jump 'for'
end
if $strfind($args[3],'TRIM')<>'':
dynamic "if <<$args[1]>>[0]='' or <<$args[1]>>[0]='<<$args[2]>>' or <<$args[1]>>[0]='<<$args[2]+$args[2]>>':
killvar '<<$args[1]>>',0
end
if <<$args[1]>>[]='' or <<$args[1]>>[]='<<$args[2]>>' or <<$args[1]>>[]='<<$args[2]+$args[2]>>':
killvar '<<$args[1]>>',arrsize('<<$args[1]>>')-1
end"
end
! вызов: gosub 'cut.str.inArray','ТЕКСТ','$имя_массива','разделитель или регулярное выражение','дополнительные опции'
На текущий момент в регулярное выражение нельзя передавать символ одиночного апострофа.
У меня функция называется “cut.str.inArray”; вот пример вызова, который поместит в массив $mass все слова из литературного текста (т.е. точки, запятые и прочие знаки препинания, указанные в регулярном выражении, выбраны не будут):
gosub 'cut.str.inArray',$text,'$mass','("|!|\?|-|,|;|:|\.| |
)','NOTSPACE REGULAR'
, где $text - переменная, в которую помещён отрывок текста; $mass - имя массива, в который помещаются слова; NOTSPACE и REGULAR - дополнительные условия для функции (процедуры?): NOTSPACE - исключит занесение в массив пустых значений, REGULAR - разрешает обрабатывать второй аргумент как регулярное выражение, а не абсолютную строку.
Надеюсь, кому-нибудь пригодится.