desc:Very Simple Button
@init
// Функции, определенные в секции init можно вызвать из любой секции!
//================================================
/*Пространства имен используются для удобства. Для нас важно, что мы можем получить доступ к ним относительно(релятивно).
(Но не так, как хотелось бы!). Для этого используется префикс "this." - для функций и переменных, либо instance() - для переменных.
В итоге, мы имеем некоторое подобие объектов. Дальше попробую объяснить на примере, самом простом, сделаем примитивнейшую кнопку.*/
//== 1 ===========================
//Эта функция принимает параметры будущей кнопки, в кач-ве аргументов.
//x,y,w,h - координаты, высоту, ширину, r,g,b,a - цвет, lbl, state - лейбл, состояние.
function button_New(x,y,w,h, r,g,b,a, lbl, state)
(
this.x = x; this.y = y; this.w = w; this.h = h; // coord
this.r = r; this.g = g; this.b = b; this.a = a; // color
this.lbl = lbl; // label
this.state = state; // state
);
/*Если вызываем функцию, допустим, так:
A.button_New(10,10,20,20, 1,0,0,1, "A", 1); // - получим A.x = 10; A.y = 10; A.w = 20; A.h = 20; A.r, A.g ... и тд.
B.button_New(50,10,20,20, 1,1,0,1, "B", 0); // - получим B.x = 50; B.y = 10; B.w = 20; ... и тд.
C.button_New(90,10,40,20, 0,1,0,1, "C", 0); // - получим C.x = 90; C.y = 10; C.w = 40; ... и тд.
То есть, "this." внутри функции как бы подменяется на то namespace, от которого функция вызывается.*/
//== 2 ===========================
//Эта функция использует x,y,w,h в том namespace, от которого функция вызывается - instance(x,y,w,h).
//Функция возвращает 0 или 1, в зав. от того, находится ли курсор мыши в пределах прямоугольника x,y,w,h.
//Она пригодиться в дальнейшем.
function mouseIN()
instance(x,y,w,h)
( // if point in obj area
mouse_x >= x && mouse_x <= x+w && mouse_y >= y && mouse_y <= y+h;
);
//== 3 ===========================
//Эта функция рисует кнопку, используя instance(x,y,w,h, r,g,b,a, lbl, state)
//То есть, грубо говоря, параметры нашей кнопки
//Внутри функции - this.mouseIN() - вызывается также "от имени" конкретной кнопки.
function button_Draw()
instance(x,y,w,h, r,g,b,a, lbl, state)
local(aa, str_w, str_h)
(
mousedown && this.mouseIN() ? state = !state;
state ? aa = a : aa = 0.4; // Пусть прозрачность зависит от состояния кнопки.
//-- draw button ------
gfx_set(r,g,b, aa);
gfx_rect(x,y,w,h, 1);
gfx_rect(x,y,w,h, 0);
//-- label -------
gfx_set(0,0,0,1); // fnt clr
gfx_measurestr(lbl, str_w, str_h);
gfx_x = x+(w-str_w)/2; gfx_y = y+(h-str_h)/2;
gfx_drawstr(lbl);
);
//================================================
// Создадим кнопки
A.button_New(20, 20,30,30, 1,0,0,1, "A", 0); //
B.button_New(60, 20,30,30, 1,1,0,1, "B", 0); //
C.button_New(100,20,30,30, 0,1,0,1, "C", 0); //
D.button_New(140,20,30,30, 0,1,1,1, "D", 0); //
@gfx 200 200
// mousedown = 1 если мышь была нажата в текущем кадре
mousedown = mouse_cap&1 && !(last_mouse_cap&1);
// Нарисуем кнопки
A.button_Draw();
B.button_Draw();
C.button_Draw();
D.button_Draw();
// обновим последнее состояние мыши
last_mouse_cap = mouse_cap;