Pixilang
Pixilang — межплатформенный пиксельно-ориентированный язык программирования. В данном учебнике рассматриваются только версии 1 и 2 языка Pixilang. Документация на версию 3 находится здесь: https://warmplace.ru/soft/pixilang/index_ru.php
Основы
[править]Основа Pixilang - это pixi-контейнеры. pixi-контейнер может содержать в себе картинку, строку текста, числовой массив и ссылку на другой pixi-контейнер с альфа-каналом. То есть, любой набор данных хранится в pixi-контейнере, к которому можно обращаться как к массиву. Далее под терминами "картинка", "текстовая строка", "числовой массив" будет пониматься обычное число - номер pixi-контейнера.
Пример:
//Считывание значения второго пикселя в картинке image: pixel_value = image[ 2 ]
Обычное рабочее окно Pixilang имеет следующий вид:
Здесь "current screen" - это виртуальный экран. "User window" - пользовательское окно (окно интерпретатора). Pixilang-программа имеет право рисовать только в области виртуального экрана, который принудительно может изменять свои размеры независимо от пользовательского окна.
Конфигурация
[править]Pixilang может использовать файл конфигурации config.ini, в котором задаются начальные размеры окна, длина (в сэмплах) звукового буфера, название окна и опция выключения бордюра окна.
Пример:
width 320 height 240 noborder windowname "Название окна" buffer 4096
Элементы языка
[править]Комментарии
[править]Закомментировать строку кода можно при помощи символов //. Пример:
// эта строка закомментирована
При помощи символов /* */ можно делать многострочные комментарии:
/* blah blah blah blah blah blah */
Текстовые строки
[править]Текстовые строки заключаются в двойные кавычки. Пример:
a = "текстовая строка" //В переменную a поместили номер новой строки (pixi-контейнера)
При передаче строки какой-либо команде (кроме make_pixi) возможно динамически включать в эту строку числовые значения переменных. Пример:
blahblah = 34 video_export_gif( "VIDEO$blahblah.gif" ) //Сохраняем видео в файл VIDEO34.gif
Коды ASCII-символов
[править]Коды ASCII-символов (максимум 4 символа): 'A','B','ABC'... Пример:
ascii_code = 'E' //По сути, это мы в переменную ascii_code поместили число 69
Переменные
[править]Переменная может хранить в себе одно 32-битное знаковое целое число. Запрещено использование одного имени для переменной и подпрограммы, так как имя подпрограммы - это тоже переменная. Пример:
medved = 4 //в переменную medved я помещаю 4
Математические операции
[править]Возможны следующие математические операции: -,+,*,/,% Пример:
a = b + 4 //Сложение b = 1 / 3 //Деление c = 4 % 5 //Остаток от деления
Условные операции
[править]Возможные варианты условных операторов:
- < - меньше
- > - больше
- <= - меньше или равно
- >= - больше или равно
- = - равно (если стоит после if)
- != - не равно
Бинарные операции
[править]Бинарные логические операции (для тех, кто знает, что это такое):
- ^ - xor
- & - and
- | - or
Числа
[править]Обычное число типа 12345 воспринимается как обычное десятичное число :)
Некоторые команды (например, команды трансформации) требуют числа в формате с фиксированной точкой 24.8. Далее такие числа будем кратко называть Fixed point. Fixed point - обычные десятичные числа умноженные на 256. То есть, например, число 1 в формате Fixed point будет равно 256, так как 1 * 256 = 256. 2 будет равно 512 (2*256). 0.5 будет равно 128 (0.5*256). И так далее.
Число типа #4499FF автоматически преобразуется в значение цвета. Удобно использовать для передачи цвета различным графическим командам. Формат: #RRGGBB. RR - красный, GG - зеленый, BB - синий. В общем, как в HTML. Заранее заданы следующие цветовые константы: ORANGE, BLACK, WHITE и аналогичная SNEG, RED, GREEN, BLUE, YELLOW.
Подпрограммы
[править]Программа начинается с самого начала текстового файла. Возможно использование подпрограмм - их желательно определять где-нибудь в конце. Вот пример:
print("Hello world!",0,0) myfunc1 //тут мы вызываем нашу подпрограмму, определенную в конце stop //остановка основной программы myfunc1: //здесь какая-то подпрограмма ret
Где ret - это метка конца подпрограммы. Не забывайте про неё! Отсюда следует, что подпрограммы определяются в виде: ИМЯ_ПОДПРОГРАММЫ: НЕПОСРЕДСТВЕННО ПОДПРОГРАММА ret. Возможно также более гибкое использование подпрограмм вот в таком виде:
//На лету создаём подпрограмму podpr: podpr = { print("hello1") print("hello2") } //И вызываем её: podpr //На самом деле, здесь podpr - это обычная переменная, //содержащая в себе адрес подпрограммы.
Метки
[править]Метки перехода пишутся вот в таком виде:
my_cool_metka: blah blah goto my_cool_metka
То есть, переход на метку осуществляется при помощи команды goto (или просто go).
Циклы while
[править]Циклы while пишутся следующим образом: while( условие, при котором выполняется цикл ) { действия }. Пример:
a = 0 while( a < 8 ) { print( "$a", a * 8, 0, WHITE ) a + 1 } //Этот цикл выведет значение возрастающей переменной "a" восемь раз \\ но на самом деле, цикл выведет просто $a, а не число, потому что кавычки это текст, и команда print выводит только текст. Чтобы увидеть число, которое помещено в $а, его необходимо преобразовать в строку. Чтобы упростить задачу в будущем, стоит один раз написать функцию:
fn printtt ($var) {
string = "" num_to_str(string, $var) ret(string)
}
a = 0 while( a < 8 ) { print(printtt(a), a * 8, 0, WHITE ) a + 1 frame(100) }
Команды
[править]Команды пишутся следующим образом: ИМЯ_КОМАНДЫ (ПАРАМЕТРЫ ЧЕРЕЗ ЗАПЯТУЮ) Например, выполним команду dot: dot(1,1,#FF0000) Если никаких параметров не передаем, то пишем просто название команды без скобок. Например: frame. Команда может возвращать значение: x = get_pen_x() Запрещено использование параметров такого вида: com( com() )
Детальный список команд
[править]Ниже приводится детальный список всех команд языка Pixilang. В скобках указываются возможные (но не обязательные) параметры.
Графические
[править]dot (x,y,color) - поставить точку. Пример: dot(10,20,#FFFF00)
get_dot (x,y) - возвращает цвет точки по координатам x,y
fps - возвращает текущее число кадров в секунду
frame (delay,clip_x,clip_y,clip_xsize,clip_ysize) - перерисовывает экран и делает паузу, специально для перехода между кадрами. delay - длина паузы. 1000 - секунда, 500 - половина секунды, 0 - нет паузы. Параметры clip_x,clip_y,clip_xsize,clip_ysize характеризуют координаты и размер региона, который нужно перерисовать. Регион нулевого размера (по умолчанию) означает перерисовку всего экрана. Пример: frame(500)
clear (color) - очистить экран. Пример: clear(#FFFF00)
print (text,x,y,color) - печатает текст по координатам x, y. Пример: print("HELLO!",10,10,#FFFFFF) Можно заставлять print выводить числовые значения переменных. Делается это очень просто. Например, выведем значение переменной b вот так: print("VALUE=$b",10,10,#ffffff)
line (x1,y1,x2,y2,color) - рисует линию. Пример: line(0,0,10,10,#FFFF00)
box (x1,y1,xsize,ysize,color) - рисует прямоугольник. Пример: box(0,0,10,10,#FFFF00)
fbox (x1,y1,xsize,ysize,color) - рисует закрашенный прямоугольник. Пример: fbox(0,0,10,10,#FFFF00)
triangle (x1,y1,x2,y2,x3,y3,color) - рисует треугольник закрашенный цветом color
pixi_triangle (x1,y1,tx1,ty1,x2,y2,tx2,ty2,x3,y3,tx3,ty3,image,frame) - рисует треугольник закрашенный текстурой, взятой из контейнера image. Текстурные координаты: tx1, ty1, tx2, ty2, tx3, ty3
triangles3d (vertexes,triangles), pixi_triangles3d (vertexes,triangles,pixi,frame) - нарисовать цветные или текстурированные треугольники из числовых массивов vertexes и triangles.
//структура массива вершин - "vertexes": X, Y, Z, texture_X, texture_Y, 0, 0, 0, X, Y, Z, texture_X, texture_Y, 0, 0, 0, ... //структура массива треугольников - "triangles": V1, V2, V3, COLOR, TRANSPARENCY, 0, 0, ORDER, V1, V2, V3, COLOR, TRANSPARENCY, 0, 0, ORDER, ... //V1..V3 - номера вершин. ORDER - номер треугольника (команда sort_triangles автоматически заполнит это значение) //X,Y,Z - координаты (Fixed point)
sort_triangles (vertexes,triangles) - отсортировать треугольники (заполнить значения ORDER в массиве triangles) по координате Z.
save_screen(filename,x,y,xsize,ysize) - сохранить участок экрана в текстовый файл.
Пример:
s = 1 save_screen("IMG$s.txt",0,0,10,10) //Сохраняем в файл с именем IMG1.txt
set_screen (some_image) - устанавливает указанную картинку в качестве экранного буфера. 0 - стандартный экран по умолчанию
make_pixi (text_source,alpha_pixi,transparent_color) - преобразовать текстовую строку в картинку с заданным прозрачным цветом (transparent_color) и альфа-каналом (alpha_pixi). Альфа канал должен иметь такой же размер как и основная картинка. Чтобы не использовать альфа-канал, необходимо указать 0 в качестве параметра alpha_pixi. Предупреждение: данная команда автоматически преобразовывает пиксели черного цвета в темно-синий (для глаза он остается черным) Символы входной текстовой строки (в том числе для альфа канала): 0,1,2,3,4,5,6,7,8,9 - градиент серого; . (точка) - прозрачный цвет; остальные символы - имена переменных, в которых хранятся цвета
make_ascii_pixi (text_source,color_pixi) - то же, что и предыдущая команда, только картинка будет выводиться на экран в виде ASCII символов, а цвета символов будут браться из альфа-канала. Пример:
text = "Hello World!" text_color = "123456789123" make_ascii_pixi( text, text_color )
new_pixi (xsize,ysize,frames) - создает новую пустую картинку с заданным размером и количеством кадров. Пример: bird = new_pixi( 32, 32, 4 )
load_pixi (filename) - загружает картинку из GIF или JPG файла
remove_pixi (pixi) - удалить pixi-контейнер
resize_pixi (pixi,xsize,ysize,mode) - изменить размер графического pixi-контейнера; xsize,ysize - новый размер в пикселях. mode: 0 - очистить pixi после масштабирования.
clone_pixi (pixi,clone_alpha) - клонировать pixi-контейнер. Значения параметра clone_alpha: 0 - не клонировать альфа-канал; 1 - клонировать альфа-канал. Пример: new_image = clone_pixi( sobaka, 1 )
get_pixi_xsize (image) - получить ширину картинки image (в пикселях). Пример: xsize = get_pixi_xsize( sobaka )
get_pixi_ysize (image) - получить высоту картинки image (в пикселях). Пример: ysize = get_pixi_ysize( sobaka )
get_pixi_frames (image) - получить количество кадров в картинке image. Пример: frames = get_pixi_frames( sobaka )
get_pixi_alpha (image) - получить картинку, которая выступает в роли альфа-канала картинки image. Пример: alpha = get_pixi_alpha( sobaka ) pixi( alpha, 10, 10, 1 )
pixi_alpha (image,new_alpha) - установить альфа-канал (картинку, которая будет выступать в роли карты прозрачности) для картинки image
pixi_transp (image,transp,transp_color) - контроль прозрачного цвета указанной картинки (image). transp - прозрачность включена/выключена (1/0). transp_color - прозрачный цвет
pixi (image,x,y,pixel_size,pixel_size_correction), fpixi (image,x,y,pixel_size,pixel_size_correction,frame) - рисует заранее созданную картинку. Параметр frame (только для fpixi) - номер кадра (от 0 до бесконечности). В команде pixi номер кадра не указывается и определяется автоматически. pixels - это строка текста, которая превращается в пиксели. pixel_size - размер пикселя (размеры меньше 1 приравниваются к 1). pixel_size_correction - плавная коррекция указанного размера пикселя: 0 - нет коррекции; 256 - размер пикселя увеличивается на единицу; 128 - размер пикселя увеличивается на 0.5 (половинка экранного пикселя) и т.д. Рассмотрим пример:
//ЗАДАЕМ АНИМАЦИЮ ИЗ 5 КАДРОВ - ЧТО-ТО ТИПА ЛЕТЯЩЕЙ ПТИЧКИ :) //КАДРЫ ДОЛЖНЫ РАЗДЕЛЯТЬСЯ СИМВОЛОМ "+". //СИМВОЛ "." - ПРОЗРАЧНЫЙ ПИКСЕЛЬ //ОСТАЛЬНЫЕ СИМВОЛЫ - ИМЕНА ПЕРЕМЕННЫХ, КОТОРЫЕ СОДЕРЖАТ В СЕБЕ НУЖНЫЕ ЦВЕТА //ПРИСВОИМ ПЕРЕМЕННОЙ "B" НУЖНЫЙ ЦВЕТ (КРАСНЫЙ): B = #FF0000 //ЗАДАДИМ ТЕКСТОВУЮ СТРОКУ: t = " B......B .B....B. ..BBBB.. + ........ BB....BB ..BBBB.. + ........ ........ BBBBBBBB + ........ ........ ...BB... BBB..BBB + ........ BB....BB ..BBBB.. " //ПРЕОБРАЗУЕМ ЭТУ СТРОКУ В КАРТИНКУ: make_pixi( t ) //И ВЫВЕДЕМ ВСЕ ЭТО ЧУДО НА ЭКРАН: repeat_marker: clear(BLACK) pixi(t,10,10) frame(100) go repeat_marker
get_window_xsize - получить ширину пользовательского окна (в пикселях)
get_window_ysize - получить высоту пользовательского окна (в пикселях)
get_color (r,g,b) - возвращает цвет, скомпонованный по составляющим r,g,b (red,green,blue)
get_red (color) - возвращает значение (от 0 до 255) красной составляющей цвета color
get_green (color) - возвращает значение (от 0 до 255) зеленой составляющей цвета color
get_blue (color) - возвращает значение (от 0 до 255) синей составляющей цвета color
get_blend (color1,color2,val) - возвращает средний цвет между color1 и color2. val - значение близости: 0 - ближе всего к цвету color1; 256 - ближе всего к цвету color2
transp (value) - устанавливает прозрачность последующих графических команд. 0 - невидимый ... 255 - видимый
effector (color,power,type,x,y,xsize,ysize,xadd) - команда для использования стандартных графических эффектов. сolor - цвет эффекта. power - мощность эффекта (от 0 до 256). type - тип эффекта: 0 - шум; 1 - горизонтальное размытие; 2 - вертикальное размытие. x,y,xsize,ysize - прямоугольная область, в которой будет работать выбранный эффект. xadd - интервал между точками.
pixel_shader (pixel_shader_subprogram) - включить программный пиксельный шейдер (версия PS1). pixel_shader_subprogram - подпрограмма шейдера. Входные параметры для этой подпрограммы: PS_T - номер пикси-контейнера с текстурой; PS_TX - текущая координата X на текстуре (Fixed point); PS_TY - текущая координата Y на текстуре (Fixed point); PS_TP - номер пикселя на текстуре; PS_P - номер пикселя на экране. Выходные параметры: PS_R - окончательный цвет точки.
Пример:
pixel_shader( GLASS_PIXEL_SHADER ) //Включение пиксельного шейдера "стекло" ... /* Здесь рисуем какие-нибудь pixi */ pixel_shader( -1 ) //Выключение пиксельных шейдеров GLASS_PIXEL_SHADER: v = get_red( PS_T[ PS_TP - 1 ] ) - get_red( PS_T[ PS_TP + 1 ] ) PS_R = get_blend( scr0[ PS_P + get_red( PS_T[ PS_TP ] ) / 8 ], WHITE, v ) ret
Шрифты
[править]pixi_font (image) - указать анимированную картинку (графический pixi-контейнер), которая будет выступать в роли текущего шрифта. Шрифт моноширный. Каждый символ в шрифте - это кадр картинки. Соответственно, для 256 ASCII символов нужна анимация из 256 кадров
get_pixi_font - получить картинку, которая является шрифтом на данный момент
Трансформация
[править]t_reset - очистить трансформацию
t_rotate_x (angle,x,y,z) , t_rotate_y (angle,x,y,z) , t_rotate_z (angle,x,y,z) - добавить трансформацию поворота вокруг оси X, Y или Z на угол angle (512 = 2*Пи). Центр поворота - x,y,z
t_translate (x,y,z) - добавить трансформацию переноса (сдвига). Коэф-ты переноса x,y,z - целые числа (Fixed point).
t_scale (x,y,z) - добавить трансформацию масштабирования. Коэф-ты масштабирования x,y,z - целые числа (Fixed point). Нормальный размер - 256; увеличение в два раза - 512.
t_get_matrix (m), t_set_matrix (m), t_mul_matrix (m) - действия с матрицей трансформации (матрица - 4х4 ячейки, или просто массив из 16ти 32-битных чисел (Fixed point)). t_get_matrix - записать текущую активную матрицу в массив m. t_set_matrix - взять матрицу из массива m и сделать её активной. t_mul_matrix - умножить текущую активную матрицу на матрицу из массива m.
t_get_x (x,y,z), t_get_y (x,y,z), t_get_z (x,y,z) - произвести трансформацию точки с координатами x,y,z (Fixed point) и возвратить измененную координату x, y или z (Fixed point).
Работа со строками
[править]new_string (size) - создать пустую строку длиной в size символов. Пример: str = new_string( 10 )
get_string_size (string) - получить размер строки string (в символах). Пример: strsize = get_string_size( "Мама мыла раму" )
Работа с числовыми массивами
[править]Массивом считается любое хранилище данных - то есть, любой pixi-контейнер:
- картинка - хранит в себе значения пикселей;
- строка - хранит в себе значения отдельных символов;
- числовой массив - хранит в себе числа.
new_array (len) - создать новый массив (числовой pixi-контейнер) 32битных чисел. len - кол-во чисел. Пример: array = new_array( 256 )
get_array_size (array) - получить размер (кол-во чисел) числового массива
Время и таймеры
[править]start_timer (t) - запустить таймер номер t. Пример: start_timer(3)
get_timer (t) - получить значение таймера номер t. Пример: get_timer(3) Если полученное значение равно 1000, то прошла одна секунда; если 2000, то две секунды и т.д.
get_seconds - получить текущее время: секунды
get_minutes - получить текущее время: минуты
get_hours - получить текущее время: часы
Взаимодействие с пользователем
[править]handle_pen_keys (button_down_handler,pen_move_handler,button_up_handler), handle_keys (...) - обработать все события, связанные с мышкой (стилусом), произошедшие с момента последнего вызова команды frame. Параметры этой команды - подпрограммы, обработчики.
Пример: handle_pen_keys( {x=get_pen_x}, 0, 0 )
get_pen_x, gpx - получить текущую x-координату мыши (или стилуса)
get_pen_y, gpy - получить текущую y-координату мыши (или стилуса)
get_pen_region (x,y,xsize,ysize), gpr (x,y,xsize,ysize) - возвращает единицу, если есть попадание курсора мыши (или стилуса) в указанную область
get_pen_key, gpk - получить текущую нажатую клавишу мыши (или клик стилуса); 1 - если есть нажатие, или 0 - если нажатия нет
handle_hard_keys (button_down_handler,button_up_handler) - обработать события нажатых клавиш. Работает аналогично команде handle_pen_keys, только для клавиатуры, а не для мыши. Для получения кода нажатой клавиши вызывается команда get_hard_key (или ghk). Пример: handle_hard_keys( {key_code=get_hard_key}, 0, 0 )
get_hard_key, ghk - получить текущую нажатую клавишу на клавиатуре. Коды клавиш со стандартными ASCII символами соответствуют кодам ASCII. Коды дополнительных клавиш:
256: F1 257: F2 258: F3 259: F4 260: F5 261: F6 262: F7 263: F8 264: UP 265: DOWN 266: LEFT 267: RIGHT 268: INSERT 269: DELETE 270: HOME 271: END 272: PAGEUP 273: PAGEDOWN 274: CAPS
При нажатии клавиши SHIFT, к коду добавляется 512 При нажатии клавиши CTRL, к коду добавляется 1024
Видео-экспорт
[править]video_export_gif (filename,x,y,xsize,ysize), video_export_avi (filename,x,y,xsize,ysize) - включить сохранение всех кадров в анимированный GIF-файл или AVI-файл (сохранение в AVI пока работает только в Windows).
Примеры:
//Экспорт всего экрана: video_export_gif("my_video.gif") //Экспорт указанного региона: video_export_gif("my_video.gif",-10,-10,64,64)
После каждого выполнения команды frame очередной кадр будет сохранятся в указанный файл. Сам файл временно хранится в памяти и сохраняется на диск при выходе из pixilang, при выполнении команды stop_video_export или при очередном включении экспорта командой video_export_XXX.
pause_video_export - временно приостановить сохранение кадров.
resume_video_export - продолжить сохранение кадров.
stop_video_export - остановить сохранение кадров и сохранить результат в выбранный (в команде video_export_XXX) файл.
video_export_fps (fps) - установить количество кадров в секунду при сохранении кадров в AVI (по умолчанию стоит 30 кадров в секунду).
video_export_realtime (rt) - установка режима реального времени для экспорта в AVI.
Примеры:
video_export_realtime( 1 ) //Включение режима реального времени. AVI файл будет без звука video_export_realtime( 0 ) //Включение режима виртуального времени. AVI файл будет с плавным изображением и со звуком
По умолчанию включен режим реального времени.
video_export_dither (dither) - включить или выключить dithering (эмуляция плавных цветовых переходов при помощи шума) при экспорте. Пример включения: video_export_dither(1) Пример выключения: video_export_dither(0)
video_export_hq (highquality) - включить или выключить режим качественного экспорта в GIF, при котором для каждого кадра будет создаваться своя локальная цветовая палитра. Пример включения: video_export_hq(1). Пример выключения: video_export_hq(0). По умолчанию - выключен
Музыка
[править]load_music (filename,slot) - загрузить композицию в трекерном формате XM или MOD. slot - номер места, в которое загрузится музыка. slot может принимать любые значения от 0 до 15. Загрузив несколько композиций в разные места можно обеспечить их одновременное проигрывание.
play_music (slot) - начать проигрывание загруженной композиции
stop_music (slot) - остановка проигрывания
music_volume (volume,slot) - установить громкость проигрывания (от 0 to 255)
get_music_pattern (slot) - получить номер текущего паттерна в композиции
get_music_position (slot) - получить текущую позицию в паттерне
Звук
[править]send_sound (sound_pixi,freq,channels,loop) - послать sound_pixi (pixi-контейнер, содержащий в себе кусок звука) в звуковой буфер. freq - частота дискретизации, с которой этот кусочек будет проигрываться. channels - кол-во каналов (1 - моно или 2 - стерео). loop - если установить этот параметр в единичку, то данный кусочек звука будет проигрываться бесконечно долго. Возвращаемое значение - порядковый номер (ID) указанного кусочка звука в звуковом буфере.
send_sound_to (sound_id,sound_pixi,freq,channels,loop) - аналогично предыдущей команде, только позиция в звуковом буфере указывается не автоматически, а берется из параметра sound_id. Значение этого параметра может быть в диапазоне от 0 до 15.
get_sound_status (sound_id) - получить статус (позицию проигрывания) указанного куска звука.
Пример:
sound_id = send_sound(sound,44100,2,0) position = get_sound_status( sound_id )
sound_volume (volume) - установить громкость звука (от 0 до 256)
Пример создания зацикленного буфера c 8-битным звуком:
snd = new_string( 256 ) //Длина звука - 256 отсчетов (сэмплов) //Амплитуда в 8-ми битном звуке - это величина от -127 до +127 send_sound( snd, 44100, 1, 1 )
Пример создания зацикленного буфера c 32-битным звуком:
snd = new_array( 256 ) //Нормальная амплитуда в 32-битном звуке - от -32767 до 32767. send_sound( snd, 44100, 1, 1 )
Пример создания зацикленного буфера из картинки:
//img - какая-то цветная pixi-картинка send_sound( img, 44100, 2, 1 ) //Превращаем картинку в стерео-звук //правый канал - красный цвет; левый канал - зеленый цвет
Работа с файлами
[править]fopen, fclose, fgetc, fputc, fseek, ftell, feof - POSIX совместимые команды для работы с файлами. Аналогичны таким же функциям в языках Си/Cи++. fopen, freopen, fdopen открывают файл для определенных типов чтения и записи
fclose закрывает файл, ассоциированный с переданным ей значением FILE *
fgetc возвращает один символ из файла
fputc записывает один символ в файл
fseek производит смещение от текущей позиции в файле на указанное количество байт, или от его начала или конца, в указанном направлении.
ftell возвращает указатель позиции файла, который может быть передан fseek
feof проверяет, установлен ли индикатор EOF для данного потока
set_disk0 (TAR_file_name) - указать имя TAR файла, который будет восприниматься языком в роли диска 0.
Пример:
set_disk0( "archive.tar" ) //
Архив archive.tar содержит какие-нибудь файлы и файл PIC.JPG
img = load_pixi( "0:/PIC.JPG" ); //
Грузим файл PIC.JPG с виртуального диска 0
file_dialog (filename,dialogname,mask,id) - открыть графический диалог для выбора файла. filename - контейнер с заранее созданной строкой, в которую будет производиться сохранение имени выбранного файла. dialogname - имя диалогового окна. mask - маска типов файлов (например, "jpg/gif"). id - имя файла, в который будет сохраняться текущее состояние диалога. Если файл успешно выбран, команда возвращает значение 1. В противном случае - 0.
Пример:
filename = "................................" if( file_dialog( filename, "Выберете графический файл", "jpg/gif", "gfx_files_dialog" ) ) { /* файл выбран. имя в переменной filename */ } else { /* файл не выбран */ }
Математика
[править]sin (angle) - получить значение целочисленного синуса. Значения для угла angle: 512 = 2*Пи. Возвращаемые значения: -256...0...256
cos (angle) - получить значение целочисленного косинуса. Значения для угла angle: 512 = 2*Пи. Возвращаемые значения: -256...0...256
csin (angle) - ccos (angle) - такие же как sin и cos, только с более низкой четкостью. Значение для угла angle: 256 = 2*Пи. Возвращаемые значения: -128...0...128
rand - получить случайное число в диапазоне от 0 до 32767
rand_seed (seed) - установить указатель случайных чисел
Системные
[править]stop - остановить выполнение программы
halt - тоже самое что и stop.
exit (exit_code) - выход в ОС; exit(1) - выход в ОС с выходным кодом 1.
noesc (no) - включение/выключение выхода по ESC; noesc(0) - выходить при нажатии ESC; noesc(1) - не выходить при нажатии ESC.
Правила программирования
[править]С чего начать
[править]Создайте в текстовом редакторе файл (например, MY_PROGRAM.TXT) и напишите в нем следующее:
a = 2 * 2 metka1: clear(BLACK) print("HELLO PIXEL! $a",-20,10,#FFFFFF) frame a = a + 1 goto metka1
Теперь запустите интерпретатор pixilang и укажите в нем свой текстовый файл. В результате получим простенькую анимацию, где на экране будет написано HELLO PIXEL и постоянно увеличивающееся число.
Математика
[править]В Pixilang все числа целые знаковые 32-битные. Возможны операции со скобками. Не забывайте про старшинство операций (сначала выполнится умножение, а потом уже сложение и вычитание). Ниже приведен список операций по приоритетам:
% (эта операция будет выполнена в первую очередь) / * - + >= <= > < != = ^ & | (эта операция будет выполнена последней)
Возможны операции без знака "равно". Примеры:
a+1 //переменная a увеличивается на единицу a+1*2 //переменная a увеличивается на величину (1*2)
Условные операции
[править]Условные операции выглядят следующим образом: if КАКОЕ-ЛИБО УСЛОВИЕ { КУСОК ПРОГРАММЫ, ИСПОЛНЯЕМЫЙ ПРИ ВЫПОЛНЕННОМ УСЛОВИИ } Рассмотрим примеры:
//Если a > 4, то записываем 2 в переменную b if a > 4 { b = 2 }
//Если a равно 1, то записываем 1 в переменную b if a = 1 { b = 1 }
//Если b не равно 1, то выводим на экран строчку текста "HELLO" if b != 1 { print("HELLO",1,1) }
//Если b не равно 1, то выводим на экран строчку текста "HELLO"; //если b равно 1, то рисуем точку по координатам 10,10 if b != 1 { print("HELLO",1,1) } else { dot(10,10) }
Подключение внешних файлов
[править]В Pixilang есть возможность подключения внешних файлов, которые содержат в себе, к примеру, код библиотек. Сделать это можно очень просто:
INCLUDE "имя внешнего файла"
Подключение произойдет на этапе компиляции.
Оптимизация программы
[править]Pixilang поддерживает удобные приемы оптимизации вашей программы. Рассмотрим примеры.
Возьмем следующую программу:
pixi( t, 44, 44 ) pixi( a, 44, 44 ) pixi( b, 44, 44 )
Как видим, название команды повторяется. Повторяются так же и координаты (44,44). В таком случае данный код можно сократить до следующего вида:
pixi( t, 44, 44 ) .( a ) .( b )
Поясним. Если вместо названия команды указана точка, то вызывается последняя выполненная команда. Неуказанные параметры так же берутся из параметров последней выполненной команды.
Азы программирования
[править]Пример №1. ASCII анимация
[править]Главный инструмент в языке Pixilang - это универсальный pixi-контейнер. Пример создания пиксельной анимации при помощи такого контейнера был рассмотрен выше. Попробуем заменить пиксели на ASCII-символы.
//описываем контейнер с анимированным содержанием pic=" o ooo o o o o o ooo ooo ooooooo ooooooooooo o ooooooo o oo oo + ooo o o ooooo ooooo ooooooo ooooooooooo o ooooooo o oo oo " // тупо раскрашиваем все красненьким a=RED pic_color=" aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaaaaaaa " make_ascii_pixi(pic,pic_color) //создаем контейнер с ascii анимированным содержанием make_ascii_pixi(pic) // метка start: // цвет фона clear(#000000) /* задаем анимированному контейнеру координаты x=2 и y=3 увеличение=4 */ pixi(pic,2,3,4) // время демонстрации фрейма frame(100) //возврат к метке start - бесконечный цикл go start
Пример №2. Часы
[править]time: clear(SNEG) // считаем часы минуты секунды h = get_hours m = get_minutes s = get_seconds //выводим цифровые значения времени print( "$h:$m:$s", -65, -65, BLACK ) //делаем их удобоваримыми для вращающихся стрелок h=h * 256 h / 12 h - 64 m=m * 256 m / 60 m - 64 s=s * 256 s / 60 s - 64 //рисуем стрелки line(0,0, ccos(h) /4, csin(h)/4, BLACK) line(0,0, ccos(s) /3, csin(s) /3, BLACK) line(0,0, ccos(m) /5, csin(m)/5, BLACK) frame(0) go time
Пример №3. Кубики по кругу
[править]xcenter=0 ycenter=0 radius=1 N=8 clear(SNEG) angle=0 delta = 256 / N time: N-1 x =( xcenter+radius*ccos(angle))/2 y = (ycenter+radius*csin(angle))/2 fbox(x,y,11,11,BLACK) angle=angle+delta frame(110) if N>0 {go time}