Данный урок является прямым продолжением урока ACS. Разбираем код инвентаря (1).
Последнее что нам осталось, это разобрать функцию createTable, сделаем это.
//Useful variables
int image_size = img_size;
int block_size_div_2 = image_size/2;
int init_id = 3; //init image_id for HudMessage
str image_normal = "INVBLOC1";
str image_hovered = "INVBLOC2";
//Technical variables
int count=0;
int max_count = rows * colums;
int new_x = init_x;
int new_y = init_y;
int new_id = init_id;
int items_in_row = 0;
int MouseX = GetCVar("mouseX");
int MouseY = GetCVar("mouseY");
int leftClick = GetCVar("leftClick");
Нас сразу встречает целая куча переменных, разберем полезные переменные (те что задает кодер):
- image_size — хранит размер изображения.
- block_size_div_2 — нужен для задания смещения.
- init_id — указывает начальный id изображения.
- image_normal — изображение ячейки.
- image_hovered — изображение ячейки при наведении.


Далее идут технические переменные (те, что используются программой).
- count — переменная, необходимая для прогрессии в цикле while.
- max_count — хранит максимальное количество, ячеек. Это количество вычисляются путем умножения рядов на столбцы.
- new_x, new_y — координаты на которых будут рисоваться ячейки.
- new_id — id изображения ячейки, в цикле данный id будет увеличиваться на 1.
- items_in_row — хранит количество ячеек в ряду.
- MouseX, MouseY, leftClick — хранят информацию о мышке (координаты, нажатие кнопки).
С переменными разобрались, двигаемся дальше.
print(s:"x: ",f:floor(MouseX),s:"\ny: ",f:floor(MouseY),s:"\ndebugVar: ",f:debug_var);
Это дебаг (отладочная информация), он бесполезен в инвентаре, но незаменим в разработке. Данную строку можете пропустить.
while(count< max_count)
Создаем цикл, которой пройдется по всем ячейкам инвентаря.
str image = image_normal;
Переменная image хранит конечную картинку ячейки. По умолчанию она равна image_normal.
//go to new row
if(items_in_row >= colums)
{
items_in_row = 0;
new_x = init_x;
new_y += image_size;
}
Данный блок кода перемещает ячейку на новый ряд. То-есть, если количество ячеек в ряду >= количество_столбцов, то:
- Количество ячеек в ряду равно 0, что логично, ведь мы перешли на новый ряд.
- Значение new_x (координата относительно которой строится ячейка), возвращается в исходное положение.
- Ячейка перемещается вниз, на расстояние, равное размеру изображения (добавляется в нижний ряд).
Далее, идет проверка коллизии (нахождения мышки внутри ячейки).
//check if mouse hovered
if(((MouseX > new_x) && (MouseX < (new_x+image_size))) && ((MouseY > new_y) && (MouseY < (new_y+image_size))))
Нечто подобное я уже разбирал здесь ACS. Управляем мышкой. И да, проверка коллизии, идет для каждой из ячеек.
Если мышка находится внутри ячейки, то:
image = image_hovered;
debug_var = new_x+image_size;
if(leftClick)
{
SetWeapon(your_items[count]);
SetPlayerProperty(0,0,PROP_TOTALLYFROZEN);
ACS_NamedTerminate("DrawInventory",0);
}
Изображение ячейки заменяется на image_hovered. Если, при этом, нажата кнопка атаки (ЛКМ), то устанавливается соответствующее оружие, игрок размораживается, и выключается скрипт «DrawInventory» (инвентарь исчезает).
Далее рисуем ячейку:
drawImage(image,new_id+1000,new_x+block_size_div_2,new_y+block_size_div_2);
Вот и пригодилась переменная image, изображение каждой из ячеек, зависит от положения мыши.
drawItem(count, image_size, new_id,new_x,new_y);
drawItem рисует иконку оружия, и его количество.
Далее увеличиваем значения переменных.
new_x += image_size;
new_id++;
count++;
items_in_row++;
- new_x — увеличивается шагами в image_size, таким образом изображения ячейки, плотно прилегают друг к другу.
- new_id — увеличили new_id, что-бы у каждого hudMessage, был свой id.
- count — к count прибавляем 1, чтобы плавно пройтись по массиву.
- items_in_row — увеличили items_in_row на единицу.
Заключение.
Вот и разобрали мы с инвентарем, надеюсь я смог понятно объяснить как делать инвентарь.
Итоговый результат.
