Game Maker - Как да създам ефект на самонасочване за снаряд?

Опитвам се да направя самонасочващ се снаряд за моята игра bullet hell и трябва да мога да изчисля ъгъла между целта и снаряда спрямо ъгъла на снаряда (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