Geração Procedural de Masmorras no Roblox: Salas BSP, Delaunay & Streaming

2026-09-29 • DopaBrain Roblox Procedural Architecture Team • DopaBrain Engineering

Featured DopaBrain Interactive Tools

A geração procedural sustenta os principais roguelikes e RPGs no Roblox. Sem arquitetura algorítmica correta, o servidor sofre sobrecarga de memória e travamentos.

Ao integrar o particionamento BSP para salas, Delaunay para caminhos orgânicos e o recurso nativo `StreamingEnabled`, é possível criar masmorras gigantescas e leves.

1. Divisão de Salas com Particionamento Espacial Binário (BSP)

Subdivisão recursiva para distribuição proporcional de salas:

2. Corredores Orgânicos: Triangulação Delaunay & Árvore Geradora Mínima (MST)

Conectando salas de forma contínua sem becos sem saída:

3. Roteamento em Grade e Instanciação Modular de Peças

Transformando grafos teóricos em blocos tridimensionais no Roblox:

ServerScriptService.Dungeon.BSPGenerator
-- Módulo de Particionamento Espacial Binário (BSP)
local BSPNode = {}
BSPNode.__index = BSPNode

function BSPNode.new(x, z, width, depth)
    local self = setmetatable({}, BSPNode)
    self.X, self.Z = x, z
    self.Width, self.Depth = width, depth
    self.LeftChild = nil
    self.RightChild = nil
    self.Room = nil
    return self
end

function BSPNode:Split(minSize)
    if self.LeftChild or self.RightChild then return false end
    local splitHorizontal = math.random() > 0.5
    if self.Width > self.Depth and (self.Width / self.Depth) >= 1.25 then
        splitHorizontal = false
    elseif self.Depth > self.Width and (self.Depth / self.Width) >= 1.25 then
        splitHorizontal = true
    end
    local maxDimension = (splitHorizontal and self.Depth or self.Width) - minSize
    if maxDimension <= minSize then return false end
    local splitPos = math.random(minSize, maxDimension)
    if splitHorizontal then
        self.LeftChild = BSPNode.new(self.X, self.Z, self.Width, splitPos)
        self.RightChild = BSPNode.new(self.X, self.Z + splitPos, self.Width, self.Depth - splitPos)
    else
        self.LeftChild = BSPNode.new(self.X, self.Z, splitPos, self.Depth)
        self.RightChild = BSPNode.new(self.X + splitPos, self.Z, self.Width - splitPos, self.Depth)
    end
    return true
end

return BSPNode

4. Gestão de Memória e Arquitetura com StreamingEnabled

Masmorras com mais de 100 salas operando perfeitamente em celulares com 2GB de RAM:

5. Sincronização por Semente (Seed) e Controle no Servidor

Garantindo segurança total e zero lag de replicação de mapa:

Frequently Asked Questions

Por que usar BSP em vez de posicionar salas aleatoriamente?

O posicionamento aleatório exige checagens de colisão complexas e deixa espaços vazios. O BSP divide o espaço de maneira equilibrada e sem sobreposições.

Qual o papel da triangulação Delaunay com MST?

Conectar salas próximas com naturalidade e assegurar que nenhum cômodo fique isolado ou com caminhos excessivamente repetitivos.

Como o StreamingEnabled ajuda em mapas extensos?

Ele carrega na memória apenas os trechos próximos ao usuário, economizando memória em aparelhos móveis.

Como evitar discrepâncias de mapa entre cliente e servidor?

Basta compartilhar a mesma semente matemática, permitindo que ambos os lados construam o mesmo terreno sem transmissão de dados pesados.

Explore More Interactive Tests & Guides

Discover personalized cognitive assessments, stress evaluations, and game psychology tools on DopaBrain.

Go to Portal Hub