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}

Ссылки[править]