Воскресенье, 20 Мая 2018, 19:03

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker Studio » Противник при получении урона
Противник при получении урона
XmasterДата: Среда, 25 Апреля 2018, 16:59 | Сообщение # 1
был не раз
Сейчас нет на сайте
Я уже долго мучаюсь, но не могу понять, как сделать ,чтобы противник при столкновении с пулей отлетал в противоположную сторону?
gemcdДата: Среда, 25 Апреля 2018, 18:42 | Сообщение # 2
частый гость
Сейчас нет на сайте
спроси тут может помогут




сорри за оффтоп просто хотел быть активным
больше не буду
Abel399Дата: Среда, 25 Апреля 2018, 20:07 | Сообщение # 3
участник
Сейчас нет на сайте
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 лет, используйте на свой страх и риск, бла-бла-бла




Сообщение отредактировал Abel399 - Среда, 25 Апреля 2018, 20:11
XmasterДата: Четверг, 26 Апреля 2018, 16:23 | Сообщение # 4
был не раз
Сейчас нет на сайте
Я забыл написать, что игра жанра "Shoot ’em up" как "Enter the Gungeon"
Abel399Дата: Четверг, 26 Апреля 2018, 19:13 | Сообщение # 5
участник
Сейчас нет на сайте
Ну, собственно говоря, от этого ничего не меняется кроме отсутствия 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) )




Сообщение отредактировал Abel399 - Четверг, 26 Апреля 2018, 19:32
AlexanderBekkerДата: Четверг, 26 Апреля 2018, 20:46 | Сообщение # 6
участник
Сейчас нет на сайте
В 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);


Blood Harvest | Steam
Blood Harvest 2 | Steam
Blood Harvest 3 — Soon
Space Shock III: Backlash | Steam
BekkerDev Level Editor
Java-программист.
BekkerDev Studio
Abel399Дата: Пятница, 27 Апреля 2018, 11:45 | Сообщение # 7
участник
Сейчас нет на сайте
AlexanderBekker, с оговоркой, что power = dist_per_second / room_speed; (ускорение опустим)

Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker Studio » Противник при получении урона
  • Страница 1 из 1
  • 1
Поиск:

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