Game Maker - Как создать эффект самонаведения для снаряда?

Я пытаюсь сделать самонаводящийся снаряд для своей игры с пулями, и мне нужно будет рассчитать угол между целью и снарядом относительно угла снаряда (0 градусов будет направлением, на которое указывает снаряд). Прямо сейчас расчет угла выполняется с помощью point_direction, но проблема в том, что когда цель находится в 4-м секторе, снаряд начинает лететь не в ту сторону. Другая проблема заключается в том, что если снаряд совершает поворот на 180 градусов во время погони за целью (или движется вниз, если его обстреливает противник), направление наведения изменится на противоположное. Я также пробовал функции mp_potential_, но их поиск пути слишком "агрессивен".

введите здесь описание изображения

Вот как выглядит мой текущий код:

if(instance_exists(obj_fighter1)) {
    var target;
    target = instance_nearest(x, y, obj_fighter1);

    if(target != noone) {
        var angle_to_target;
        angle_to_target = point_direction(x,y,target.x,target.y);

        if(angle_to_target < direction) {
            direction -= 2;
        }

        if(angle_to_target > direction) {
            direction += 2;
        }
    }
}

Надеюсь, этой информации достаточно и она понятна.


person Community    schedule 20.08.2015    source источник


Ответы (1)


Хорошо, обычный вопрос Game Maker. Процедура, которую я использую, приведена ниже. Глядя на это, можно было бы немного рефакторинга, но это работает.

var wantDir;
var currDir;
var directiondiff;
var maxTurn;

// want - this is your target direction \\
wantDir = argument0;

// max turn - this is the max number of degrees to turn \\
maxTurn = argument1;

// current - this is your current direction \\
currDir = direction;

if (wantDir >= (currDir + 180))
{
    currDir += 360;
}
else
{
    if (wantDir < (currDir - 180))
    {
        wantDir += 360;
    }
}

directiondiff = wantDir - currDir;

if (directiondiff < -maxTurn)
{
    directiondiff = -maxTurn
}

if (directiondiff > maxTurn)
{
    directiondiff = maxTurn
}

return directiondiff

Итак, вы вызовете это, и оно вернет вам значение, которое вы можете добавить к углу вашей ракеты. Поэтому, если вы назовете его scr_get_angle, ваш код может выглядеть так:

if(instance_exists(obj_fighter1)) {
    var target;
    target = instance_nearest(x, y, obj_fighter1);

    if(target != noone) {
        var angle_to_target;
        angle_to_target = point_direction(x,y,target.x,target.y);

        direction += scr_get_angle(angle_to_target, 2);
    }
}
person PugFugly    schedule 21.08.2015