Helicopter moving

Hello fellow devs. I’ve run into something. I wrote this script which handles moving of part perfectly like , but I don’t take turning into account.

-- Made By GooierApollo664 
-- 11/07/2019

-- Services
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")

-- Variables 
local Heli = script.Parent.Parent
local GyroScope = script.Parent
local Thrust = Heli:FindFirstChild("BodyThrust")
local Reaction = Heli:FindFirstChild("BodyReaction")
local Force = Heli:FindFirstChild("BodyForce")

-- Physics Variables
local m = Heli:GetMass()
local g =  workspace.Gravity
local cf = CFrame.new()
local vector = Vector3.new()

-- Other 
local enum = Enum.KeyCode

-- Movement Table
local Movement = {[tostring(enum.T)] = CFrame.Angles(0, 0, math.rad(20)), 
				  [tostring(enum.F)] = CFrame.Angles(math.rad(10), 0, 0),	 
				  [tostring(enum.H)] = CFrame.Angles(math.rad(-10), 0, 0),
				  [tostring(enum.G)] = CFrame.Angles(0, 0, math.rad(-20)),
				  [tostring(enum.Y)] = Vector3.new(0, 100, 0),
				  [tostring(enum.R)] = Vector3.new(0, -100, 0)
				 }
-- Constants
local Keys = {[tostring(enum.T)] = cf,
			  [tostring(enum.F)] = cf,
			  [tostring(enum.G)] = cf,
			  [tostring(enum.H)] = cf,
			  [tostring(enum.Y)] = vector,
			  [tostring(enum.R)] = vector
			 }

-- The loop 
game:GetService("RunService").Stepped:Connect(function()
	
	local W = Keys[tostring(enum.T)] 
	local A = Keys[tostring(enum.F)] 
	local D = Keys[tostring(enum.G)] 
	local S = Keys[tostring(enum.H)] 
	local Y = Keys[tostring(enum.Y)] 
	local R = Keys[tostring(enum.R)] 
	
    -- Gravity work
	Thrust.Force = Vector3.new(0, 2*m*g, 0)
	Reaction.Force = -Vector3.new(0, m*g, 0)
	
	Heli.Velocity = Heli.Velocity - Heli.Velocity/10
	
	-- adding Force values
    Force.Force = R + Y 
	GyroScope.CFrame = W * A * S * D
end)

UserInputService.InputBegan:Connect(function(input)
		
	Keys[tostring(input.KeyCode)] = Movement[tostring(input.KeyCode)]
	
end)
	
UserInputService.InputEnded:Connect(function(input)
	
	Keys[tostring(input.KeyCode)] = cf 
		
end)

https://gyazo.com/3b81764428846bf1bf6ebf1d26342a7b

So I added few things to this code to make it turn using BodyAngularVelocity.

local AngularVelocity = Heli:FindFirstChild("BodyAngularVelocity")

-- Physics Variables
local m = Heli:GetMass()
local g =  workspace.Gravity
local cf = CFrame.new()
local vector = Vector3.new()

-- Other 
local enum = Enum.KeyCode

-- Movement Table
local Movement = {-- leaning Forward, Left, Right and back
				  [tostring(enum.T)] = {CFrame.Angles(0, 0, math.rad(-20)), Vector3.new(0,(m*g)/27, 0)}, 
				  [tostring(enum.R)] = {CFrame.Angles(math.rad(10), 0, 0), Vector3.new(0,(m*g)/67, 0)},	 
				  [tostring(enum.Y)] = {CFrame.Angles(math.rad(-10), 0, 0), Vector3.new(0,(m*g)/67, 0)},
				  [tostring(enum.G)] = {CFrame.Angles(0, 0, math.rad(20)), Vector3.new(0,(m*g)/17,0)},
				  -- Left And Right turn with angular velocity
				  [tostring(enum.H)] = {Vector3.new(0, -2, 0), 0},
				  [tostring(enum.F)] = {Vector3.new(0,2, 0), 0},
				  -- Up and Down
				  [tostring(enum.J)] = {Vector3.new(0, 100, 0), 0},
				  [tostring(enum.LeftShift)] = {Vector3.new(0, -100, 0), 0}
				 }

local Keys = {-- leaning Forward, Left, Right and back
	  	      [tostring(enum.T)] = {cf, vector},
			  [tostring(enum.R)] = {cf, vector},
			  [tostring(enum.Y)] = {cf, vector},
			  [tostring(enum.G)] = {cf, vector},
			  -- Left And Right turn with angular velocity
			  [tostring(enum.H)] = {vector, vector},
			  [tostring(enum.F)] = {vector, vector},
			  -- -- Up and Down		
			  [tostring(enum.J)] = {vector, vector},	
			  [tostring(enum.LeftShift)] = {vector, vector}
			 }

-- Constants
local Nulls = {-- leaning Forward, Left, Right and back
			   [tostring(enum.T)] = {cf, vector},
			   [tostring(enum.R)] = {cf, vector},
			   [tostring(enum.Y)] = {cf, vector},
			   [tostring(enum.G)] = {cf, vector},
			   -- Left And Right turn with angular velocity
			   [tostring(enum.F)] = {vector, vector},
			   [tostring(enum.H)] = {vector, vector},
			   -- Up and Down
 			   [tostring(enum.J)] = {vector, vector},	
 			   [tostring(enum.LeftShift)] = {vector, vector}			
			  }




-- The loop 
game:GetService("RunService").Stepped:Connect(function()
	local Position = Heli.Position
	local dir = Heli.CFrame.LookVector
	
	local W = Keys[tostring(enum.T)]
	local A = Keys[tostring(enum.F)] 
	local S = Keys[tostring(enum.G)]
	local D = Keys[tostring(enum.H)] 
	local Y = Keys[tostring(enum.Y)] 
	local R = Keys[tostring(enum.R)] 
	local J = Keys[tostring(enum.J)]
	local Shift = Keys[tostring(enum.LeftShift)]
	
	-- Reaction Force
	Thrust.Force = Vector3.new(0, 2*m*g, 0)
	Reaction.Force = -Vector3.new(0, m*g, 0)
	
	-- Friction/Resistance
	Heli.Velocity = Heli.Velocity - Heli.Velocity/10
	
	-- adding Force/CFrame values
	AngularVelocity.AngularVelocity =  A[1] + D[1]
	Force.Force = J[1] + Shift[1] + W[2] + S[2] + R[2] + Y[2] 
	
	GyroScope.CFrame = W[1] * S[1] * R[1] * Y[1]
end)

UserInputService.InputBegan:Connect(function(input)
		
	Keys[tostring(input.KeyCode)] = Movement[tostring(input.KeyCode)]
	
end)
	
UserInputService.InputEnded:Connect(function(input)
	
	Keys[tostring(input.KeyCode)] = Nulls[tostring(input.KeyCode)]
		
end)

https://gyazo.com/af5d7a647b6b5968c30082a264119ba2

Here I added another Table to hold nulls, that I call values which should be applied when helicopter is stopped(or no key is pressed, to be precise). The problem I have to solve, is that I should rotate Gyro based on lookVector and constantly update it, but I have trouble figuring out how to do it with this code. I came up with this solution

function Cframe(x, z) 
	
	if x or z then
		
		return CFrame.Angles(x, 0, z)
	else
		return CFrame.Angles(0, 0, 0)
	end

end

this is the function I made which would replace cframe.Angles in tables.

local Movement = {-- leaning Forward, Left, Right and back
				  [tostring(enum.T)] = {Cframe, Vector3.new(0,(m*g)/27, 0)}, 
				  [tostring(enum.R)] = {Cframe, Vector3.new(0,(m*g)/67, 0)},	 
				  [tostring(enum.Y)] = {Cframe, Vector3.new(0,(m*g)/67, 0)},
				  [tostring(enum.G)] = {Cframe, Vector3.new(0,(m*g)/17,0)},
				  -- Left And Right
				  [tostring(enum.H)] = {Vector3.new(0, -2, 0), 0},
				  [tostring(enum.F)] = {Vector3.new(0,2, 0), 0},
				  -- Up and Down
				  [tostring(enum.J)] = {Vector3.new(0, 100, 0), 0},
				  [tostring(enum.LeftShift)] = {Vector3.new(0, -100, 0), 0}
				 }

local Keys = {-- leaning Forward, Left, Right and back
	  	      [tostring(enum.T)] = {cf, vector},
			  [tostring(enum.R)] = {cf, vector},
			  [tostring(enum.Y)] = {cf, vector},
			  [tostring(enum.G)] = {cf, vector},
			  -- Left And Right turn with angular velocity
			  [tostring(enum.H)] = {vector, vector},
			  [tostring(enum.F)] = {vector, vector},
			  -- -- Up and Down		
			  [tostring(enum.J)] = {vector, vector},	
			  [tostring(enum.LeftShift)] = {vector, vector}
			 }

-- Constants
local Nulls = {-- leaning Forward, Left, Right and back
			   [tostring(enum.T)] = {cf, vector},
			   [tostring(enum.R)] = {cf, vector},
			   [tostring(enum.Y)] = {cf, vector},
			   [tostring(enum.G)] = {cf, vector},
			   -- Left And Right turn with angular velocity
			   [tostring(enum.F)] = {vector, vector},
			   [tostring(enum.H)] = {vector, vector},
			   -- Up and Down
 			   [tostring(enum.J)] = {vector, vector},	
 			   [tostring(enum.LeftShift)] = {vector, vector}			
			  }


local dir = heli.CFrame.LookVector

local W = Keys[tostring(enum.T)]
local S = Keys[tostring(enum.G)]
local Y = Keys[tostring(enum.Y)]
local R = Keys[tostring(enum.R)]

GyroScope.CFrame = W[1](-(dir.X), -(dir.Z)) * S[1](dir.X, dir.Z) * R[1] * Y[1]


UserInputService.InputBegan:Connect(function(input)
		
	Keys[tostring(input.KeyCode)] = Movement[tostring(input.KeyCode)]
	
end)
	
UserInputService.InputEnded:Connect(function(input)
	
	Keys[tostring(input.KeyCode)] = Nulls[tostring(input.KeyCode)]
		
end) 

The problem with this is, that if I release W key or S Key, in Nulls Table first element is just CFrame.new() so passing arguments like that is not possible.

Maybe there’s some methods I don’t know(which there clearly are), or I’m missing something obvious. Note:I use T, R, Y, G, H, F and J keys in tables, because WASD are not available in studio Run test mode.

27 Likes

Maybe you could make a seperate CFrame for the turning and then do the first CFrame * ROTCF

PS: If i understand you correctly you are talking about the turning stopping when you go forward