ROBLOX - 修复六边形地形中的间隙
ROBLOX - Fixing the gaps in hexagon terrain
所以,我一直在摆弄来自 here
的一些高度图代码
在弄乱参数后,我改变了六边形的一部分,并用它制作了一个漂亮的菱形,但问题是,六边形边没有相交的地方显示 here
这里是负责生成等的代码:
local size = Vector3.new(10, -- Number of tiles along the width
10, -- Number of steps of heightmap
10) -- Number of tiles along the length
local base = script.Parent -- The part to replace with terrain
math.randomseed(tick()%1e5)
for x = 1, size.x do
for z = 1, size.z do
local y =x+z
wait()
local tile = game.ServerStorage.Hexagon:Clone()
local position = Vector3.new(x-1, 0, z-1) * tile.Size
tile.Size = tile.Size * Vector3.new(1, y, 1)
tile.CFrame = CFrame.new(tile.Size/2) --Shift the part by half it's size, so we can position the corner
tile.CFrame = tile.CFrame - base.Size / 2 --Shift it into one corner of the base
tile.CFrame = tile.CFrame + position --Put it in the right place
tile.CFrame = base.CFrame * tile.CFrame --Move it so that it is level with the surface of the base
tile.Parent=workspace
if tile.Position.Y < 30 then
tile.BrickColor = BrickColor.new("Brown")
elseif tile.Position.Y > 30 and tile.Position.Y < 100 then
tile.BrickColor = BrickColor.new("Bright green")
end
end
end -- an end for each for loop
base:Destroy()
我相信解决这个问题的方法是你如何设置位置。试试这个:
local position = (Vector3.new(.75, 0, -.5)*(x-1) + Vector3.new(.75, 0, .5)*(z-1))*tile.Size
编辑:
完整代码(它也将瓷砖组形成为 "big hexagon" 而不是 "big diamond"):
local size = 10 -- Number of tiles along the side of "big hexagon"
local base = script.Parent -- The part to replace with terrain
math.randomseed(tick()%1e5)
for x = 0, 2*size do
for z = 0, 2*size do
if ((x + z)/size - 2)^2 > 1 then break end
local y = x+z
wait()
local tile = game.ServerStorage.Hexagon:Clone()
local position = Vector3.new(.75*(x+z), 0, .5*(z-x)) * tile.Size
tile.Size = tile.Size * Vector3.new(1, y, 1)
tile.CFrame = CFrame.new(tile.Size/2) --Shift the part by half it's size, so we can position the corner
tile.CFrame = tile.CFrame - base.Size / 2 --Shift it into one corner of the base
tile.CFrame = tile.CFrame + position --Put it in the right place
tile.CFrame = base.CFrame * tile.CFrame --Move it so that it is level with the surface of the base
tile.Parent=workspace
if tile.Position.Y < 30 then
tile.BrickColor = BrickColor.new("Brown")
elseif tile.Position.Y > 30 and tile.Position.Y < 100 then
tile.BrickColor = BrickColor.new("Bright green")
end
end
end -- an end for each for loop
base:Destroy()
所以,我一直在摆弄来自 here
的一些高度图代码在弄乱参数后,我改变了六边形的一部分,并用它制作了一个漂亮的菱形,但问题是,六边形边没有相交的地方显示 here
这里是负责生成等的代码:
local size = Vector3.new(10, -- Number of tiles along the width
10, -- Number of steps of heightmap
10) -- Number of tiles along the length
local base = script.Parent -- The part to replace with terrain
math.randomseed(tick()%1e5)
for x = 1, size.x do
for z = 1, size.z do
local y =x+z
wait()
local tile = game.ServerStorage.Hexagon:Clone()
local position = Vector3.new(x-1, 0, z-1) * tile.Size
tile.Size = tile.Size * Vector3.new(1, y, 1)
tile.CFrame = CFrame.new(tile.Size/2) --Shift the part by half it's size, so we can position the corner
tile.CFrame = tile.CFrame - base.Size / 2 --Shift it into one corner of the base
tile.CFrame = tile.CFrame + position --Put it in the right place
tile.CFrame = base.CFrame * tile.CFrame --Move it so that it is level with the surface of the base
tile.Parent=workspace
if tile.Position.Y < 30 then
tile.BrickColor = BrickColor.new("Brown")
elseif tile.Position.Y > 30 and tile.Position.Y < 100 then
tile.BrickColor = BrickColor.new("Bright green")
end
end
end -- an end for each for loop
base:Destroy()
我相信解决这个问题的方法是你如何设置位置。试试这个:
local position = (Vector3.new(.75, 0, -.5)*(x-1) + Vector3.new(.75, 0, .5)*(z-1))*tile.Size
编辑:
完整代码(它也将瓷砖组形成为 "big hexagon" 而不是 "big diamond"):
local size = 10 -- Number of tiles along the side of "big hexagon"
local base = script.Parent -- The part to replace with terrain
math.randomseed(tick()%1e5)
for x = 0, 2*size do
for z = 0, 2*size do
if ((x + z)/size - 2)^2 > 1 then break end
local y = x+z
wait()
local tile = game.ServerStorage.Hexagon:Clone()
local position = Vector3.new(.75*(x+z), 0, .5*(z-x)) * tile.Size
tile.Size = tile.Size * Vector3.new(1, y, 1)
tile.CFrame = CFrame.new(tile.Size/2) --Shift the part by half it's size, so we can position the corner
tile.CFrame = tile.CFrame - base.Size / 2 --Shift it into one corner of the base
tile.CFrame = tile.CFrame + position --Put it in the right place
tile.CFrame = base.CFrame * tile.CFrame --Move it so that it is level with the surface of the base
tile.Parent=workspace
if tile.Position.Y < 30 then
tile.BrickColor = BrickColor.new("Brown")
elseif tile.Position.Y > 30 and tile.Position.Y < 100 then
tile.BrickColor = BrickColor.new("Bright green")
end
end
end -- an end for each for loop
base:Destroy()