Противник при получении урона
| |
Xmaster | Дата: Среда, 25 Апреля 2018, 16:59 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Я уже долго мучаюсь, но не могу понять, как сделать ,чтобы противник при столкновении с пулей отлетал в противоположную сторону?
|
|
| |
gemcd | Дата: Среда, 25 Апреля 2018, 18:42 | Сообщение # 2 |
частый гость
Сейчас нет на сайте
| спроси тут может помогут
|
|
| |
Abel399 | Дата: Среда, 25 Апреля 2018, 20:07 | Сообщение # 3 |
Surpass your limits. Right now.
Сейчас нет на сайте
| gemcd, с GcUp все настолько плохо, что здесь нет людей способных ответить на банальщину?... (а вообще не лучший способ продвижения сайта) Xmaster, obj_enemy, столкновение с пулей (объект):
Код // Первый вариант, предполагается, что для obj_enemy заданы gravity и friction, либо имеется их ручной аналог в Step vspeed = -FACTOR; // FACTOR - некоторое значение, "высота подлета", может быть константой, либо же инлайн-функцией, если необходимо hspeed = sign(other.hspeed) * other.speed / DIVIDER; // DIVIDER - делим на коэффициент, т.к. скорость пули как правило много выше необходимой для "импульса", либо же sign(other.hspeed) * CONST, если дальность не зависит от скорости пули // Второй вариант, использование встроенной физики: [url=https://docs.yoyogames.com/source/dadiospice/002_reference/physics/forces/physics_apply_impulse.html]physics_apply_impulse[/url] physics_apply_impulse(x, y, other.x * FACTOR, other.y * FACTOR); // FACTOR - константа, функция или other.speed / DIVIDER // Третий вариант предполагает использование собственной реализации физики (изменение x и y, а также постепенное затухание вектора импульса) // Крайне не рекомендуется impulse_x = sign(other.hspeed) * other.speed / DIVIDER; impulse_y = -FACTOR; // В степ должны быть операции по изменению x += impulse_x и y += impulse_y, и логика работы с вектором импульса Это если у вас пуля - объект. В реальности так не делают, вернее говоря - огнестрельные снаряды с высокой скоростью не являются объектами. Почему? Накладные расходы, эффект "проскакивания" и т.п. obj_shootable, Keypress, step, whatever u want:
Код var shoot_x, shoot_y; shoot_x = ...; shoot_y = ...; with (obj_enemy) { if ( collision_line(other.x, other.y, shoot_x, shoot_y, id, false, false) != noone && collision_line(other.x, other.y, x, y, obj_obstacle, false, false) == noone ) // для полного счастья вместо x и y должна быть точка пересечения прямой и маски объекта { physics_apply_impulse(x, y, shoot_x, shoot_y); // или любой другой метод } }
P.S> Код не протестирован, в гамаке не был уже > 3 лет, используйте на свой страх и риск, бла-бла-бла
Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Среда, 25 Апреля 2018, 20:11 |
|
| |
Xmaster | Дата: Четверг, 26 Апреля 2018, 16:23 | Сообщение # 4 |
был не раз
Сейчас нет на сайте
| Я забыл написать, что игра жанра "Shoot ’em up" как "Enter the Gungeon"
|
|
| |
Abel399 | Дата: Четверг, 26 Апреля 2018, 19:13 | Сообщение # 5 |
Surpass your limits. Right now.
Сейчас нет на сайте
| Ну, собственно говоря, от этого ничего не меняется кроме отсутствия gravity. Это позволяет использовать еще один способ:
Код // Необходимо задать friction, либо ручками прописать в step direction = other.direction; // либо же 90, если seu вертикальный онли direction = (direction + 180) mod 360; // не лучший вариант, но все же direction = point_direction(collision_x, collision_y, x, y); // Иногда может понадобиться такой вариант, 1 и 2 аргументы зависят от подхода к столкновениям speed = POWER; // Некоторая константа или функция // Кстати, если вертикальный seu, то можно сделать еще проще: hspeed = 0; vspeed = -POWER; Примерный код для Step (не эталон):
Код var movement_x, movement_y; // исходные значения направления и скорости движения, к которым стремится obj_enemy if ( abs(movement_y - vspeed) > EPS ) { // Не делаем лишних вычислений, EPS - константа, например, 1e-10 vspeed += (movement_y - vspeed) * DELAY / room_speed; // DELAY - время в секундах на восстановление, можно поэкспериментировать с поведением анимации, т.к. сейчас используется "ease-out" метод } else { vspeed = movement_y; } if ( abs(movement_x - hspeed) > EPS ) { // Не делаем лишних вычислений hspeed += (movement_x - hspeed) * DELAY / room_speed; } else { hspeed = movement_x; }
P.S> Кстати, не помню, но если hspeed и vspeed автоматически не вычисляются по известным speed и direction, то юзайте:
Код hspeed = lengthdir_x(speed, direction); vspeed = lengthdir_y(speed, direction); // либо так direction = point_direction(0, 0, hspeed, vspeed); // либо arctan2(vspeed, hspeed) speed = point_distance(0, 0, hspeed, vspeed); // либо sqrt( sqr(hspeed) + sqr(vspeed) )
Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Четверг, 26 Апреля 2018, 19:32 |
|
| |
AlexanderBekker | Дата: Четверг, 26 Апреля 2018, 20:46 | Сообщение # 6 |
BekkerDev Studio
Сейчас нет на сайте
| В Create объекту противника:
Код knockbackX = 0; knockbackY = 0; В Step:
Код x += knockbackX; y += knockbackY; knockbackX *= 0.9; // 0.9 — скорость затухания импульса (чем меньше значение, тем быстрее) knockbackY *= 0.9; В событие столкновения с пулей:
Код dir = point_direction(other.x, other.y, x, y); knockbackX += lengthdir_x(power, dir); // где power — сила отбрасывания knockbackY += lengthdir_y(power, dir);
Разработчик, композитор и издатель инди-игр в Steam. Редактор карт: BekkerDev Level Editor 4 Страница разработчика в Steam Паблик ВК: BekkerDev Studio
|
|
| |
Abel399 | Дата: Пятница, 27 Апреля 2018, 11:45 | Сообщение # 7 |
Surpass your limits. Right now.
Сейчас нет на сайте
| AlexanderBekker, с оговоркой, что power = dist_per_second / room_speed; (ускорение опустим)
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |
|