December 04, 2020, 11:06:36 AM

### Author Topic: [bmx] Fly by wire by Warpy [ 1+ years ago ]  (Read 553 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bmx] Fly by wire by Warpy [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : Fly
Author : wire by Warpy
Posted : 1+ years ago

Description : If you add sideways thrusters to an Asteroids-type ship, you can pull off much nicer moves.

This code works out, given the direction the ship would like to be heading in, how much power to give to each of the thrusters.

Code :
Code: BlitzMax
1. Const maxspeed#=3
2. Type ship
3.         Field x#,y#,vx#,vy#
4.         Field angle#
5.
6.         Method update()
7.                 angle:+(KeyDown(KEY_RIGHT)-KeyDown(KEY_LEFT))*5
8.                 thrust#=(KeyDown(KEY_UP)-KeyDown(KEY_DOWN))
9.                 v#=Sqr(vx*vx+vy*vy)
10.
11.                 If thrust
12.                         ax#=Cos(angle)*thrust*maxspeed-vx
13.                         ay#=Sin(angle)*thrust*maxspeed-vy
14.                 ElseIf v>maxspeed
15.                         ax#=vx*(maxspeed/v-1)
16.                         ay#=vy*(maxspeed/v-1)
17.                 EndIf
18.                 a#=Sqr(ax*ax+ay*ay)
19.                 accelerate ax,ay
20.
21.                 If KeyDown(KEY_SPACE)
22.                         vx:*5/v
23.                         vy:*5/v
24.                 EndIf
25.
26.                 x:+vx
27.                 y:+vy
28.
29.                 If x<0 x:+600
30.                 If x>600 x:-600
31.                 If y<0 y:+600
32.                 If y>600 y:-600
33.         End Method
34.
35.         Method accelerate(ax#,ay#)
37.                 a#=ax*ax+ay*ay
38.                 b#=2*(ax*vx+ay*vy)
39.                 c#=vx*vx+vy*vy-maxspeed*maxspeed
40.                 f#=Sqr(b*b-4*a*c)
41.
42.                 'find two solutions of quadratic equation
43.                 lambda1#=(-b+f)/(2*a)
44.                 lambda2#=(-b-f)/(2*a)
45.
46.                 'pick either biggest value of lambda, or 1, whichever is smallest.
47.                 'this is the same as trying to apply the biggest allowed thrust, but limiting it to 1 if the picked value is too much
48.                 lambda#=Min(Max(lambda1,lambda2),1)
49.
50.                 'apply acceleration to velocity
51.                 ax:*lambda
52.                 ay:*lambda
53.
54.                 a#=Sqr(ax*ax+ay*ay)
55.
56.                 Const limit#=.01
57.                 If a>limit
58.                         ax:*limit/a
59.                         ay:*limit/a
60.                 EndIf
61.                 vx:+ax
62.                 vy:+ay
63.
64.                 SetColor 255,0,0
65.                 DrawLine x,y,x+ax*500*lambda,y+ay*500*lambda
66.
67.         End Method
68.
69.         Method draw()
70.                 SetColor 255,255,255
71.                 ox#=x+Cos(angle-120)*5
72.                 oy#=y+Sin(angle-120)*5
73.                 For an=0 To 360 Step 120
74.                         px#=x+Cos(angle+an)*5
75.                         py#=y+Sin(angle+an)*5
76.                         DrawLine ox,oy,px,py
77.                         ox=px
78.                         oy=py
79.                 Next
80.                 DrawLine x,y,x+Cos(angle)*10,y+Sin(angle)*10
81.
82.                 v#=Sqr(vx*vx+vy*vy)
83.                 DrawText "v:  "+v,0,0
84.
85.                 dp1#=(Cos(angle)*vx+Sin(angle)*vy)/v
86.                 DrawText "dp: "+Abs(dp1),0,15
87.         End Method
88. End Type
89.
90. Graphics 600,600,0
91. s:ship=New ship
92. s.x=300
93. s.y=300
94. While Not (KeyHit(KEY_ESCAPE) Or AppTerminate())
95.         s.update
96.         s.draw
97.         Flip
98.         Cls
99. Wend