Четверг, 18 Апреля 2024, 15:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Курсор на спрайте (Как проверять, находится ли курсор на спрайте)
Курсор на спрайте
gameshulkerДата: Понедельник, 22 Марта 2021, 19:42 | Сообщение # 1
был не раз
Сейчас нет на сайте
При нажатии на кнопку, я в draw gui рисую спрайт фона для меню крафта, далее рисую в этом же draw gui иконки кнопок с вариантами крафта. То есть, 1 спрайт рисуется как фон, и рисуется много разных спрайтов кнопок (например кнопка крафта палки, камня, слитка и так далее). Мне нужно чтобы игра понимала на каком из спрайтов находится курсор, тот же самый position_meeting только не с объектом, а с draw_sprite.

Я мог бы делать это объектами, но мне нужно чтобы это было как интерфейс. Если я буду вместо отрисовки спрайтов создавать объект фона, объекты с кнопками крафта, то будет неудобно и они не будут прикрепляться к интерфейсу.

Очень странно что не добавили возможность проверять position_meeting у спрайтов, есть ли какие-то способы?

Вот как отрисовываются 2 спрайта кнопок + фон:
https://imgur.com/0rdGOwt

Вот код отрисовки, где crGoldButton - спрайт кнопки крафта золотого слитка(iron - соответственно железного), FurnaceMenu - фон:
https://imgur.com/t8zko1E
Fire_PhoenixДата: Вторник, 23 Марта 2021, 05:46 | Сообщение # 2
был не раз
Сейчас нет на сайте
gameshulker, если я правильно понял, то можно попробовать так:

Объявите глобальную переменную drawList:
Код
globalvar drawList;


А затем создайте массив с нужным количеством элементов. Я взял сто, надеюсь хватит :)
Код
drawList = array_create(100, 0);


Далее, объявляем пользовательские функции:

Для проверки, находится ли курсор над отрисованным спрайтом:
Код
#define cursor_in_sprite(sprite)
result = false;

if ("drawn" == array_get(drawList, sprite)[0])
if ((mouse_x >= array_get(drawList, sprite)[1])  &&
    (mouse_y >= array_get(drawList, sprite)[2])  &&
    (mouse_x <= array_get(drawList, sprite)[3])  &&
    (mouse_y <= array_get(drawList, sprite)[4])) {
result = true;
}

return result;


И для отрисовки спрайта с добавлением его в drawList.
Код
#define my_draw_sprite(sprite, subimg, x, y, xscale, yscale, rot, colour, alpha)
array_set(drawList, sprite, ["drawn", x, y, x + sprite_get_width(sprite) * xscale, y + sprite_get_height(sprite) * yscale]);
return draw_sprite_ext(sprite, subimg, x, y, xscale, yscale, rot, colour, alpha);


Соответственно, в Вашем коде draw_sprite_ext заменить на my_draw_sprite.

Ну а проверить можно так:
Код
if cursor_in_sprite(CrGoldIgnot)
draw_text(72, 72, "No, your cursor scares me!");


Важно понимать, что:
Код
drawList = array_create(100, 0);

нужно добавить в функцию отрисовки (draw), чтобы сбросить drawList.

Так же, сейчас функция my_draw_sprite не будет правильно работать, если аргумент для вращения не равен 0, то есть, если спрайт переворачивается этой функцией. Но это можно добавить при желании...




Сообщение отредактировал Fire_Phoenix - Вторник, 23 Марта 2021, 05:53
gameshulkerДата: Вторник, 23 Марта 2021, 11:27 | Сообщение # 3
был не раз
Сейчас нет на сайте
Fire_Phoenix, спасибо, я попробую с этим шаманить, но, если тебе не сложно, то я так и не понял, почитав справку, что такое #define, и можно об return рассказать на пальцах, я буду безумно благодарен. А ещё, вместо "sprite" писать названия спрайтов моих кнопок, и для каждой кнопки проверять курсор отдельно? Я не так давно в GMS 2, я разобрался немного в массивах, циклах основных, но всё же непросто пока что это всё.

Вот, что такое спрайт? И что такое "drawn"?В #define компилятор тоже не понимает что такое sprite:
https://imgur.com/HXu8LUU

Окей, остался чертов #define:
https://imgur.com/R1OezRC

Ну как я понял, define это что-то типа функции. И вот что вышло, можно комментарии?
https://imgur.com/a/vn1nISu

Теперь курсор пугает неизвестно что, но я уже ближе.
https://imgur.com/GIw6OyB
https://imgur.com/Euef1zJ
Я пытаюсь подстроить чтобы было ровно, но получается что всё правильно, только съезжает вправо и вниз, как я мог бы это исправить?

Добавлено (23 Марта 2021, 19:53)
---------------------------------------------
Цитата Fire_Phoenix ()
нужно добавить в функцию отрисовки (draw), чтобы сбросить drawList.


Аааа, дошло. Я весь день менял значения, и оказалось что я не внимательно прочитал. Я использую draw GUI, мне для интерфейса, как это можно адаптировать под DrawGUI? В событии draw работает как надо

Добавлено (23 Марта 2021, 20:46)
---------------------------------------------

Цитата Fire_Phoenix ()
Для проверки, находится ли курсор над отрисованным спрайтом:

СПАСИБО ТЕБЕ ОГРОМНОЕ, это лучшая система нахождения спрайта под курсором, я думал что всё решу, когда по запросу GUI buttons gamemaker studio 2 нашёл кучу видео про кликабельный интерфейс, но оттуда я вовремя догадался взять позицию курсора относительно интерфейса:
var _mouseX = device_mouse_x_to_gui(0);
var _mouseY = device_mouse_y_to_gui(0);
Я заменил mouse_x/y на мои переменные и всё заработало, это очень крутая система кнопок интерфейса, я теперь могу не проверять для каждой кнопки отдельно курсор, а находить разные параметры для каждой кнопки с помощью одного ряда твоих строк, спасибо ещё раз, ты очень помог, я несколько дней был в тупике.


Сообщение отредактировал gameshulker - Вторник, 23 Марта 2021, 20:31
Fire_PhoenixДата: Вторник, 23 Марта 2021, 23:59 | Сообщение # 4
был не раз
Сейчас нет на сайте
gameshulker,
Цитата
я несколько дней был в тупике.

Это достойно уважения! Не важно, какой сложности будет вопрос, главное не сдаваться, и все получится...

Желаю Вам творческих успехов в разработке :)


Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Курсор на спрайте (Как проверять, находится ли курсор на спрайте)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг