Пятница, 03 Мая 2024, 04:53

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Вопрос - Ответ (Game Maker) (Будут пополняться)
Вопрос - Ответ (Game Maker)
ReanДата: Суббота, 03 Декабря 2016, 01:31 | Сообщение # 5841
участник
Сейчас нет на сайте
aedginvael, скаченный файл надо импортировать в проекты (File -> Import project...)
Интерфейс я бы всё же рекомендовал рисовать в DrawGUI - потом меньше хлопот будет (по типу тех, что интерфейс отображается в двух видах). Суть в том, что в событии Draw ты рисуешь не в каком-то определённом виде, а непосредственно в комнате. Виды - отображают тот или иной участок комнаты с заданным масштабом. Когда ты рисуешь GUI в простом Draw событии, то ты рисуешь его в комнате, а потому он отобразиться во всех видах, которые буду смотреть на этот участок. Поэтому интерфейсы рисуем только в DrawGUI. Можем расположить элементы GUI за пределами комнаты (если по каким-то причинам необходимо кинуть их в комнату на этапе проектирования), а уже в методе DrawGUI рисуем с необходимым сдвигом. Так как процесс рисования в DrawGUI происходит по оконным координатам, то динамически менять положение GUI элементов нет необходимости.
В примере, скинутом мной выше, как раз и показывается один из вариантов коллизии с одним типом объектов (допустим, родитель). Объектов может быть несколько. За один степ удастся проверить все объекты, с которыми происходит коллизия.
ProsstoBROДата: Суббота, 03 Декабря 2016, 22:33 | Сообщение # 5842
был не раз
Сейчас нет на сайте
Добрый день bye , делаю простенькую игрульку, смысл в ней строить домики, но суть не в этом.

В общем карта сделана в изометрической проекции из тайлов, и суть в том, что когда нажимаешь на один тайл, реагируют несколько тайлов которые находятся за ним, и получается что строятся сразу несколько домиков.

Вот скрин для более понятной ситуации.



Кто знает как решить?
Заранее спасибо!




Сообщение отредактировал ProsstoBRO - Суббота, 03 Декабря 2016, 23:28
ReanДата: Суббота, 03 Декабря 2016, 23:24 | Сообщение # 5843
участник
Сейчас нет на сайте
ProsstoBRO, в каком месте и каким образом обрабатываешь нажатие? У какого объекта?
ProsstoBROДата: Воскресенье, 04 Декабря 2016, 00:31 | Сообщение # 5844
был не раз
Сейчас нет на сайте
у этих тайлов которые бежево-коричневые

вызываю так





Сообщение отредактировал ProsstoBRO - Воскресенье, 04 Декабря 2016, 00:36
ReanДата: Воскресенье, 04 Декабря 2016, 01:11 | Сообщение # 5845
участник
Сейчас нет на сайте
ProsstoBRO, в общем, идея такая: также, в обработчике нажатия мыши, нам необходимо проверить условную переменную "global.selected". Если она false, то продолжаем выполнять функцию, иначе - выходим.
Код

if (global.selected)
    exit;

global.selected = true;

// Дальше идёт твой код
...

В событии Left Released нам нужно сделать только одну операцию - вернуть global.selected значение false;
Код

//Left released
global.selected = false;

// Далее, твой код, если есть
...

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

Добавлено: я думаю и так понятно, но на всякий случай упомяну - global.selected необходимо объявить заранее, при создании объекта, либо комнаты, либо менеджера, в общем, в месте, где у тебя происходит объявление всех глобальных переменных.


Сообщение отредактировал Rean - Воскресенье, 04 Декабря 2016, 01:14
ProsstoBROДата: Воскресенье, 04 Декабря 2016, 01:30 | Сообщение # 5846
был не раз
Сейчас нет на сайте
Rean, теперь ставится один домик, как и надо, но вылезло другое но, строится один из нескольких домов либо тот на который нажали либо тот который находятся за ним.
Мож есть еще варианты как можно реализовать нажатия на тайлы?




Сообщение отредактировал ProsstoBRO - Воскресенье, 04 Декабря 2016, 01:33
ReanДата: Воскресенье, 04 Декабря 2016, 01:42 | Сообщение # 5847
участник
Сейчас нет на сайте
ProsstoBRO, честно говоря, этого стоило ожидать. Всё зависело от порядка создания экземпляров тайлов. В таком случае, надо "привязываться" либо к глубине (depth), либо к координате Y. У тебя ведь "нахлёст" происходит, грубо говоря, по высоте? То есть, срабатывал нижний, на который нажимали, и верхний?
ProsstoBROДата: Воскресенье, 04 Декабря 2016, 01:46 | Сообщение # 5848
был не раз
Сейчас нет на сайте
Rean, я думал привязывать к глубине, но бывает что и соседняя срабатывает и иногда даже нижняя хотя как оно так накладывается хз

ReanДата: Воскресенье, 04 Декабря 2016, 01:49 | Сообщение # 5849
участник
Сейчас нет на сайте
ProsstoBRO, а ты маску спрайта настраивал?
ProsstoBROДата: Воскресенье, 04 Декабря 2016, 01:52 | Сообщение # 5850
был не раз
Сейчас нет на сайте
Rean, неа laugh . Я просто только второй день в GM, пробовал сначала на Libgdx написать, но там нажатия вообще сложно настроить тут оно хоть как то работает.

А что это за маска, как она и где работает? rolleyes

Плюсик уже кинул))


ReanДата: Воскресенье, 04 Декабря 2016, 01:58 | Сообщение # 5851
участник
Сейчас нет на сайте
ProsstoBRO,
Цитата ProsstoBRO ()
А что это за маска, как она и где работает?

Маска спрайта для коллизии: открываешь окно спрайта, там группа Collision Checking и кнопочка Modify Mask. По нажатию кнопки откроется ещё одно окно - окно настройки маски. В нём необходимо поработать с двумя группами: Bounding Box и Shape. В принципе, там всё очевидно. Попробуй настроить маску так, чтобы она попадала лишь на тот участок тайла, который не перекрывается (который всегда сверху).
Цитата ProsstoBRO ()
Плюсик уже кинул))

;)


Сообщение отредактировал Rean - Воскресенье, 04 Декабря 2016, 01:59
aedginvaelДата: Воскресенье, 04 Декабря 2016, 02:00 | Сообщение # 5852
был не раз
Сейчас нет на сайте
Rean, посмотрел твой файл... Как бы я хотел пару часов постоять рядом и по-задавать тупые вопросы... Может у тебя есть чего почитать для обучения? Кое что я сам нашел, но инфы очень мало. Сейчас искал по GUI, тоже только в английском. А я с ним никак не могу подружиться. Примерно смысл понял, но как взять координаты относительно окна - не нашел.
И да, за файл спасибо огромное. Сижу, ковыряю.


Сообщение отредактировал aedginvael - Воскресенье, 04 Декабря 2016, 02:27
ProsstoBROДата: Воскресенье, 04 Декабря 2016, 02:05 | Сообщение # 5853
был не раз
Сейчас нет на сайте
Rean, охх, спасибо вам огромное, всё работает как надо!!!! booze

Цитата Rean ()
Цитата ProsstoBRO ()
Плюсик уже кинул))

Ну типо репутация, там плюсик нажал, вооот




Сообщение отредактировал ProsstoBRO - Воскресенье, 04 Декабря 2016, 02:05
ReanДата: Воскресенье, 04 Декабря 2016, 02:32 | Сообщение # 5854
участник
Сейчас нет на сайте
aedginvael,
Цитата aedginvael ()
Может у тебя есть чего почитать для обучения?

К сожалению, всё что я могу порекомендовать - написано на английском. Самый полезный ресурс - это, безусловно, официальная документация. Редко бывает, когда кто-то может объяснить лучше создателя. Ещё, вроде как, есть какие-то книги по GM, но я не уверен переведены ли они на русский и есть ли подобная литература для актуальной версии студии. В любом случае, ковыряйте проекты, сами создавайте небольшие игры, задавайте вопросы, благо комьюнити здесь отзывчивое, в основном пытаются помочь ;) Ну и конечно, потихоньку "грызите" официальный мануал. Хоть он и на английском, но лучше вряд ли кто-то расскажет. Остальное - это уже игровая логика, механика и соответствующие алгоритмы, которые в основном не зависят от среды разработки.
Цитата aedginvael ()
но как взять координаты относительно окна - не нашел.

Здесь, на странице мануала, есть картинка, которая примерно объясняет функции положения и размера окна.
Стоит помнить, что отсчёт координат ведётся от верхнего левого угла. Соответственно, максимальный X в оконных координатах (правая граница окна) будет - window_get_width(), максимальный Y (нижняя граница окна) - window_get_height(). Если мы хотим отобразить что-то в DrawGUI, то нам необходимо уложиться в эти границы (от 0 до window_get_width() для X, и от 0 до window_get_height() для Y).

ProsstoBRO, отлично :)
aedginvaelДата: Воскресенье, 04 Декабря 2016, 02:48 | Сообщение # 5855
был не раз
Сейчас нет на сайте
Rean, посмотрел скрин. Прогуглил все, что на нем есть. Однако не понял, как привязать рисовку к этому?
Мне надо панель внизу экрана отрисовать. На ней дорисовать кнопки и т.д. Как все это привязать к окну?
ReanДата: Воскресенье, 04 Декабря 2016, 14:59 | Сообщение # 5856
участник
Сейчас нет на сайте
aedginvael, используя математические привязки. Например, у тебя есть панель. Сделаем у спрайта панели origin по центру снизу (если размер спрайта, к примеру, 200x100, то origin разместим в 100x100). Далее, при создании объекта панели, то есть в событии Create, нам необходимо обозначить её место:
Код

x = window_get_width() div 2; // По середине ширины окна
y = window_get_height();        // Внизу окна

Теперь у панели есть своё место, жёстко привязанное к размерам окна. Остаётся только нарисовать её в DrawGUI. А также необходимо создать простое событие Draw с пустым скриптом, чтобы ничего в нём не отрисовывать. Иначе получится две панели.

Второй вариант: использовать только метод Draw. Но тогда необходимо привязываться к view_xview[] и view_yview[]. Принцип тот же самый, только код надо добавлять в событие Step (чтобы обновлять положение панели каждый "тик" - имеет смысл, к примеру, для жанра RTS):
Код

x = view_xview[0] + view_wview[0] div 2;
y = view_yview[0] + view_hview[0];

В этом варианте работать с событиями Draw и DrawGUI не нужно - если объект имеет галочку в Visible, то он автоматически будет отрисовываться. Только не стоит забывать указать Depth поменьше - чтобы панелька рисовалась поверх остальных объектов.
В этих двух вариантах есть один "косяк", который косвенно проявился у ProsstoBRO: при нажатии на панель, если под ней будут объекты, которые тоже обрабатывают нажатие мыши, произойдёт нежелательная сработка. Чтобы этого избежать, потребуется перехватывать нажатия клавиш мыши.

Есть ещё третий вариант: настройка и view_xport[] и view_yport[]. По идеи, этот вариант должен решить проблему с нажатием объектов под панелью. Но он не подойдёт для маленькой панельки снизу, потому как требует, чтобы игровая зона (например, карта из Warcraft) была вписана внутрь интерфейса (пример - тот же Warcraft).


Сообщение отредактировал Rean - Воскресенье, 04 Декабря 2016, 15:21
aedginvaelДата: Воскресенье, 04 Декабря 2016, 15:42 | Сообщение # 5857
был не раз
Сейчас нет на сайте
Rean, я изначально и делал через draw. Но отрисованная панель отображалась в другом виде.
Сейчас попробую как ты написал.
ReanДата: Воскресенье, 04 Декабря 2016, 15:48 | Сообщение # 5858
участник
Сейчас нет на сайте
aedginvael, да, вспомнил, что у тебя несколько видов. Тогда через DrawGUI.
aedginvaelДата: Воскресенье, 04 Декабря 2016, 16:39 | Сообщение # 5859
был не раз
Сейчас нет на сайте
Rean,
Ну спрайт я не делал для нее, так что пока просто отрисовал прямоугольниками. Но уже работает как надо.
Это, если что, не игра, а просто испытательный проект, где я отрабатываю нужные мне моменты.
http://s1.uploadpics.ru/images/WJQEqqRGpb.jpg


Цитата Rean ()
aedginvael, да, вспомнил, что у тебя несколько видов. Тогда через DrawGUI.

У меня в этом изначально и была проблема. Панель отрисовывалась на миникарте =)


Сообщение отредактировал aedginvael - Воскресенье, 04 Декабря 2016, 16:42
ProsstoBROДата: Понедельник, 05 Декабря 2016, 00:09 | Сообщение # 5860
был не раз
Сейчас нет на сайте
Добрый вечер.
Кто-нибудь знает как сделать кнопку используя DrawGui?


Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Вопрос - Ответ (Game Maker) (Будут пополняться)
Поиск:

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