What do you want to achieve? Keep it simple and clear!
I want to make a working Rubik’s cube.
What is the issue? Include screenshots / videos if possible!
Rotating only 1 side works fine, but as soon as you try to rotate another side that isn’t the opposite side it doesn’t work correctly.
Rotating only 1 side works fine:
Rotating another side that isn’t the opposite side:
What solutions have you tried so far? Did you look for solutions on the Developer Hub?
I haven’t tried any solution yet so far, because I don’t even know where it went wrong. I did search a bit on the devforum but I only found Cube Puzzle - a 3x3 combination puzzle, which isn’t really resourceful.
It might also help to have the code and baseplate of this issue ofc so here it is:
Baseplate.rbxl (716.9 KB)
local parts = {}
local partsCoordsOriginal = {}
function getNewPartName(part)
local name = partsCoordsOriginal[part.Position]
if name ~= nil then
return name
end
local lastDist = 1000000
local correctData
for i, _ in pairs(partsCoordsOriginal) do
local dist = (i - part.Position).Magnitude
if dist < lastDist then
lastDist = dist
correctData = {i, partsCoordsOriginal[i]}
end
end
if correctData ~= nil then
part.Position = correctData[1]
return correctData[2]
end
warn("Couldn't find name of part, original name: " .. part.Name)
return nil
end
function filter(id, value, skip)
if id < 1 or id > 3 then
error("Invalid filter ID in Rubik's cube's script.")
end
if skip == nil then
skip = {Name = ""}
end
local result = {}
for _, part in pairs(parts) do
if part[id + 1] == value then
if part[1].Name ~= skip.Name then
table.insert(result, part[1])
end
end
end
return result
end
for _, part in pairs(script.Parent.Parts:GetChildren()) do
partsCoordsOriginal[part.Position] = part.Name
local coords = string.split(part.Name, ",")
table.insert(parts, {
part,
tonumber(coords[1]),
tonumber(coords[2]),
tonumber(coords[3])
})
end
function renameCubeParts(affectedParts)
for _, part in pairs(affectedParts) do
part.Name = getNewPartName(part)
end
end
function executeTrigger_CORE(selectedParts, skip, move)
local model = Instance.new("Model", script.Parent)
for _, obj in pairs(selectedParts) do
obj.Parent = model
end
model.PrimaryPart = model[skip]
for i = 1, 12 do
model:SetPrimaryPartCFrame(model:GetPrimaryPartCFrame() * move)
wait(.01)
end
renameCubeParts(selectedParts)
for _, obj in pairs(model:GetChildren()) do
obj.Parent = script.Parent.Parts
end
end
local debounce = false
function executeTrigger(t)
if debounce == false then
debounce = true
if t == "L" then
executeTrigger_CORE(filter(3, 0), "1,1,0", CFrame.Angles(0, 0, math.rad(7.5)))
elseif t == "R" then
executeTrigger_CORE(filter(3, 2), "1,1,2", CFrame.Angles(0, 0, math.rad(-7.5)))
elseif t == "B" then
executeTrigger_CORE(filter(1, 2), "2,1,1", CFrame.Angles(math.rad(-7.5), 0, 0))
elseif t == "F" then
executeTrigger_CORE(filter(1, 0), "0,1,1", CFrame.Angles(math.rad(7.5), 0, 0))
elseif t == "U" then
executeTrigger_CORE(filter(2, 2), "1,2,1", CFrame.Angles(0, 0, math.rad(7.5)))
elseif t == "D" then
executeTrigger_CORE(filter(2, 0), "1,0,1", CFrame.Angles(0, 0, math.rad(7.5)))
end
debounce = false
end
end
for _, trigger in pairs(script.Parent.Triggers:GetChildren()) do
trigger.ClickDetector.MouseClick:Connect(function()
executeTrigger(trigger.Name)
end)
end