Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Vector2 = require"Vector2"
- local Grid = require"Grid"
- require"utility"
- local particleSize = Vector2.new(2, 2)
- local gridSize = Vector2.new(600, 500)
- local gravity = Vector2.new(0, 30)
- local gridRoot = Vector2.new()
- local particleGrid = Grid.new("static", gridRoot, particleSize, gridSize); particleGrid:outline()
- local gridCells = particleGrid.cells
- local particleLists = {
- ["solid"] = {length = 0},
- ["liquid"] = {length = 0},
- }
- local solidParticlesList = particleLists["solid"]
- local numberOfParticles = 0 --// All together
- local particleDatabase = {
- ["sand"] = {
- possibleColors = {
- Color.new(255, 236, 26),
- Color.new(255, 239, 115),
- Color.new(255, 200, 61),
- Color.new(255, 183, 74),
- },
- type = "solid",
- }
- }
- local function isCellEmpty(cell)
- return cell and cell.particle == nil and cell
- end
- local function moveParticle(particle, newCell)
- local oldCell = particle.cell
- oldCell.particle = nil
- particle.cell = newCell
- newCell.particle = particle
- end
- local function getRandomDirection()
- local random = math.random()
- return random == 1 and 1 or -1
- end
- local function getCell(x, y)
- local cellX = gridCells[x]
- return cellX and cellX[y]
- end
- local function simulateSolidParticles()
- for i = solidParticlesList.length, 1, -1 do
- local particle = solidParticlesList[i]
- local cell = particle.cell
- local cellPos = cell.pos
- local freeFalling = particle.freeFalling
- local posX, posY = cellPos.x, cellPos.y
- local cellBellow = getCell(posX, posY+1)
- if isCellEmpty(cellBellow) then
- moveParticle(particle, cellBellow)
- freeFalling = true
- else
- freeFalling = false
- local diagonalCell = isCellEmpty(getCell(posX-1, posY+1)) or isCellEmpty(getCell(posX+1, posY+1))
- if diagonalCell then
- moveParticle(particle, diagonalCell)
- end
- end
- ::continue::
- particle.freeFalling = freeFalling
- end
- end
- local Particle = {
- grid = particleGrid,
- particleSize = particleSize,
- }
- function Particle.new(particleId, cellPos, ...)
- local particleData = particleDatabase[particleId]
- local particleType = particleData.type
- local possibleColors = particleData.possibleColors
- local particle = {
- type = particleType,
- cell = particleGrid:getCell(cellPos),
- color = possibleColors[math.random(1, #possibleColors)],
- freeFalling = true,
- }
- local particleList = particleLists[particleType]
- local listLength = particleList.length + 1; particleList.length = listLength
- --// insert into list for the particle to update
- particleList[listLength] = particle
- numberOfParticles = numberOfParticles + 1
- return particle
- end
- function Particle.update(timeElapsed)
- simulateSolidParticles()
- end
- function Particle.draw()
- love.graphics.print("Particles: "..numberOfParticles, 10, gridSize.y +20, 0)
- love.graphics.print("FPS: "..love.timer.getFPS(), 10, gridSize.y + 40, 0)
- for _, list in pairs(particleLists) do
- for i = 1, list.length do
- local particle = list[i]
- local worldPos = particleGrid:cellToWorldPos(particle.cell.pos)
- local color = particle.color
- love.graphics.setColor(color.r/255, color.g/255, color.b/255)
- love.graphics.rectangle("fill", worldPos.x + particleSize.x/2, worldPos.y + particleSize.y/2, particleSize.x, particleSize.y)
- end
- end
- end
- return Particle
Add Comment
Please, Sign In to add comment