Суббота, 20 Апреля 2024, 06:25

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Почему-то неправильно рассчитывается столкновение (GM8, коллизия)
Почему-то неправильно рассчитывается столкновение
GameDev2Дата: Вторник, 28 Августа 2012, 19:55 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Здравствуйте!

У меня возникла проблема в GM8 с остановкой объекта при столкновении с другим.

Мне нужно, чтобы объект 1 (например, квадратик) останавливался с объектом 2 (другой квадратик). Представьте, летит квадратик 1 и врезается в квадратик 2. Мне нужно чтобы он остановился ровно вплотную, а он у меня останавливается за несколько пикселей до. Меняю маску спрайта, но не могу добиться ровной остановки: то перелетает, то недолетает. Т.е. настройка маски не реагирует на изменение 1-2 пикселя, меняю на больше – происходит неадекватный просчет и получается не то, что в цифрах.

Что-то делаю не так или почему в таком простом случае возникает проблема?

И почему у спрайта 32 пикселя настраивается маска на 31 пиксель? Т.е. на 1 пиксель меньше?

FadeBakerДата: Вторник, 28 Августа 2012, 20:18 | Сообщение # 2
JavaSE Game Developer
Сейчас нет на сайте
Как у тебя реализованы столкновения, в Step'e или через событие?
Quote (GameDev2)
Как сделать так, чтобы курсор пропадал через 10 секунд спокойствия мышки и чтобы появлялся при её новом движении? Можно ли такое в GM8?

Можно, но т.к. я многое забыл в GM, то могу только посоветовать почитать справку, там есть нужные тебе функции.
Псевдокод:
В Create объекта-контроллера:
Code
mouseOldX = mouse_x;
mouseOldY = mouse_y;
showCursor = true;
showTime = room_speed * 10;
alarm[0] = showTime;

В Step:
Code
if (showCursor) {
      //сюда вставляешь код для отображения/включения отображения курсора
}
if (mouseOldX != mouse_x || mouseOldY != mouse_y) {
      mouseOldX = mouse_x;
      mouseOldY = mouse_y;
      alarm[0] = showTime;
      showCursor = true;
}

В Alarm[0]:
Code
showCursor = false;


Уроки по GM
Minecraft 2D на GM
— Мои проекты —
Blood Harvest [2D] — Original
Blood Harvest [2D]: Remastered Edition
Adventure Craft [2D] — Sandbox
Space Shock [2D] — Scroll Shooter
Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.


Сообщение отредактировал Fade - Вторник, 28 Августа 2012, 20:20
GameDev2Дата: Вторник, 28 Августа 2012, 20:29 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Quote (Fade)
Как у тебя реализованы столкновения, в Step'e или через событие?

Через событие "столкновение".
SaladinДата: Вторник, 28 Августа 2012, 20:48 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Никак ты эту ошибку не исправишь. В гм движение осуществляется перемещением обьекта на определенное расстояние за шаг (перемещается мгновенно а не постепенно).

Если цель находится на расстоянии 10 пикселей от обьекта, а скорость обьекта 20, то гарантированно обьект пролетит мимо цели (если не "застрянет" в маске которая перекрывает расстояние пролета), если же цель на расстоянии 11 пикселей, а скорость обьекта 10, то обьект "застрянет" в маске за 1 пиксель до цели, или, если не застрянет, то пролетит мимо нее. Ну как то так.

Чтобы немного сгладить этот баг нужно понизить скорость перемещения обьекта или использовать физику из сторонних длл.

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


Анбаннэд. Хэлоу эгин =)
TLTДата: Вторник, 28 Августа 2012, 23:42 | Сообщение # 5
Сейчас нет на сайте
Quote (Saladin)
гм движение осуществляется перемещением обьекта на определенное расстояние за шаг (перемещается мгновенно а не постепенно).


Кстати, да. Из-за таких мелочей некоторые люди предпочитают не иметь дел с конструкторами. В GM система столкновений и мне не нравится.


Дао, выраженное словами, не есть истинное Дао.
SaladinДата: Вторник, 28 Августа 2012, 23:50 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
TLT, более точный расчет будет более ресурсоемким, а у ГМ и так проблемы с производительностью. Хотя да, можно было бы прикрутить как отключаемую опцию... В любом случае я когда начал использовать стороннюю физику - у меня проблема отпала.

Анбаннэд. Хэлоу эгин =)
TimKruzДата: Среда, 29 Августа 2012, 01:08 | Сообщение # 7
старожил
Сейчас нет на сайте
Не знаю, получится сделать такое в GM, но я бы делал так: перед смещением объекта на N пикселей, проверяем возможность столкновения в новой позиции, если нет столкновения - перемещаем на N пикселей, если столкновение - перемещаем ровно на столько пикселей (будет явно меньше N), сколько нужно до столкновения. Ну, то есть, рассчитываем расстояние от А до Б в пикселях, и если оно меньше требуемого смещения - смещаем на то, что осталось; например, смещали по 3 пикселя 99 пикселей из 100, а в конце осталось всего лишь на 1 пиксель сместить - как будто скорость уменьшилась, но такую мелочь на глаз заметить невозможно.
Либо сделать так: во время события столкновения (а оно уже после перемещения возникает) смещаем объект так, чтобы он встал ровно с тем, с которым столкнулся. Сделать это можно, постоянно запоминая предыдущую позицию и поворот, а во время столкновения рассчитывая наиболее удачную позицию между предыдущей и позицией объекта, с которым столкнулись...
Либо нужно делать и перемещения, и размеры масок ровно, например, спрайты 20x20 и 25x25 будут правильно обрабатываться на скорости 5 пикселей/кадр (при условии, что изначально были установлены в позициях, кратных 5, например [125,10] и [30,470]); но тут придётся всё подгонять, рассчитывать, какие должны быть размеры и какие скорости...
Впрочем, обычно ошибка в 1-2 пикселя не так уж существенна, если она не влияет на следующие движения объекта... wacko


FadeBakerДата: Среда, 29 Августа 2012, 01:36 | Сообщение # 8
JavaSE Game Developer
Сейчас нет на сайте
Можно в Step попробовать:
Code
spd = 500;
for (i = spd; i >= 0; i -= 1) {
    lx = x + lengthdir_x(i, direction);
    ly = y + lengthdir_y(i, direction);
    if (place_free(lx, ly)) {
       x = lx;
       y = ly;
       exit;
    }
}

Пули в TDS никогда не перелетали препятствия с этим кодом.


Уроки по GM
Minecraft 2D на GM
— Мои проекты —
Blood Harvest [2D] — Original
Blood Harvest [2D]: Remastered Edition
Adventure Craft [2D] — Sandbox
Space Shock [2D] — Scroll Shooter
Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Почему-то неправильно рассчитывается столкновение (GM8, коллизия)
  • Страница 1 из 1
  • 1
Поиск:

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