December 04, 2020, 11:06:36 AM

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

Offline 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#)
  36.                 'coefficients of quadratic equation
  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


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal