找回密码
 注册账号
查看: 1447|回复: 0

子弹追踪思路搬

[复制链接]
发表于 2021-10-18 02:48:26 来自手机 | 显示全部楼层 |阅读模式

岛友你还没有注册勒.注册可以注册可以查看更多资源哦~

您需要 登录 才可以下载或查看,没有账号?注册账号

×
首先,本文讨论的是很简单的算法。高手莫入。
9 `) \7 F7 a. ^% x6 M首先回忆几个三角函数sin,cos,tan(tg),arctan(arctg)
6 l" d; O" j3 M2 L2 asin(x)—对边/斜边。在1,2项限为正,3,4项限为负
& M- Z) s9 g; Z% Y1 D( \cos(x)—邻边/斜边。在1,4项限为正,2,3项限为负. H2 U! k# J' Y5 V' u3 w0 p( N
tan(x)—对边/邻边。在1,3项限为正,2,4项限为负
( y  B, z/ v, j1 E  P  U) F7 ~! f+ b; s8 d% p
考虑到游戏里面的坐标系如下所示:' b- i( l' o- I3 e! V* a
假设敌人子弹的坐标为slug.x,slug.y,子弹的速度为slug.speed(全部是double型)
9 c  ^. K! ?! v; C' |8 h6 K) ~$ m, ]  o) \1 \/ S- U
上面的三角形的斜边就代表子弹的速度,则子弹每次移动的时候座标的改变为:
1 V! |5 w  X% Y6 q( C0 k4 ?
' g! r% k0 c2 i! J6 W/ t# S    slug.x += slug.speed * cos(theta);5 I6 \. Q( @" v" W9 x
    slug.y += slug.speed * sin(theta);, T/ w2 n" i) }7 N( S6 I, `

' k& F0 i2 g: ?- Z1 M在敌人子弹向你发射过来的时候,首先要计算子弹位置与你所在的位置所夹的角度theta
+ d+ l% x6 m9 H7 }# J+ O9 q
4 K- s) i9 M% ~5 F* u: h简单计算就是:7 B9 Y' @' w" O. t! M

# R- b3 m0 ^4 ~" P    double deltax = player.x - slug.x; // 注意,、是以主角位置为起点 在上图中表示就是x1-x0
7 E9 o: O" [. Z" R  m) f+ X+ u    double deltay = player.y - slug.y; // y1-y04 L6 A, |" ]! L" I. \) |6 v, z
) j- o8 N) i8 D' T3 U( {
为了防止在相除的时候分母为0,做一个判断,使分母近似为0,究竟是负的近似还是正的近似呢?这就需要比较子弹和你的Y坐标谁大谁小了。8 k5 A4 K# `- I, P, _4 u8 k4 v! R9 Y
8 W5 H) }; A0 z1 H  O$ E
if( deltax == 0 )
8 t$ e6 @- I6 R% G3 i{
* Z+ S1 M) w. S; L0 g    if( player.y >= slug.y )             // 子弹需要下移) e9 @$ @) ]: ~! Z& Z; \
        deltax = 0.0000001;
5 |& X* J- k: U' |" `% w5 `4 }    else                                 // 子弹需要上移
* S- c7 C# X  }' h8 U# R, q        deltax = -0.0000001;" {' Z+ r0 B, Q! T
}
; `3 F6 J% [) ?/ ?; s/ T/ ?) A. J" w, Z, o. y
同理,对deltay作判断. i8 n# {  F. H; B

1 c3 [0 W- d0 N. O  P6 W( oif( deltay == 0 )7 u' ~% W* g1 ?2 I
{2 z, J8 q; B' `& E3 @! b
    if( player.x >= slug.x )             // 子弹需要右移% q) Z3 _" J8 t3 X; P3 i
        deltay = 0.0000001;
! n  J- g, p' t  K* A4 ]    else                                 // 子弹需要左移2 G4 e4 m: A4 d0 Z( ^( `
        deltay = -0.0000001;1 e! ^0 g' E- e/ N. h3 E7 k
}9 {5 h0 s3 h# s2 k9 D0 z, Q# s3 K
2 z% d6 |2 {, o, Y' @/ X
现在对角度所处的项限作判断2 w# O* j- E; z- J7 e9 S$ w
% x! G( }7 m! Q$ J
if( deltax>0 && deltay>0 ); t( Y5 Y( M& T" t
    angle = atan(fabs(deltay/deltax));           // 第一项限
$ @8 G, ~+ H/ H; j0 z- t3 x& M- X  E$ x1 a4 [
else if( deltax0 && deltay0 )6 r. c" K; \- B1 ]) f
    angle = π-atan(fabs(deltay/deltax))          // 第二项限& s, z3 a9 g+ |6 g
9 d/ P/ z8 U* A+ `
else if( deltax0 && deltay0 )                    
: t8 I+ c4 E6 m, p8 V    angle = π+atan(fabs(deltay/deltax))          // 第三项限  J, {! g' _) r& m4 V9 J
# ]+ B, W5 T; K" L' N5 O( ]
else
' |: k  O. k! b! m3 @2 h" U    angle = 2π-atan(fabs(deltay/deltax))         // 第四项限
4 V+ {" t7 s% b# y8 O8 m( X: j( M! D9 P4 }
其中π取3.1415926…………(呵呵,别忘记近似哦)
: u! w2 J) b2 H1 g2 ?  l" T8 ]好了,现在已经得到正确的方向了,可以计算子弹坐标了!
* o. K2 d+ }' f9 F( T0 K) d: I% }$ f# v2 K3 W
slug.x += slug.speed * cos(theta);+ N: y. F" w; }/ B  j4 }
slug.y += slug.speed * sin(theta);
7 [+ _/ [" V) Y+ A4 J9 I3 c. P; F+ `) T6 m& I3 ^6 \0 G+ I; x$ P' B
这样,每次子弹移动之前做一下判断,重新计算角度
5 g7 M4 ^3 v7 Y2 ^! H- c很多玩过飞行射击类游戏的朋友都对跟踪导弹印象深刻,手中有这样一款武器常常能够战无不胜,但是敌人射出的导弹则可能成为玩家的噩梦。其实实现导弹跟踪的方法并不复杂,只需要一些简单的平面解析几何知识就可以做到。, ^: r( U8 u% L9 E% o2 W8 ^! G
( v5 @" b+ g5 r1 O
算法分析. r3 n. ^5 W6 u) W
假设导弹旋转角速度为omega,运动速度为v。下图显示了导弹和目标在坐标轴中的初始状态。: ^  {$ n* r: A* ?
8 g% \5 T9 s7 i0 b
初始时刻,目标与导弹的运动方向都是-Y,位置分别为(x1,y1),(x2,y2),连接导弹与目标的坐标,得到一条线段,该线段与-Y轴夹角为c;导弹与-Y方向的夹角为b,b是导弹已旋转的角度,此时为0;导弹方向与线段的夹角为a,a就是导弹还需要旋转的角度。此时:
: E; J3 S/ v" J; P1 B/ g6 P. w1 [1 a: P( X6 L. E: V
c=90-Math.atan2(y2-y1,x2-x1)*180/Math.PI;
; V3 r0 V1 `& [* T6 ]# s3 nb=0;
! K0 J/ Z& x$ U; G5 o/ T7 T* ~" va=c-b;6 A* o* V( {8 j4 Q' I
3 t6 J; A7 [! C: @
为了方便计算将c转换为360度以内的正值:3 v8 ~3 p. @* k
( z; x/ s' Q. M! k$ }1 P1 F! u
c=(270+Math.atan2(y2-y1,x2-x1)*180/Math.PI)%360;" i8 m. M% K; M. }( f/ H

; X6 w6 f& o9 A6 b5 _/ f7 A注:非原创,搬砖
IMG_20211017_193657.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|Archiver|手机版|小黑屋|发现岛辅助论坛_Www.FxdaO.CoM-辅助网 |网站地图

GMT+8, 2024-12-4 01:14

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表