Cookbook (Chapter 7): Difference between revisions
>JulienDethurens No edit summary |
>JulienDethurens No edit summary |
||
(5 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{Map|Cookbook}} | |||
==Introduction== | ==Introduction== | ||
One of the key concepts in programming in ROBLOX is positioning. Chapter 2 was dedicated entirely to positioning and positioning systems. Now we're going to take it a step further and talk about moving. ROBLOX provides a ridiculous amount of so called “Body” objects that control movement and rotation. | One of the key concepts in programming in ROBLOX is positioning. Chapter 2 was dedicated entirely to positioning and positioning systems. Now we're going to take it a step further and talk about moving. ROBLOX provides a ridiculous amount of so called “Body” objects that control movement and rotation. | ||
Line 12: | Line 13: | ||
===Solution=== | ===Solution=== | ||
Use the BodyPosition object. | Use the BodyPosition object. | ||
{{ | {{lua|= | ||
local b = Instance.new('BodyPosition') | local b = Instance.new('BodyPosition') | ||
b.maxForce = Vector3.new(math.huge, math.huge, math.huge) | b.maxForce = Vector3.new(math.huge, math.huge, math.huge) | ||
b.position = Vector3.new(10, 10, 10) | b.position = Vector3.new(10, 10, 10) | ||
b.Parent = Workspace.Part | b.Parent = Workspace.Part | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 28: | Line 29: | ||
===Solution=== | ===Solution=== | ||
Use the BodyVelocity object. | Use the BodyVelocity object. | ||
{{ | {{lua|= | ||
local b = Instance.new('BodyVelocity') | local b = Instance.new('BodyVelocity') | ||
b.maxForce = Vector3.new(math.huge, math.huge, math.huge) | b.maxForce = Vector3.new(math.huge, math.huge, math.huge) | ||
b.velocity = Vector3.new(0, 10, 0) | b.velocity = Vector3.new(0, 10, 0) | ||
b.Parent = Workspace.Part | b.Parent = Workspace.Part | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 44: | Line 45: | ||
===Solution=== | ===Solution=== | ||
Use the BodyAngularVelocity object. | Use the BodyAngularVelocity object. | ||
{{ | {{lua|= | ||
local b = Instance.new('BodyAngularVelocity') | local b = Instance.new('BodyAngularVelocity') | ||
b.maxTorque = Vector3.new(math.huge, math.huge, math.huge) | b.maxTorque = Vector3.new(math.huge, math.huge, math.huge) | ||
b.angularvelocity = Vector3.new(0, 10, 0) | b.angularvelocity = Vector3.new(0, 10, 0) | ||
b.Parent = Workspace.Part | b.Parent = Workspace.Part | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 60: | Line 61: | ||
===Solution=== | ===Solution=== | ||
Use the BodyGyro object. | Use the BodyGyro object. | ||
{{ | {{lua|= | ||
local b = Instance.new('BodyGyro') | local b = Instance.new('BodyGyro') | ||
b.maxTorque = Vector3.new(math.huge, math.huge, math.huge) | b.maxTorque = Vector3.new(math.huge, math.huge, math.huge) | ||
b.cframe = CFrame.new(0, 10, 0) | b.cframe = CFrame.new(0, 10, 0) | ||
b.Parent = Workspace.Part | b.Parent = Workspace.Part | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 76: | Line 77: | ||
===Solution=== | ===Solution=== | ||
Use the D property. | Use the D property. | ||
{{ | {{lua|= | ||
local b = Instance.new('BodyPosition') | local b = Instance.new('BodyPosition') | ||
b.maxForce = Vector3.new(math.huge, math.huge, math.huge) | b.maxForce = Vector3.new(math.huge, math.huge, math.huge) | ||
Line 82: | Line 83: | ||
b.D = 20 | b.D = 20 | ||
b.Parent = Workspace.Part | b.Parent = Workspace.Part | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 93: | Line 94: | ||
===Solution=== | ===Solution=== | ||
Use the P property. | Use the P property. | ||
{{ | {{lua|= | ||
local b = Instance.new('BodyPosition') | local b = Instance.new('BodyPosition') | ||
b.maxForce = Vector3.new(math.huge, math.huge, math.huge) | b.maxForce = Vector3.new(math.huge, math.huge, math.huge) | ||
Line 99: | Line 100: | ||
b.P = 100 | b.P = 100 | ||
b.Parent = Workspace.Part | b.Parent = Workspace.Part | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 110: | Line 111: | ||
===Solution=== | ===Solution=== | ||
Use the BodyForce object controlled with the force property. | Use the BodyForce object controlled with the force property. | ||
{{ | {{lua|= | ||
local b = Instance.new('BodyForce') | local b = Instance.new('BodyForce') | ||
b.force = Vector3.new(0, 5000, 0) | b.force = Vector3.new(0, 5000, 0) | ||
b.Parent = Workspace.Part | b.Parent = Workspace.Part | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 125: | Line 126: | ||
===Solution=== | ===Solution=== | ||
Use the BodyThrust object controlled with the force property. | Use the BodyThrust object controlled with the force property. | ||
{{ | {{lua|= | ||
local b = Instance.new('BodyThrust') | local b = Instance.new('BodyThrust') | ||
b.force = Vector3.new(0, 5000, 5000) | b.force = Vector3.new(0, 5000, 5000) | ||
b.location = Vector3.new(0, 100, 100) | b.location = Vector3.new(0, 100, 100) | ||
b.Parent = Workspace.Part | b.Parent = Workspace.Part | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 141: | Line 142: | ||
===Solution=== | ===Solution=== | ||
Use Weld object. | Use Weld object. | ||
{{ | {{lua|= | ||
local w = Instance.new('Weld', Workspace) | local w = Instance.new('Weld', Workspace) | ||
w.Part0 = Workspace.Player.Head | w.Part0 = Workspace.Player.Head | ||
w.Part1 = Instance.new('Part', Workspace) | w.Part1 = Instance.new('Part', Workspace) | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 156: | Line 157: | ||
===Solution=== | ===Solution=== | ||
Use C0 and C1 properties. | Use C0 and C1 properties. | ||
{{ | {{lua|= | ||
local w = Instance.new('Weld', Workspace) | local w = Instance.new('Weld', Workspace) | ||
w.Part0 = Workspace.Player.Head | w.Part0 = Workspace.Player.Head | ||
w.Part1 = Instance.new('Part', Workspace) | w.Part1 = Instance.new('Part', Workspace) | ||
w.C0 = CFrame.new(10, 0, 0) | w.C0 = CFrame.new(10, 0, 0) | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 172: | Line 173: | ||
===Solution=== | ===Solution=== | ||
Use the DesiredAngle property. | Use the DesiredAngle property. | ||
{{ | {{lua|= | ||
Workspace.Player.Animate.Disabled = true | Workspace.Player.Animate.Disabled = true | ||
Workspace.Player.Torso['Right Shoulder'].DesiredAngle = -math.pi | Workspace.Player.Torso['Right Shoulder'].DesiredAngle = -math.pi | ||
wait(1) | wait(1) | ||
Workspace.Player.Animate.Disabled = false | Workspace.Player.Animate.Disabled = false | ||
}} | |||
===Discussion=== | ===Discussion=== | ||
Line 188: | Line 189: | ||
===Solution=== | ===Solution=== | ||
Use the [[MaxVelocity]] property. | Use the [[MaxVelocity]] property. | ||
{{ | {{lua|= | ||
Workspace.Player.Animate.Disabled = true | Workspace.Player.Animate.Disabled = true | ||
Workspace.Player.Torso['Right Shoulder'].DesiredAngle = -math.pi | Workspace.Player.Torso['Right Shoulder'].DesiredAngle = -math.pi | ||
Line 194: | Line 195: | ||
wait(1) | wait(1) | ||
Workspace.Player.Animate.Disabled = false | Workspace.Player.Animate.Disabled = false | ||
}} | |||
===Discussion=== | ===Discussion=== |
Latest revision as of 23:27, 27 February 2012
Introduction
One of the key concepts in programming in ROBLOX is positioning. Chapter 2 was dedicated entirely to positioning and positioning systems. Now we're going to take it a step further and talk about moving. ROBLOX provides a ridiculous amount of so called “Body” objects that control movement and rotation.
One way to simulate movement is to interpolate between two positions, however this gets messy when trying to do rotations and more complex movement. That's the advantage of using these body objects.
Later in this chapter we will also look at connection objects like Welds and Motors. These are used to do attachment and rotation.
Moving to a Position
Problem
You want to get a part to move to another position.
Solution
Use the BodyPosition object.
local b = Instance.new('BodyPosition')
b.maxForce = Vector3.new(math.huge, math.huge, math.huge)
b.position = Vector3.new(10, 10, 10)
b.Parent = Workspace.Part
Discussion
We create the BodyPosition object and set its maxForce property to a Vector3 with each axis set to math.huge. What we want to do is make sure there is no limit to how much force can be applied to the part. Then we change the position to another Vector3. Then we parent the BodyPosition to the part we want to move.
Moving in a Direction
Problem
You want to get a part to move in a direction.
Solution
Use the BodyVelocity object.
local b = Instance.new('BodyVelocity')
b.maxForce = Vector3.new(math.huge, math.huge, math.huge)
b.velocity = Vector3.new(0, 10, 0)
b.Parent = Workspace.Part
Discussion
The BodyVelocity object uses its Velocity property to determine speed and direction.
Rotating in a Direction
Problem
You want to get a part to rotate in a direction.
Solution
Use the BodyAngularVelocity object.
local b = Instance.new('BodyAngularVelocity')
b.maxTorque = Vector3.new(math.huge, math.huge, math.huge)
b.angularvelocity = Vector3.new(0, 10, 0)
b.Parent = Workspace.Part
Discussion
The BodyAngularVelocity object uses its angularelocity property to determine speed and rotation. A good diagram of how this works can be found by clicking here. This time instead of using the maxForce property, we used maxTorque which is rotational power.
Using BodyGyro
Problem
You want to get a part to face a Vector3 constantly.
Solution
Use the BodyGyro object.
local b = Instance.new('BodyGyro')
b.maxTorque = Vector3.new(math.huge, math.huge, math.huge)
b.cframe = CFrame.new(0, 10, 0)
b.Parent = Workspace.Part
Discussion
The BodyGyro object creates a gyroscope affect where the part its inside of always points towards a fixed point. This point is defined by a CFrame in the BodyGyro's cframe property.
Using Dampening
Problem
You want to control the dampening of an object.
Solution
Use the D property.
local b = Instance.new('BodyPosition')
b.maxForce = Vector3.new(math.huge, math.huge, math.huge)
b.position = Vector3.new(10, 10, 10)
b.D = 20
b.Parent = Workspace.Part
Discussion
The default dampening is 1250 which results in pretty much no dampening curve. I particularly like the setting 20 because it gives the motion an elastic like easing.
Using Power
Problem
You want to change the amount of power in the motion.
Solution
Use the P property.
local b = Instance.new('BodyPosition')
b.maxForce = Vector3.new(math.huge, math.huge, math.huge)
b.position = Vector3.new(10, 10, 10)
b.P = 100
b.Parent = Workspace.Part
Discussion
The default power is 10000 which is quite quick. By setting the power to 100, the motion takes a considerably longer amount of time to reach its goal.
Using BodyForce
Problem
You want to move a part using a certain amount of force.
Solution
Use the BodyForce object controlled with the force property.
local b = Instance.new('BodyForce')
b.force = Vector3.new(0, 5000, 0)
b.Parent = Workspace.Part
Discussion
What's the difference between BodyForce and BodyVelocity? With BodyVelocity you set the velocity in which the part moves in. No matter how large the part is, it will move at that constant velocity. With BodyForce, you set the force in which the part is being moved. Therefore the bigger the object, the more force it will require to move.
Using BodyThrust
Problem
You want to move a part in a certain direction with a certain force.
Solution
Use the BodyThrust object controlled with the force property.
local b = Instance.new('BodyThrust')
b.force = Vector3.new(0, 5000, 5000)
b.location = Vector3.new(0, 100, 100)
b.Parent = Workspace.Part
Discussion
The BodyThrust object uses its force property to control the force on each respective axis. Then it uses its location property to determine the direction in which is going to apply the force.
Simple Welding
Problem
You want to weld two parts together.
Solution
Use Weld object.
local w = Instance.new('Weld', Workspace)
w.Part0 = Workspace.Player.Head
w.Part1 = Instance.new('Part', Workspace)
Discussion
The Weld object attaches two objects together. In this case I'm taking a newly created part, and attaching it to a Player's head. The Part0 property is the part that is being attached two, and Part1 is the attached part. The Weld, must be in the Workspace, however it is not required that it be in either of the parts to take affect.
Weld Offset
Problem
You want to offset a weld's attachment.
Solution
Use C0 and C1 properties.
local w = Instance.new('Weld', Workspace)
w.Part0 = Workspace.Player.Head
w.Part1 = Instance.new('Part', Workspace)
w.C0 = CFrame.new(10, 0, 0)
Discussion
This will basically offset the weld's attachment point to 10 studs to the right. The part will move with the Player, just 10 studs to the right of the head. You may also use the C1 property instead of the C0 property, and the attachment point will be 10 studs to the right of the head.
Simple Motors
Problem
You want to manipulate a motor.
Solution
Use the DesiredAngle property.
Workspace.Player.Animate.Disabled = true
Workspace.Player.Torso['Right Shoulder'].DesiredAngle = -math.pi
wait(1)
Workspace.Player.Animate.Disabled = false
Discussion
There are several motors in the Torso part that control the rotation and connect the limbs to the torso. The Animate script inside of the character controls the character's limb rotation. In order to manipulate it without the Animate script interfering, we must disable it first. The DesiredAngle property is set the the desired angle and the motor automatically rotates the part accordingly.
Motor Speed
Problem
You want to manipulate the speed in which a motor rotates.
Solution
Use the MaxVelocity property.
Workspace.Player.Animate.Disabled = true
Workspace.Player.Torso['Right Shoulder'].DesiredAngle = -math.pi
Workspace.Player.Torso['Right Shoulder'].MaxVelocity = 1
wait(1)
Workspace.Player.Animate.Disabled = false
Discussion
The MaxVelocity property controls the maximum velocity allowed for the rotation of a motor to take place. Its set at .1 by default.
Joints
A joint is a bond or connection between two objects through what are called snaps. To create a joint you use the MakeJoints method, or the BreakJoints method in order to remove the connections. In order to create a join, two bricks must have the required surface types in order to form it.
By using a Glue or Weld surface, it creates the respective type of connection between the two. Also note that when loading a ROBLOX you'll notice a brick count and a connector count. The connector count is the amount of snaps that are in game.