ACS. Разбираем код инвентаря (2).

Данный урок является прямым продолжением урока 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 — изображение ячейки при наведении.
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 на единицу.

Заключение.

Вот и разобрали мы с инвентарем, надеюсь я смог понятно объяснить как делать инвентарь.

Итоговый результат.

Пожалуйста отключи блокировщик рекламы, или внеси сайт в белый список!

Please disable your adblocker or whitelist this site!