====== Rectangle API ======
This is a simple library that implements basic UI elements in ACS. This library is an **addon** for the cursor library.
**ACSRect** is not bundled with official ACSUtils. You can download it [[https://gist.github.com/Monsterovich/33578899cf10790ce7f957f9be4a9de1|here]].
Define ''ACSUTILS_RECTLIB_SAVEDSTATES'' to specify the amount of required rectangles.
===== Usage =====
...
#define ACSUTILS_RECTLIB_USERVARS 1 // user defined
#include "acsutils.acs"
#include "acsrect.acs"
...
===== Example =====
This script implements two simple buttons. You also can move them by using the right mouse button.
script 1 (void) net clientside
{
int rects;
rects = RectCreate(0, 0, 64.0, 64.0);
rects = RectCreate(128.0, 128.0, 64.0, 64.0);
while(true)
{
UpdateCursor();
HudSetPoint(CursorX(), CursorY());
HudDrawText(1, "+");
for (int i = 0; i <= rects; i++)
{
if (RectIsGrabbed(i, BT_ALTATTACK))
RectFollowCursor(i);
if (RectIsPressed(i, BT_ATTACK))
log(s:"pressed");
for (int j = 0; j <= rects; j++)
{
if (RectIntersects(i, j))
log(s:"rect ", d:i, s:" intersects with ", d:j);
}
HudSetPoint(RectX1(i), RectX2(i));
HudDrawText(2+(i*4), "*");
HudSetPoint(RectX2(i), RectY1(i));
HudDrawText(3+(i*4), "*");
HudSetPoint(RectX1(i), RectY2(i));
HudDrawText(4+(i*4), "*");
HudSetPoint(RectX2(i), RectY2(i));
HudDrawText(5+(i*4), "*");
}
delay(1);
}
}
====== Functions ======
==== RectCreate ====
''int RectCreate(fixed x, fixed y, fixed width, fixed height)''
Creates a rectangle on the stack with the given parameters. The result value is the rectangle's id in the stack.
==== RectsDelete ====
''void RectsDelete(int start)''
Deletes a group of rectangles from stack, //start// == 0 will delete all rectangles. Use non-zero values to delete the rectangles only from the top of the stack.
===== Rectangle coordinates =====
{{ :functions:addons:rectvex.png |}} {{ :functions:addons:rectstructure.png |}}
==== RectX1 ====
''fixed RectX1(int rect)''
Returns the X coordinate of rectangle vertexes №1, №3.
==== RectY1 ====
''fixed RectY1(int rect)''
Returns the Y coordinate of rectangle vertexes №1, №2.
==== RectX2 ====
''fixed RectX2(int rect)''
Returns the X coordinate of rectangle vertexes №2, №4.
==== RectY2 ====
''fixed RectY2(int rect)''
Returns the Y coordinate of rectangle vertexes №3, №4.
==== RectCenterX ====
''fixed RectCenterX(int rect)''
Returns the X coordinate of the rectangle's center.
==== RectCenterY ====
''fixed RectCenterY(int rect)''
Returns the Y coordinate of the rectangle's center.
==== SetRectPosition ====
''void SetRectPosition(int rect, fixed x, fixed y)''
Sets the //X Y// of given rectangle. Rectangle position is its (X1; Y1) point.
==== SetRectSize ====
''void SetRectSize(int rect, fixed width, fixed height)''
Changes the rectangle's size to //width// and //height//.
==== RectWidth ====
''fixed RectWidth(int rect)''
Returns the width of the given rectangle.
==== RectHeight ====
''fixed RectHeight(int rect)''
Returns the height of the given rectangle.
==== RectFollowCursor ====
''void RectFollowCursor(int rect)''
Makes rect to follow mouse coordinates.
==== RectIsPointInside ====
''bool RectIsPointInside(int rect, fixed x, fixed y)''
Returns true if the rectangle contains the point with the coordinates //x y//, otherwise returns false.
==== RectIntersects ====
''bool RectIntersects(int rect, int rect2)''
Returns true if the rectangle with id //rect// intersects with other rectangle with id //rect2//.
Rectangle can't intersect with itself. So, if rect == rect2, this function returns //false//.
===== User Data =====
You may also create custom user-defined rectangle properties.
Define **ACSUTILS_RECTLIB_USERVARS** to specify the amount of these properties.
==== SetRectUserData ====
''void SetRectUserData(int rect, int id, int value)''
Sets the value of the given custom property of the rectangle.
==== RectGetUserData ====
''int RectGetUserData(int rect, int id)''
Returns the value of the rectangle's given custom property.
==== Example ====
A simple implementation of a checkbox button.
#define ACSRECT_USER_CHECKED 0
...
int checker = RectCreate(0, 0, 16, 16);
...
while(true)
{
...
int checked = RectGetUserData(checker, ACSRECT_USER_CHECKED);
if (RectIsClicked(checker, BT_ATTACK))
SetRectUserData(checker, ACSRECT_USER_CHECKED, !checked);
...
delay(1);
}
===== Rectangle action handlers =====
==== RectIsHovered ====
''bool RectIsHovered(int rect)''
Returns true if the mouse cursor is inside the rectangle.
==== RectIsClicked ====
''bool RectIsClicked(int rect, int key)''
Returns true if user clicked the rectangle once with //key//.
==== RectIsDown ====
''bool RectIsDown(int rect, int key)''
Returns true if user is holding the //key// down and the mouse cursor is inside the rectangle.
==== RectIsGrabbed ====
''bool RectIsGrabbed(int rect, int key)''
This function is similar to //RectIsDown//, but optimized for rectangle moving, because it saves the focus until user released the key.
==== RectIsPressed ====
''bool RectIsPressed(int rect, int key)''
This function is similar to //RectIsClicked//, but unlike //RectIsClicked// it makes the rectangle work like a normal button:
* Returns true, if user released the //key// after clicking the rectangle.
* Returns true, if cursor went outside the rectangle after the user had held down the //key//.
Otherwise, it return false.