POsted after the deadline, but I made some changes anyway. Just go by my last post. But this is a little more fun to play. The gravity and momentum calcs are all messed up and I can't seem to get what the problem is. Anyway, it works. Hint: Use the [M] & [O] keys to keep the lander falling at a safe speed. Then use the [A] & [D] keys to navigate left and right. Carefull, if you hit too far off the pad, or at a bad angle, or too fast, you crash. Also careful witht he M & O keys - you pretty much have to hit them at the same time or else you will navigate the ship forward and backward. If all that's a little too much, just lower the gravity a bit.
Sync On:Sync Rate 0:Autocam Off
#Constant VelMomentum 1
#Constant SpinMomentum 2
#Constant ShipPos 3
Null=Make Vector3(VelMomentum)
Null=Make Vector3(SpinMomentum)
Null=Make Vector3(ShipPos)
Global LastTime as Dword
Global CycleTime as DWord
Global TimeFactor as Float
Global Grav as Float
Global Fric as Float
Global Thrust as Float
Grav=-32
Fric=.9998
Make_Ship(1)
Set Object Collision On 1
Do
Position Object 1,0,50,80
Rotate Object 1,0,0,0
Set_Vector_To_Object( ShipPos ,1)
Make_Landing_Pad(2,-15,-30,75,20,20)
Do
`Control Ship
Thrust = ( ka + kd + ko + km) * TimeFactor * 15.0
`Right Thruster
Set Vector3 SpinMomentum , VX (SpinMomentum), VY (SpinMomentum), VZ (SpinMomentum)- ka * TimeFactor * 10.0
if ka Then Fire_Particle(1,8)
`Left Thruster
Set Vector3 SpinMomentum , VX (SpinMomentum), VY (SpinMomentum), VZ (SpinMomentum)+ kd * TimeFactor * 10.0
if kd Then Fire_Particle(1,6)
`Close Thruster
Set Vector3 SpinMomentum , VX (SpinMomentum)+ km * TimeFactor * 10.0, VY (SpinMomentum), VZ (SpinMomentum)
if km Then Fire_Particle(1,7)
`Far Thruster
Set Vector3 SpinMomentum , VX (SpinMomentum)- ko * TimeFactor * 10.0, VY (SpinMomentum), VZ (SpinMomentum)
if ko Then Fire_Particle(1,5)
`Apply spin momentum
Rotate Object 1, OAX (1) + VX (SpinMomentum) * TimeFactor , OAY (1) + VY (SpinMomentum)* TimeFactor , OAZ (1) + VZ (SpinMomentum)* TimeFactor
`Apply Thrust
Move Object Up 1,Thrust
`Apply Momentum
x#= VX (VelMomentum)*timefactor: y#= VY (VelMomentum)*timefactor : z# = VZ (VelMomentum)*timefactor
Position Object 1, OPX (1) + x#, OPY (1) + y#, OPZ (1) + z#
`Apply Gravity
Position Object 1, OPX (1), OPY (1) + Grav*TimeFactor , OPZ (1)
`Update Momentum
mx#= (OPX (1) - VX (ShipPos))
my#= (OPY (1) - VY (ShipPos))
mz#= (OPZ (1) - VZ (ShipPos))
Set Vector3 VelMomentum , mx# , my# , mz#
Set_Vector_To_Object( ShipPos ,1)
Move_Particles()
L=Check_Landing(2)
If Abs(L)>0 then Exit
Update_Cycle_Time
Set Cursor 0,0
Print "Falling Velocity: ";VY (VelMomentum)
Sync
Loop
Delete Objects 1000,2000
Do
Set Cursor 0,0
If L<0
Print "You Have Landed Safely"
Else
Print "You Have Crashed"
Endif
Print
Print "Press the Space Key to continue"
Print OPX (1)< OPX (2) - (Object Size X(2)/2.0)
Print OPX (1)> OPX (2) + (Object Size X(2)/2.0)
Print OPZ (1)< OPZ (2) - (Object Size Z(2)/2.0)
Print OPZ (1)> OPZ (2) + (Object Size Z(2)/2.0)
If Spacekey() Then Exit
Sync
Loop
Set Vector3 1,0,0,0
Set Vector3 2,0,0,0
Set Vector3 3,0,0,0
Loop
Function Set_Vector_To_Object(Vector,obj)
Set Vector3 Vector, OPX (obj), OPY (obj), OPZ (obj)
Endfunction
Function Make_Ship(obj)
Make Object Cylinder obj,1
Make Mesh From Object 1,obj
Delete Object obj
Make Object Sphere obj,4.5
Add Limb obj,1,1
Scale Limb obj,1,100,300,100
Rotate Limb obj,1,90,0,0
Offset Limb obj,1,0,0,3.5
Add Limb obj,2,1
Scale Limb obj,2,100,300,100
Rotate Limb obj,2,90,0,0
Offset Limb obj,2,0,0,-3.5
Add Limb obj,3,1
Scale Limb obj,3,100,300,100
Rotate Limb obj,3,0,0,90
Offset Limb obj,3,-3.5,0,0
Add Limb obj,4,1
Scale Limb obj,4,100,300,100
Rotate Limb obj,4,0,0,90
Offset Limb obj,4,3.5,0,0
For i = 0 to 3
Add Limb obj,5+i,1
Scale Limb obj,5+i,100,400,100
x#=Sin(i*90.0)*4.5:z#=Cos(i*90.0)*4.5
Offset Limb obj,5+i,x#,-1.5,z#
Next i
Set Object Cull obj,0
Endfunction
Function Make_Landing_Pad(Obj,px#,py#,pz#,sx#,sz#)
If Object Exist(obj) Then Delete Object obj
Make Object Box Obj,sx#,.5,sz#
Position Object Obj,px#,py#,pz#
Endfunction
Function Check_Landing(PadObj)
If OPY (1)<-50 Then ExitFunction 1
If Object Collision(1,PadObj)=0 Then ExitFunction 0
Crash=-1
If Abs( OAX (1))>10 Then Crash=1
If Abs( OAZ (1))>10 Then Crash=1
If Abs( VY (VelMomentum))> .01 Then Crash=1
If OPX (1)< OPX (PadObj) - (Object Size X(PadObj)/2.0) then Crash=1
If OPX (1)> OPX (PadObj) + (Object Size X(PadObj)/2.0) then Crash=1
If OPZ (1)< OPZ (PadObj) - (Object Size Z(PadObj)/2.0) then Crash=1
If OPZ (1)> OPZ (PadObj) + (Object Size Z(PadObj)/2.0) then Crash=1
If Crash = -1 Then Rotate Object 1,0, OAY (1),0
Endfunction Crash
Function Roll_Object_Right(obj,ang#)
Rotate Object obj, OAX (obj), OAY (obj), OAZ (obj)-ang#
Endfunction
Function Roll_Object_Left(obj,ang#)
Rotate Object obj, OAX (obj), OAY (obj), OAZ (obj)+ang#
Endfunction
Function Turn_Object_Right(obj,ang#)
Rotate Object obj, OAX (obj), OAY (obj)-ang#, OAZ (obj)
Endfunction
Function Turn_Object_Left(obj,ang#)
Rotate Object obj, OAX (obj), OAY (obj)+ang#, OAZ (obj)
Endfunction
Function Pitch_Object_Down(obj,ang#)
Rotate Object obj, OAX (obj)+ang#, OAY (obj), OAZ (obj)
Endfunction
Function Pitch_Object_Up(obj,ang#)
Rotate Object obj, OAX (obj)-ang#, OAY (obj), OAZ (obj)
Endfunction
Function Fire_Particle(Obj,Limb)
P=Free_Particle()
If P=0 Then Exitfunction
Position Object P,Limb Position X(obj,limb) + (rand * 2.0 - 1.0),Limb Position Y(obj,limb) - 2.0,Limb Position Z(obj,limb) + (rand * 2.0 - 1.0)
Rotate Object P,Limb Direction X(obj,limb)+90,Limb Direction Y(obj,limb),Limb Direction Z(obj,limb)
Endfunction
#Constant Move_Particles Move_Particles()
Function Move_Particles()
For i = 1000 to 2000
If Object Exist(i)
If Object Visible(i)
Move Object i,.1
Roll Object Right i,2
Offset Limb i,0,0,Limb Offset Y(i,0)-.01,0
if i = 1000
Print Limb Offset Y(i,0)
Endif
If Limb Offset y(i,0)<-.5
Hide Object i
Offset Limb i,0,0,0,0
Endif
Endif
Endif
Next i
Endfunction
#Constant Free_Particle Free_Particle()
Function Free_Particle()
Flag=0
For i = 1000 to 2000
If Object Exist(i)=0
Make_Particle(i)
Flag=1
Exit
Else
If Object Visible(i)=0
Show Object i
Flag=1
Exit
Endif
Endif
Next i
i=Flag*i
Endfunction i
Function Make_Particle(P)
Make Object Triangle P, -.5,1,0, 0,0,0, 0.2,1,0.2
If Image Exist(1000)=0
Box 0,0,64,64,RGB(128,0,0),RGB(128,128,0),RGB(255,128,0),RGB(211,224,254)
For i = 1 to 200
Dot Rnd(64),Rnd(64),Rgb(255,0,0)
Next i
Get Image 1000,0,0,64,64,0
Endif
Texture Object P,1000
Set Object Cull P,0
Ghost Object On P
Set Object Emissive P,Rgb(255,100,100)
Endfunction
#Constant Update_Cycle_Time :CycleTime=Timer()-LastTime:LastTime=Timer():TimeFactor=CycleTime/1000.0:If TimeFactor>.99:TimeFactor=.99:Endif:
#Constant rand Rnd(10000.0)/10000.0
`keystate abreviations
#Constant k1 keystate(2)
#Constant k2 keystate(3)
#Constant k3 keystate(4)
#Constant k4 keystate(5)
#Constant k5 keystate(6)
#Constant k6 keystate(7)
#Constant k7 keystate(8)
#Constant k8 keystate(9)
#Constant k9 keystate(10)
#Constant k0 keystate(11)
#Constant ka keystate(30)
#Constant kb keystate(48)
#Constant kc keystate(46)
#Constant kd keystate(32)
#Constant ke keystate(18)
#Constant kf keystate(33)
#Constant kg keystate(34)
#Constant kh keystate(35)
#Constant ki keystate(23)
#Constant kj keystate(36)
#Constant kk keystate(37)
#Constant kl keystate(38)
#Constant km keystate(50)
#Constant kn keystate(49)
#Constant ko keystate(24)
#Constant kp keystate(25)
#Constant kq keystate(16)
#Constant kr keystate(19)
#Constant ks keystate(31)
#Constant kt keystate(20)
#Constant ku keystate(22)
#Constant kv keystate(47)
#Constant kw keystate(17)
#Constant kx keystate(45)
#Constant ky keystate(21)
#Constant kz keystate(44)
#Constant OAX Object Angle X
#Constant OAY Object Angle Y
#Constant OAZ Object Angle Z
#Constant OPX Object Position X
#Constant OPY Object Position Y
#Constant OPZ Object Position Z
#Constant VX X Vector3
#Constant VY Y Vector3
#Constant VZ Z Vector3
Open MMORPG: It's your game!