RU

QooSP

KOLANICH #24 28.02.2014 15:33 21 comments 17645 views

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

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

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

Edited at 26.08.2014 14:26 (11 years ago)

Тоже возникала такая идея. Но как сравнивать похожие алгоритмы по оптимальности быстродействия?

Но как сравнивать похожие алгоритмы по оптимальности быстродействия?

С помощью О-нотации, разумеется. Если по О-нотации выходит одинаково, то запустить 10000 раз каждый и сравнить время.
Только зачем? Это кусп, на нём никто не будет обрабатывать массивы из тысяч элементов или писать алгоритм, обрабатывающий граф. Если честно, я даже не могу придумать, в каком квесте может понадобиться сортировка.

Вот я недавно писал Tank Arena, доделать уровни пока руки не доходят, так вот там при отрисовке карты 11x11 скорость была критична. Приходилось перерабатывать алгоритм, исключать ненужные проверки для увеличения скорости, к тому же сначала хотел сделать на android плеер, но он такую карту очень медленно обрабатывает. Вот поэтому и нужно немного подумать об оптимизации.

!Извлечение квадратного корня с округлением вниз. При получении на вход отрицательного числа возвращает -1.
#sqrtd

i=0
if(args[0]<0):
result=-1
exit
end
:loop
if(i*i<args[0]):
i+=1
jump ‘loop’
end
if(i*i>args[0]):
result=i-1
else
result=i
end

!Извлечение квадратного корня с округлением вверх. При получении на вход отрицательного числа возвращает -1.
#sqrtu

i=0
if(args[0]<0):
result=-1
exit
end
:loop
if(i*i<args[0]):
i+=1
jump ‘loop’
end
result=i

!Возводит число args[0] в степень args[1]. Если степень меньше нуля, возвращает -1.
#pow

x=args[0]
i=1
if(args[1]=0):
result=1
exit
elseif(args[1]<0):
result=-1
exit
end
:loop
if(i<args[1]):
x*=args[0]
i+=1
jump ‘loop’
end
result=x

!Возвращает модуль числа
#abs

if(args[0]>=0):
result=args[0]
else
result=-args[0]
end

!Возвращает факториал числа. Если передаётся отрицательное число, возвращает -1.
#fact

if(args[0]=0 or args[0]=1):
result=1
exit
elseif(args[0]<0):
result=-1
exit
end
x=1
i=2
:loop
if(i<=args[0]):
x*=i
i+=1
jump ‘loop’
end
result=x

KOLANICH:

Локации не должны производить сторонних эффектов, которые могут попортить игры

Использование в функциях в качестве счётчиков циклов (или для хранения временных значений) глобальных переменных очень даже может попортить игру — ведь эти функции могут вызываться из участков кода, использующих такие же имена переменных для собственных нужд.

Выход — использовать строковые индексы массива ARGS: ARGS[’x’] или ARGS[’i’].

При этом следует помнить, что не лишним будет сдвигать границу массива ARGS, чтобы избежать пересечения “локальных переменных” с параметрами функции. Для этого достаточно в самом начале кода функции дать команду ARGS[9]=0 или же ARGS[9]=arrsize(’ARGS’), если функции нужно знать число переданных параметров.

Olegus t.Gl.:

При этом следует помнить, что не лишним будет сдвигать границу массива ARGS, чтобы избежать пересечения “локальных переменных” с параметрами функции.

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

newsash,
текстовые индексы в QSP пересекаются с числовыми.

! если записать по текстовому индексу
a['b'] = 123
! то значение будет записано по текстовому индексу
a['b']
! и по числовому
a[0]

Код выведет:

123
123

Это особенность реализации массивов в QSP. Именно поэтому, для каждого конкретного массива следует использовать либо только текстовые индексы, либо только числовые - чтобы не испортить данные.

К названиям переменных можно приписать что то вроде qsp_function_

Grass:

К названиям переменных можно приписать что то вроде qsp_function_

Когда дойдёте до рекурсивных функций или накопите большую библиотеку, то увидите, что префиксы имён не спасают.

Nex:

Это особенность реализации массивов в QSP. Именно поэтому, для каждого конкретного массива следует использовать либо только текстовые индексы, либо только числовые - чтобы не испортить данные.

Элемент с текстовым индексом дописывается в конец массива. Испортить данные можно только по глупости, а тут вроде речь идёт о серьёзной библиотеке. :)

Grass:

К названиям переменных можно приписать что то вроде qsp_function_

Лучше действительно пользоваться массивом args с текстовым индексом. А “обычные” переменные использовать только когда нужно передавать большое количество единиц данных.

Испортить данные можно только по глупости

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

Nex:

Я об этом и говорю.

Мы говорим о разных вещах. Впрочем они не принципиальны.

Log in or Register to post comments.