RU

QooSP

KOLANICH #24 28.02.2014 15:33 21 comments 17653 views

В языке c++ есть библиотека Boost, в которой есть дофига свистелок и перделок. Правда и весит она дофига… но мы сейчас не её обобсуждаем.

Что такое библиотека? Это набор функций/классов/шаблонов (а в qsp - локаций), которые программист может использовать у себя в проекте, не особо вникая в то, как это устроено внутри (это называется “использовать как чёрный ящик”). Программист библиотеки может поменять её внутренности, не меняя интерфейс (”способ использования”), что в большинстве случаев не должно попортить приложения, её использующие.

Предлагаю собрать библиотеку локаций, решающих типовые задачи авторов, вроде вывода прогрессбара, миниигр (карты, ним, покер, блекджек, крестики-нолики, визуальные кодовые замки), спецэффектов, менюшек …. Постите в этот тред свои куски кода, оформленные в виде локаций, которые можно вызывать с помощью gs. Локации не должны производить сторонних эффектов, которые могут попортить игры. Параметры передаются в операторе gs, а не через переменные. В комментарии опишите, как использовать. Желательно привести пример.
Далее соберём это в файл qsp, который нужно будет склеить с файлом вашей игры, чтобы получить возможность использовать локации, определённые в ней.

Edited at 26.08.2014 14:26 (11 years ago)

А какую длину может иметь название переменной? и сколько первых символов имени переменной имеют значение? Вот в старых реализациях языка C было ограничено, вроде как 6 первых символов, потом расширили до 30 и т.д.

Grass,
длина имени переменной не больше чем максимальная длина строки.

Ограничения QSP

Уже давно реализована поддержка локальных переменных, но я никак не могу собраться и доделать рабочую версию плеера.
Локальные переменные будут объявляться через “local”:

local a,b
local m,a=67,$b='dfdf'

Byte,
очень ждём!

Да!!!

Aleks Versus Moderator 04.11.2014 13:47 (11 years ago)

К вопросу в теме “Как сделать”, если не ошибаюсь. Спрашивали, как выбрать слова из текста. Немного решил развить и написал небольшую функцию (процедуру?), вырезающую из текста строки (между разделителями), и помещающую их в массив. В качестве разделителя может выступать что угодно: пробельный символ, символ переноса строки, слово, или целая строка. Задержка от применения функции к блоку текста зависит не от объёма текста, а от количества разделителей. Текст в пять сотен разделителей у меня обрабатывался 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 - разрешает обрабатывать второй аргумент как регулярное выражение, а не абсолютную строку.

Надеюсь, кому-нибудь пригодится.

Log in or Register to post comments.