Simple Vectors in Blitz3D

Started by 3DzForMe, July 19, 2017, 05:26:58

Previous topic - Next topic

3DzForMe

Just in case peeps are struggling with which language to code their asteroids style game in, here's some sweet code that works well demonstrating one way to skin the 'Vectors' cat within blitz 3D / blitz basic  ;D



;FULL credit to betties art for the following functions:

;    http://www.bettiesart.com/tc/blitz/


; Example of space physics using vector translation (Method A)
; ---------------------------------------------------------------------------- ;
; Demonstrates the use of angle, thrust, heading and velocity

;Function prog4 ()
    Graphics 640 , 480
    SetBuffer BackBuffer()

    ; Keyboard scancodes
KeyCursorUp%    = 200
KeyCursorDown%  = 208
KeyCursorLeft%  = 203
KeyCursorRight% = 205
KeyEscape%      =   1
KeySpace%       =  57

    ; Craft specifications
ThrustMax# = 0.1  ; Maximum thrust speed
SpeedMax# = 5     ; Maximum allowed velocity
RotateMax# = 4    ; Maximum rotation speed (degrees)

    ; Craft related
    PosX# = GraphicsWidth() / 2   ; Start at center of screen
    PosY# = GraphicsHeight() / 2  ;
    Thrust#  = 0  ; Current thrust speed - in the direction of where the ship is pointing at
    Angle%   = 0  ; Current angle (rotation) - where the ship is pointing at
    Speed#   = 0  ; Current actual speed of the ship
    Heading% = 0  ; Current heading - where the ship is moving towards (degrees)

    ; Logic related
    Local Thrusting% = False  ; Thrusts forwards/backwards when True, automatically decelerates thrust when False
    Local VelocityX# = 0  ; Temporary variables for calculating the new velocity vector
    Local VelocityY# = 0  ;

    Repeat
Cls

If KeyDown( KeyCursorLeft ) Then Angle = Angle - RotateMax  ; Rotate anti-clockwise
If KeyDown( KeyCursorRight ) Then Angle = Angle + RotateMax  ; Rotate clockwise
If Angle < 0 Then Angle = Angle + 360  ; Make sure angle is in range of 0-359 (shift)
If Angle > 359 Then Angle = Angle - 360

Thrusting = False  ; Automatically decelerate thrust - reset thrusting flag
If KeyDown( KeyCursorUp ) Then  ; Cursor up held down
Thrust = ThrustMax  ; Start thrusting forwards at max speed
Thrusting = True  ; Do not decelerate thrust
EndIf
If KeyDown( KeyCursorDown ) Then  ; Cursor down held down
Thrust = -ThrustMax  ; Start thrusting backwards at max speed
Thrusting = True  ; Do not decelerate thrust
EndIf
If Not Thrusting Then Thrust = 0  ; Automatically decelerate thrusting when not thrusting (on request)

      ; Note:
      ;   Speed & Heading = Current velocity vector [ VelocityX VelocityY ]
      ;   Thrust & Angle = Current thrust vector [ ThrustX ThrustY ]
VelocityX = VectorX( Speed , Heading ) + VectorX( Thrust , Angle )  ; The new velocity vector is the sum of
VelocityY = VectorY( Speed , Heading ) + VectorY( Thrust , Angle )  ; the current velocity and thrust vector
Speed = VectorDistance( VelocityX , VelocityY )   ; Translate back to speed and heading
Heading = VectorAngle( VelocityX , VelocityY )  ;
If Speed > SpeedMax Then Speed = SpeedMax  ; Limit speed to maximum

If KeyDown( KeySpace ) Then Speed = 0  ; Handbrake

PosX = PosX + VectorX( Speed , Heading )  ; Update horizontal position with current horizontal velocity inc.
If PosX < 0 Then PosX = PosX + GraphicsWidth()  ; Warp if off-screen
If PosX >= GraphicsWidth() Then PosX = PosX - GraphicsWidth()
PosY = PosY + VectorY( Speed , Heading )  ; Same for vertical
If PosY < 0 Then PosY = PosY + GraphicsHeight()
If PosY >= GraphicsHeight() Then PosY = PosY - GraphicsHeight()

Color 0 , 127 , 255  ; Additional information
Oval PosX - 10 , PosY - 10 , 21 , 21 , True
Text 0 , 0 * FontHeight() , "X: " + Int(PosX) + " Y: " + Int(PosY)
Color 127 , 255 , 127
Line PosX , PosY , PosX + VectorX( 10 , Heading ) , PosY + VectorY( 10 , Heading )
Text 0 , 1 * FontHeight() , "Speed: " + Int(Speed) + " Heading: " + Heading
Color 255 , 255 , 255
Line PosX , PosY , PosX + VectorX( 20 , Angle ) , PosY + VectorY( 20 , Angle )
Text 0 , 2 * FontHeight() , "Thrust: " + Thrusting + " Angle: " + Angle

Flip
    Until KeyDown( KeyEscape )

    EndGraphics
    End
;End Function


;FULL credit to betties art for the following functions:

;    http://www.bettiesart.com/tc/blitz/

;=======================================================

; For those of you (including me)
    ; who don't like doing all the maths
    ; every time and time again :P
    ;
    ;= Get horizontal size of vector using distance and angle

Function VectorX# ( Distance# , Angle# )
Return Sin ( Angle ) * Distance
End Function

    ;= Get vertical size of vector using distance and angle

Function VectorY# ( Distance# , Angle# )
Return Sin ( Angle - 90 ) * Distance
End Function

    ;= Get true length of a vector

Function VectorDistance# ( X# , Y# )
Return Sqr ( X * X + Y * Y )
End Function

    ;= Get true angle of a vector

Function VectorAngle# ( X# , Y# )
Return -ATan2 ( X , Y ) + 180
End Function
    ;



BLitz3D, IDEal, AGK Studio, BMax, Java Code, Cerberus
Recent Hardware: Dell Laptop
Oldest Hardware: Commodore Amiga 1200 with 1084S Monitor & Blitz Basic 2.1

MagosDomina

Most excellent, thanks for posting this!

3DzForMe

BLitz3D, IDEal, AGK Studio, BMax, Java Code, Cerberus
Recent Hardware: Dell Laptop
Oldest Hardware: Commodore Amiga 1200 with 1084S Monitor & Blitz Basic 2.1

RobFarley

In Blitz3D, rather than using 2D maths, this stuff is much easier (so this is going from memory when I programmed blitz about 10 years ago!)... Just create an entity at 0,0,0 call it origin, create an entity for your thrust vector, then you can apply a force to your thrust entity be it a transpose or rotate and move... The resultant movement will be the x / z coordinate of your thrust vector. To add dampening, simply point it at the origin and move it forwards... faster it moves towards the origin the more dampening you have.

Something like that anyway!
Cheers, Rob