Color Picker Issue

I have a problem with a color picker I added to my game. It works on pc when I have to move the picker but on mobile it doesnt work even tho the mousebutton1down. Can someone help me?

local colourWheel = script.Parent:WaitForChild("ColourWheel")
local wheelPicker = colourWheel:WaitForChild("Picker")

local darknessPicker = script.Parent:WaitForChild("DarknessPicker")
local darknessSlider = darknessPicker:WaitForChild("Slider")

local colourDisplay = script.Parent:WaitForChild("ColourDisplay")


local uis = game:GetService("UserInputService")


local buttonDown = false
local movingSlider = false


local function updateColour(centreOfWheel)


    local colourPickerCentre = Vector2.new(
        colourWheel.Picker.AbsolutePosition.X + (colourWheel.Picker.AbsoluteSize.X/2),
        colourWheel.Picker.AbsolutePosition.Y + (colourWheel.Picker.AbsoluteSize.Y/2)
    )
    local h = (math.pi - math.atan2(colourPickerCentre.Y - centreOfWheel.Y, colourPickerCentre.X - centreOfWheel.X)) / (math.pi * 2)

    local s = (centreOfWheel - colourPickerCentre).Magnitude / (colourWheel.AbsoluteSize.X/2)

    local v = math.abs((darknessSlider.AbsolutePosition.Y - darknessPicker.AbsolutePosition.Y) / darknessPicker.AbsoluteSize.Y - 1)


    local hsv = Color3.fromHSV(math.clamp(h, 0, 1), math.clamp(s, 0, 1), math.clamp(v, 0, 1))


    colourDisplay.ImageColor3 = hsv
    darknessPicker.UIGradient.Color = ColorSequence.new{
        ColorSequenceKeypoint.new(0, hsv), 
        ColorSequenceKeypoint.new(1, Color3.new(0, 0, 0))
    }
end


colourWheel.MouseButton1Down:Connect(function()
    buttonDown = true
end)


colourWheel.TouchPan:Connect(function()
    buttonDown = true
end)

darknessPicker.MouseButton1Down:Connect(function()
    movingSlider = true
end)

darknessPicker.TouchPan:Connect(function()
    movingSlider = true
end)



uis.InputEnded:Connect(function(input)

    if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end

    buttonDown = false
    movingSlider = false
end)
[12:44 PM]
uis.InputChanged:Connect(function(input)

    if input.UserInputType ~= Enum.UserInputType.MouseMovement or input.UserInputType ~= Enum.UserInputType.Touch  then return end


    local mousePos = uis:GetMouseLocation() - Vector2.new(0, game:GetService("GuiService"):GetGuiInset().Y)


    local centreOfWheel = Vector2.new(colourWheel.AbsolutePosition.X + (colourWheel.AbsoluteSize.X/2), colourWheel.AbsolutePosition.Y + (colourWheel.AbsoluteSize.Y/2))

    local distanceFromWheel = (mousePos - centreOfWheel).Magnitude


    if distanceFromWheel <= colourWheel.AbsoluteSize.X/2 and buttonDown then

        wheelPicker.Position = UDim2.new(0, mousePos.X - colourWheel.AbsolutePosition.X, 0, mousePos.Y - colourWheel.AbsolutePosition.Y)


    elseif movingSlider then

        darknessSlider.Position = UDim2.new(darknessSlider.Position.X.Scale, 0, 0, 
            math.clamp(
            mousePos.Y - darknessPicker.AbsolutePosition.Y, 
            0, 
            darknessPicker.AbsoluteSize.Y)
        )
    end


    updateColour(centreOfWheel)
end)

You put an “or” instead of an “and” in your input changed function.

New code:

local colourWheel = script.Parent:WaitForChild("ColourWheel")
local wheelPicker = colourWheel:WaitForChild("Picker")

local darknessPicker = script.Parent:WaitForChild("DarknessPicker")
local darknessSlider = darknessPicker:WaitForChild("Slider")

local colourDisplay = script.Parent:WaitForChild("ColourDisplay")


local uis = game:GetService("UserInputService")


local buttonDown = false
local movingSlider = false


local function updateColour(centreOfWheel)


    local colourPickerCentre = Vector2.new(
        colourWheel.Picker.AbsolutePosition.X + (colourWheel.Picker.AbsoluteSize.X/2),
        colourWheel.Picker.AbsolutePosition.Y + (colourWheel.Picker.AbsoluteSize.Y/2)
    )
    local h = (math.pi - math.atan2(colourPickerCentre.Y - centreOfWheel.Y, colourPickerCentre.X - centreOfWheel.X)) / (math.pi * 2)

    local s = (centreOfWheel - colourPickerCentre).Magnitude / (colourWheel.AbsoluteSize.X/2)

    local v = math.abs((darknessSlider.AbsolutePosition.Y - darknessPicker.AbsolutePosition.Y) / darknessPicker.AbsoluteSize.Y - 1)


    local hsv = Color3.fromHSV(math.clamp(h, 0, 1), math.clamp(s, 0, 1), math.clamp(v, 0, 1))


    colourDisplay.ImageColor3 = hsv
    darknessPicker.UIGradient.Color = ColorSequence.new{
        ColorSequenceKeypoint.new(0, hsv), 
        ColorSequenceKeypoint.new(1, Color3.new(0, 0, 0))
    }
end


colourWheel.MouseButton1Down:Connect(function()
    buttonDown = true
end)


colourWheel.TouchPan:Connect(function()
    buttonDown = true
end)

darknessPicker.MouseButton1Down:Connect(function()
    movingSlider = true
end)

darknessPicker.TouchPan:Connect(function()
    movingSlider = true
end)



uis.InputEnded:Connect(function(input)

    if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end

    buttonDown = false
    movingSlider = false
end)

uis.InputChanged:Connect(function(input)

    if input.UserInputType ~= Enum.UserInputType.MouseMovement and input.UserInputType ~= Enum.UserInputType.Touch  then return end


    local mousePos = uis:GetMouseLocation() - Vector2.new(0, game:GetService("GuiService"):GetGuiInset().Y)


    local centreOfWheel = Vector2.new(colourWheel.AbsolutePosition.X + (colourWheel.AbsoluteSize.X/2), colourWheel.AbsolutePosition.Y + (colourWheel.AbsoluteSize.Y/2))

    local distanceFromWheel = (mousePos - centreOfWheel).Magnitude


    if distanceFromWheel <= colourWheel.AbsoluteSize.X/2 and buttonDown then

        wheelPicker.Position = UDim2.new(0, mousePos.X - colourWheel.AbsolutePosition.X, 0, mousePos.Y - colourWheel.AbsolutePosition.Y)


    elseif movingSlider then

        darknessSlider.Position = UDim2.new(darknessSlider.Position.X.Scale, 0, 0, 
            math.clamp(
            mousePos.Y - darknessPicker.AbsolutePosition.Y, 
            0, 
            darknessPicker.AbsoluteSize.Y)
        )
    end


    updateColour(centreOfWheel)
end)
1 Like

The MouseButton family of functions doesn’t work on mobile as you don’t really have a ‘mouse’ and aren’t really ‘clicking’ anything. Instead, you should take a look into using .Activated; it passes an InputObject meaning you can actually customize what ‘activates’ it without doing an endless list of :Connect(function() end)

thx bro I used this as main rewrote code and I made some changes but I had to use the Activated function as Starlito said for convenience :smiley:

2 Likes

Can you post the code? I’m facing a similar issue of mine working on PC but not on mobile.