Generación Procedimental de Mazmorras en Roblox: BSP, Pasillos Delaunay y Streaming

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

Featured DopaBrain Interactive Tools

La generación procedimental es el motor de los juegos roguelike y RPG en Roblox. Sin un algoritmo sólido, los mapas saturan la memoria del servidor y provocan caídas de fotogramas.

Mediante partición binaria (BSP), triangulación de Delaunay para pasillos y el sistema `StreamingEnabled`, es posible crear mazmorras infinitas y fluidas para miles de jugadores.

1. Creación de Habitaciones con Partición Espacial Binaria (BSP)

Subdivisión matemática para una distribución homogénea:

2. Pasillos Orgánicos: Triangulación de Delaunay y Árbol de Expansión Mínima

Conexión natural sin callejones sin salida:

3. Enrutamiento en Cuadrícula e Instanciación de Bloques

Transformación de líneas matemáticas en partes reales de Roblox:

ServerScriptService.Dungeon.BSPGenerator
-- Módulo de Partición Espacial Binaria (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. Optimización de Memoria con StreamingEnabled

Rendimiento estable en dispositivos móviles con 2GB de RAM:

5. Semillas Deterministas y Autoridad del Servidor

Sincronización perfecta y prevención de trampas:

Frequently Asked Questions

¿Por qué usar BSP en lugar de ubicar salas al azar?

El azar puro genera solapamientos difíciles de corregir y huecos vacíos. BSP distribuye el espacio de manera matemática y homogénea.

¿Qué ventaja aporta la triangulación de Delaunay junto al MST?

Delaunay encuentra vecinos cercanos lógicos y el MST asegura que todo el mapa sea transitable sin bifurcaciones excesivas.

¿Cómo beneficia StreamingEnabled a las mazmorras?

Permite descargar de memoria los sectores lejanos, logrando que mazmorras gigantescas funcionen con total fluidez en móviles.

¿Cómo sincronizar la generación sin saturar la red?

Compartiendo únicamente una semilla numérica idéntica en cliente y servidor para que ambos construyan el mismo mapa localmente.

Explore More Interactive Tests & Guides

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

Go to Portal Hub