Thunderbeam/muraduki長文欄

むらづきのブログ(三代目)

偏差射撃、続き

05/10/20より。shinichiro_hさんのコメントを参考に、というか、ほぼ丸写しで作ってみました。

{
    s = argument0;
    vx = Player.hspeed;
    vy = Player.vspeed;
    dx = Player.x - x;
    dy = Player.y - y;
    if (dx == 0 or dy == 0)
    {
        sx = sign(dx);
        sy = sign(dy);
    }
    else
    {
        d = dy / dx;
        d2 = d * d;
        b = d2*vx-d*vy;
        pm = sqrt(b*b+(1+d2)*(s*s+2*vx*vy*d-vy*vy-d2*vx*vx));
        if (dx < 0){pm = -pm};
        sx = (b+pm)/(1+d2);
        d = dx / dy;
        d2 = d * d;
        b = d2*vy-d*vx;
        pm = sqrt(b*b+(1+d2)*(s*s+2*vy*vx*d-vx*vx-d2*vy*vy));
        if (dy < 0){pm = -pm};
        sy = (b+pm)/(1+d2);
    }
}

point_direction(0,0,sx,sy)の方向に弾を発射します。
もし弾自身の方にスクリプトを持たせるなら

{
    s = argument0;
    vx = Player.hspeed;
    vy = Player.vspeed;
    dx = Player.x - x;
    dy = Player.y - y;
    if (dx == 0 or dy == 0)
    {
        hspeed = sign(dx) * argument0;
        vspeed = sign(dy) * argument0;
        if (dx == 0 and dy == 0){vspeed = argument0;}
    }
    else
    {
        d = dy / dx;
        d2 = d * d;
        b = d2*vx-d*vy;
        pm = sqrt(b*b+(1+d2)*(s*s+2*vx*vy*d-vy*vy-d2*vx*vx));
        if (dx < 0){pm = -pm};
        hspeed = (b+pm)/(1+d2);
        d = dx / dy;
        d2 = d * d;
        b = d2*vy-d*vx;
        pm = sqrt(b*b+(1+d2)*(s*s+2*vy*vx*d-vx*vx-d2*vy*vy));
        if (dy < 0){pm = -pm};
        vspeed = (b+pm)/(1+d2);
    }
}

式の内容について十分に把握(理解)していない(…)のですが、ちゃんと動かせました。
ただ、命中率は前回の最後に書いたやつより多少劣るようです。
その理由については色々と推測できそうですが、まあとりあえずは一件落着で。