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