Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

Problem with buttons?

Script:

local Lights = script.Parent.Lights
local a = Lights.A
local b = Lights.B
local c = Lights.C
local d = Lights.D
local e = Lights.E
local f = Lights.F
local g = Lights.G
local h = Lights.H
local i = Lights.I
local j = Lights.J
local k = Lights.K
local l = Lights.L
local Check = script.Parent.ButtonG.Button.Check.Value

function Rotate() -- Light Rotation
	a.Material = "Neon"
	wait(0.1)
	a.Material = "SmoothPlastic"
	b.Material = "Neon"
	wait(0.1)
	b.Material = "SmoothPlastic"
	c.Material = "Neon"
	wait(0.1)
	c.Material = "SmoothPlastic"
	d.Material = "Neon"
	wait(0.1)
	d.Material = "SmoothPlastic"
	e.Material = "Neon"
	wait(0.1)
	e.Material = "SmoothPlastic"
	f.Material = "Neon"
	wait(0.1)
	f.Material = "SmoothPlastic"
	g.Material = "Neon"
	wait(0.1)
	g.Material = "SmoothPlastic"
	h.Material = "Neon"
	wait(0.1)
	h.Material = "SmoothPlastic"
	i.Material = "Neon"
	wait(0.1)
	i.Material = "SmoothPlastic"
	j.Material = "Neon"
	wait(0.1)
	j.Material = "SmoothPlastic"
	k.Material = "Neon"
	wait(0.1)
	k.Material = "SmoothPlastic"
	l.Material = "Neon"
	wait(0.1)
	l.Material = "SmoothPlastic"
end

function OnClicked(playerWhoClicked) -- When button is clicked
	wait(1)
	Check = 1 -- 0 = Inactive and 1 = Active, thus making the game active
	while Check == 1 do
		Rotate()
		wait(0.1)
		
	end
	if script.Parent.ButtonS.Button.ClickDetector.MouseClick then
		Check = 0
	end
end

script.Parent.ButtonG.Button.ClickDetector.MouseClick:connect(OnClicked)

Problem: 1: The script does not detect the click of the second button, thus unable to end. 2: The first button is able to be repeatedly activated.

If there's a section that can be simplified, please tell me. Cheers.

1 answer

I have read the code and I believe I can identify where the issues you are facing come from.

Problem 1: If I am correct, you are checking for a mouse click on lines 63 to 65, which will set the check variable to 0 and thus end the loop. In the code above though, the if statement will only ever fire AFTER the loop has already ended, as it is nested outside of the loop itself. You can fix this by moving lines 63-65 to the current empty space on line 61 (after your wait statement)

Problem 2: Set a variable in the upper most scope of your script (where you have your lights variables) as a boolean, such as "buttonInUse" and once the button has been pressed, set it to true, and once it passes the check, set it to false. When the button event is pressed, check that "buttonInUse" is not true.

As for simplification, programming is about automation and doing things in an efficient and clean mannor. Whilst this is true, I do not believe it is needed in ROBLOX unless your creation will complex and require clean code in hopes of being ever completed.

But for pointers:

Your lights seem to all be kept in an group called "Lights", which is a good design choice! But you've not capitalised on this by writing out each light variable seperately and accessing them via code seperately.

You could do as follows:

local lightList = Lights:GetChildren() -- Gets a list of all of the children in the Lights group
for i = 1, #lightList do
	if(i = 1)then -- We only want to set a material at the first step
		lightList[i].Material = "Neon"
	else -- We now want to remove the last, and set the current
		lightList[i - 1].Material = "Smooth Plastic"
		lightList[i].Material = "Neon"
	end	
	wait(0.1)
end

This discussion is preserved as it was. New answers, comments, and votes are closed.