找回密码
 注册账号

要事发布区,所有人都可以发布+ 发布

05-10 02:22
admin论坛刚恢复,数据还停留在23年,好的最新资源全没了
05-09 19:07
admin岛上不方便有事,请加QQ群:923175595
05-09 19:07
查看: 667|回复: 0

子弹追踪思路搬

[复制链接]

子弹追踪思路搬

[复制链接]
雷霆嘎巴

主题

0

回帖

616

积分

版主

积分
616
2021-10-18 02:48:26 来自手机 | 显示全部楼层 |阅读模式

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

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

×
首先,本文讨论的是很简单的算法。高手莫入。
; u# ?; K6 {' @5 M7 X首先回忆几个三角函数sin,cos,tan(tg),arctan(arctg)
3 Q( ^2 _# f& u9 n! isin(x)—对边/斜边。在1,2项限为正,3,4项限为负
9 v6 |) z4 \  a, o& y+ k# s2 C$ ucos(x)—邻边/斜边。在1,4项限为正,2,3项限为负2 I; F# O0 Y- b  y  a, ]8 X% k; c9 ~
tan(x)—对边/邻边。在1,3项限为正,2,4项限为负) Z! F6 i! C. I- {. L# }. _5 [

$ q% U" r6 |: ^: @考虑到游戏里面的坐标系如下所示:* m  w  \* K3 R. b& u6 q- ~/ D
假设敌人子弹的坐标为slug.x,slug.y,子弹的速度为slug.speed(全部是double型)
" ?  M5 A7 B& k8 [# @9 V+ a
/ n. i& _6 s$ p# M- c# l上面的三角形的斜边就代表子弹的速度,则子弹每次移动的时候座标的改变为:" P" J# f6 C" }) ~2 v4 q
' ~  A+ m3 W; Z3 \$ o
    slug.x += slug.speed * cos(theta);
4 M. A3 E. ~7 }& W    slug.y += slug.speed * sin(theta);
* x1 y1 m, Z! h6 @+ B: B0 j2 q
5 o$ E0 P6 n: h! g在敌人子弹向你发射过来的时候,首先要计算子弹位置与你所在的位置所夹的角度theta8 ]  ~: O# k3 x- G

8 v, n; k7 r; ^. F3 \$ U简单计算就是:
: J/ D5 h" |) a( x
9 J+ R: d7 z: G; k4 Y- b4 ?& ?    double deltax = player.x - slug.x; // 注意,、是以主角位置为起点 在上图中表示就是x1-x05 g5 \2 j" P2 t7 K/ a6 R
    double deltay = player.y - slug.y; // y1-y0
0 g* c& B+ u5 Z
  l/ D. x5 M% U" g0 c9 Q为了防止在相除的时候分母为0,做一个判断,使分母近似为0,究竟是负的近似还是正的近似呢?这就需要比较子弹和你的Y坐标谁大谁小了。% U' p/ B( F( b
* N; e  J  x3 M" p
if( deltax == 0 )
9 |$ V+ q" g5 ~6 k{
, y1 b, V( {* h- C: ?" }    if( player.y >= slug.y )             // 子弹需要下移
" T+ e8 r! z9 p: p+ a  o: V        deltax = 0.0000001;# U7 t- _" W, G4 P
    else                                 // 子弹需要上移& [- L9 a9 U/ M  f4 V* O+ S
        deltax = -0.0000001;6 x8 v& q3 N2 v" l$ ?
}. _  ]! C  A* w

' G9 L5 [8 u- ]7 l( x; t+ W; [同理,对deltay作判断
0 S; M; U+ q' x  B  N3 P" J
3 M/ W1 M, i- G" N2 mif( deltay == 0 )
# s* X( c2 ?- a3 w4 U, C2 `{
7 ?9 X6 S' g. P% Z6 Z    if( player.x >= slug.x )             // 子弹需要右移
$ [4 F2 I0 i3 [) R" x        deltay = 0.0000001;2 ~+ I* G' O% g/ J3 q. a
    else                                 // 子弹需要左移7 U8 @8 N& U6 x5 c; R
        deltay = -0.0000001;! k; I9 T4 P3 P' K
}
6 m, x( G: h6 }! N4 x1 c: @
# E( M0 x2 g% }! |/ a3 ?' B, Z$ {现在对角度所处的项限作判断
; F2 S$ _/ L# w5 Z% {
: E& x$ `! J+ J: O5 ?. L0 l$ cif( deltax>0 && deltay>0 )7 U! l& J) ^8 u  Y+ g
    angle = atan(fabs(deltay/deltax));           // 第一项限  l! }, c" q: u$ R( A

  R4 e6 Q/ P- Y8 \. J2 P2 y6 welse if( deltax0 && deltay0 )# m8 c4 z+ |: c* o
    angle = π-atan(fabs(deltay/deltax))          // 第二项限4 t+ y; s% h9 I0 H9 v" p
. C  h5 }* V( a& o, g0 u6 s; e" ?
else if( deltax0 && deltay0 )                    + P, I1 t7 i; z* B$ Z% S6 |
    angle = π+atan(fabs(deltay/deltax))          // 第三项限  J3 Q1 p- h! W6 E! ~; H1 _
9 R8 u% _) ?4 _; R; K; N0 C
else  {) f& I( t2 A9 Y
    angle = 2π-atan(fabs(deltay/deltax))         // 第四项限
8 V& m+ H# P. ?8 t/ r7 s# X; ?) D/ ~9 P  G* P! ^: Z, B  n
其中π取3.1415926…………(呵呵,别忘记近似哦)
$ n' v/ S' C. ~2 i  V好了,现在已经得到正确的方向了,可以计算子弹坐标了!7 o2 R  v6 M  v0 I% l
% E- d5 R, e$ A! M( M5 U
slug.x += slug.speed * cos(theta);
- ~) X  _: {9 wslug.y += slug.speed * sin(theta);. o# N( D) _% S: I
3 N/ i9 Z" R& k+ M, i! p! v
这样,每次子弹移动之前做一下判断,重新计算角度
4 X5 c2 T5 {. I4 g& f( r很多玩过飞行射击类游戏的朋友都对跟踪导弹印象深刻,手中有这样一款武器常常能够战无不胜,但是敌人射出的导弹则可能成为玩家的噩梦。其实实现导弹跟踪的方法并不复杂,只需要一些简单的平面解析几何知识就可以做到。4 G4 j6 ]! h' g) Y
. z7 v+ R9 ^7 r8 X' U
算法分析$ e3 x. c5 D2 g$ o3 D$ l
假设导弹旋转角速度为omega,运动速度为v。下图显示了导弹和目标在坐标轴中的初始状态。; @. L2 d% T& t3 O: z; Q3 p
9 w( U7 D9 b$ h2 r! m9 [5 l6 ?
初始时刻,目标与导弹的运动方向都是-Y,位置分别为(x1,y1),(x2,y2),连接导弹与目标的坐标,得到一条线段,该线段与-Y轴夹角为c;导弹与-Y方向的夹角为b,b是导弹已旋转的角度,此时为0;导弹方向与线段的夹角为a,a就是导弹还需要旋转的角度。此时:
! S7 I) k3 C( h" W% l, r- {2 s# H" m. P
c=90-Math.atan2(y2-y1,x2-x1)*180/Math.PI;, k0 t6 j- ^+ T4 S  Z; A
b=0;( }! U3 ?8 A0 e) B
a=c-b;  M0 G+ U- x# e; I6 q  v

; y, d% M5 Y! Z  b. u6 c, ^; Q为了方便计算将c转换为360度以内的正值:3 ?; B3 n, y% ?/ s: K/ Z
/ i. {- |( F0 D) \" l
c=(270+Math.atan2(y2-y1,x2-x1)*180/Math.PI)%360;
  [& n4 Z# N" D+ \
6 v% |/ V" H* y. U2 H$ D注:非原创,搬砖
IMG_20211017_193657.jpg
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|分享岛论坛1fxd.cn-延续发现岛 |

GMT+8, 2025-5-12 05:23

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复