Понедельник, 11 Ноября 2024, 09:12

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Проблемы с маской спрайта при взаимодействии с объектами сте
Lev_NickolaevichДата: Понедельник, 16 Апреля 2018, 18:04 | Сообщение # 1
был не раз
Сейчас нет на сайте
Здравствуйте!
Проблема такова: мой объект игрока цепляется за углы объектов стен. Так как игра будет в стиле TDS, то это будет очень бесячим моментом.
Как можно решить эту проблему?

Об объектах


Код:


UPD:
В общем, я решил подзаморочиться и решил, что мне надо сделать "отскок" на 1 px от места столкновения маски со стеной, так как спрайт больше овальный, нежели круглый.
Написал такой код на объекте игрока при столкновении со стеной:

И вот надо мной смеется GMS:
1) Если крутится у правой стороны стены, то всё работает как надо - игрок отодвигается от стены при столкновении маски игрока со стеной.
2) Крутится у левой стороны стены НУЖНО медленно, иначе тебя перекидывает по ту сторону стены.
3) Касаться нижней и верхней стороны стены "опасно"! - при малейшем столкновении тебя кидает в левую сторону.
Если закомментировать всё, кроме одной строки, то работает только на одной стороне (логично), но и при прикосновении к другим сторонам стены тебя сразу кидает на эту рабочую сторону.
Изображение:


Спасите мой мозг, plz!

UPD2: Забыл черкнуть, что маска теперь - овальная. Но я продолжаю "насиловать" GML
1.

Игра просто при столкновении зависатет наметрво. Убивается только через диспетчер задач. При дебагинге замтеил, что игра не может выйти из моего while
2.

Вот бы хорошо бы было, если бы GMS2 при наличии столкновения всегда вызывал этот скрипт. Но нет - он вызывает его только один раз и больше не хочет. При медленном столкновении игрок отодвигается. При быстром столкновении "бок" игрока заезжает в стену. А это в свою очередь блокирует код движения выше.

Эксперименты продолжаются!


http://vk.com/lev_nickolaevich

Сообщение отредактировал Lev_Nickolaevich - Вторник, 17 Апреля 2018, 11:14
ДанилаСтержневДата: Понедельник, 16 Апреля 2018, 19:22 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Квадратную маску сделай

Красочная сюжетно ориентированная игра-головоломка
Lev_NickolaevichДата: Понедельник, 16 Апреля 2018, 20:22 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата ДанилаСтержнев ()
Квадратную маску сделай

ДанилаСтержнев, не вариант. Так как объект вращается вокруг оси, маска квадрата цепляется даже за прямые стены.
Код
//Sprite Rotation
direction = point_direction(x, y, mouse_x, mouse_y);   //Mouse position
image_angle = direction;        //Rotare sprite to mouse


http://vk.com/lev_nickolaevich

Сообщение отредактировал Lev_Nickolaevich - Понедельник, 16 Апреля 2018, 20:44
AlexanderBekkerДата: Вторник, 17 Апреля 2018, 08:05 | Сообщение # 4
BekkerDev Studio
Сейчас нет на сайте
Lev_Nickolaevich, image_angle вращает и маску объекта, в этом и проблема. Объяви переменную "angle" в Create и в Step пропиши "angle = direction". Затем используй её в Draw в качестве аргумента угла поворота одной из расширенных функций рисования спрайта (draw_sprite_ext).

Разработчик, композитор и издатель инди-игр в Steam.
Редактор карт: BekkerDev Level Editor 4
Страница разработчика в Steam
Паблик ВК: BekkerDev Studio


Сообщение отредактировал AlexanderBekker - Вторник, 17 Апреля 2018, 08:22
Lev_NickolaevichДата: Вторник, 17 Апреля 2018, 10:51 | Сообщение # 5
был не раз
Сейчас нет на сайте
AlexanderBekker, вот в том-то и проблема, что маска и помогает мне определить, где происходит столкновение (забыл черкнуть, что маска овальная уже, +1 к греху на душу)

draw_sprite_ext же вращает изображение без маски.

У меня такое чувство, что я накосячил просто с while


http://vk.com/lev_nickolaevich

Сообщение отредактировал Lev_Nickolaevich - Вторник, 17 Апреля 2018, 11:05
AlexanderBekkerДата: Вторник, 17 Апреля 2018, 11:28 | Сообщение # 6
BekkerDev Studio
Сейчас нет на сайте
Lev_Nickolaevich, игрок застревает из-за маски, потому что её края при повороте вписываются в твёрдые объекты. Поэтому нужно создать отдельную переменную, которая будет отвечать за визуальный поворот спрайта, передав её в функцию draw_sprite_ext вместо стандартной image_angle, которая нигде не должна изменяться.

Разработчик, композитор и издатель инди-игр в Steam.
Редактор карт: BekkerDev Level Editor 4
Страница разработчика в Steam
Паблик ВК: BekkerDev Studio
Lev_NickolaevichДата: Вторник, 17 Апреля 2018, 13:00 | Сообщение # 7
был не раз
Сейчас нет на сайте
AlexanderBekker, способ с draw_sprite_ext будет работать при круглой маске. И он работает, я проверил!
Но у меня маска овальная. Поэтому получается, что спрайт игрока залезает в стены, что я бы не хотел. Причем у меня получилось сделать так как я хочу, но почему-то работало только с одной стороны (UPD1 /\).
Неужели GMS2 просто не проработан в плане кастомных масок? :'(


http://vk.com/lev_nickolaevich
Quad69Дата: Вторник, 17 Апреля 2018, 18:32 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Попробуй так:
Код

while(!place_free(x - 1, y) and place_free(x + 1, y)) x++;
while(!place_free(x + 1, y) and place_free(x - 1, y)) x--;
while(!place_free(x, y - 1) and place_free(x, y + 1)) y++;
while(!place_free(x, y + 1) and place_free(x, y - 1)) y--;

Добавлено (17 Апреля 2018, 18:32)
---------------------------------------------

ChristopherДата: Среда, 18 Апреля 2018, 23:23 | Сообщение # 9
участник
Сейчас нет на сайте
Используй спрайт с заливкой одного цвета как маску для обьекта, тогда вращение будет засчитыватсья и у маски и у спрайта в одинаковом углу
Была такая проблема при отрисовке изометрического столкновения.
  • Страница 1 из 1
  • 1
Поиск:

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