level01.lua
Code: Select all
--set up for STI
local sti = require 'sti'
local physics = require 'assets.loaders.physics'
function loadLevel_01()
--STI INITIALIZATION CODE---------------------------------------------------------------------------------------------------
--grab window size
windowWidth = love.graphics.getWidth()
windowHeight = love.graphics.getHeight()
--set world "meter" size in pixels (tile length)
love.physics.setMeter(64)
--load a map exported to lua from Tiled
map = sti.new('assets/maps/map01.lua', {'box2d'})
--prepare physics world with horizontal and vertical gravity
world = love.physics.newWorld(0, 3500, true)
--prepare collision objects
map:box2d_init(world)
world:setCallbacks(beginContact)
--create custom layer for sprites
map:addCustomLayer('Sprite Layer', 4)
--add data to custom layer
spriteLayer = map.layers['Sprite Layer']
spriteLayer.sprites = {
player = {
img = love.graphics.newImage('assets/sprites/gus.png'),
x = 250,
y = 1200,
r = 0}}
--call physics setup for spriteLayer
spritePhysics()
end
function updateLevel_01(dt)
--map update for sti
world:update(dt)
--MOVEMENT SETUP------------------------------------------------------------------------------------------------------------
local sprite = map.layers['Sprite Layer'].sprites.player
local x, y = 0, 0
if love.keyboard.isDown('a', 'left') and not sprite.isOnWall then
x = x - 8000
elseif love.keyboard.isDown('a', 'left') and sprite.isOnWall then
--code for wall sticking animations
end
if love.keyboard.isDown('d', 'right') and not sprite.isOnWall then
x = x + 8000
elseif love.keyboard.isDown('d', 'right') and sprite.isOnWall then
--code for wall sticking animations
end
sprite.body:applyForce(x, y)
sprite.x, sprite.y = sprite.body:getWorldCenter()
--JUMPING CODE--------------------------------------------------------------------------------------------------------------
function beginContact(a, b, ctct)
if a == sprite.groundSensor or b == sprite.groundSensor then --sprite is on ground
sprite.isOnGround = true
sprite.doubleJump = false
elseif a == sprite.wallSensor or b == sprite.wallSensor and sprite.isOnWall == false then --sprite is on wall
sprite.wallCheck = true
end
end
world:setCallbacks(beginContact)
function love.keypressed(key)
if key == ' ' and sprite.isOnGround then --jump and allow double jump
sprite.doubleJump = true
sprite.body:applyLinearImpulse(0, -8000, sprite.x, sprite.y)
sprite.isOnGround = false
elseif key == ' ' and sprite.doubleJump then --double jump
sprite.body:applyLinearImpulse(0, -6500, sprite.x, sprite.y)
sprite.doubleJump = false
elseif key == 'lshift' or 'rshift' and not sprite.isOnGround and sprite.wallCheck then --stick to wall
sprite.wallCheck = false
sprite.isOnWall = true
sprite.doubleJump = false
sprite.body:setActive(false)
elseif key == ' ' and sprite.isOnWall then --jump off of wall
sprite.body:setActive(true)
sprite.body:applyLinearImpulse(1000, -6500, sprite.x, sprite.y)
sprite.isOnWall = false
end
end
map:update(dt)
end
function drawLevel_01()
--STI INITIALIZATION CODE---------------------------------------------------------------------------------------------------
--translation based on player's x/y
local translateX = 0
local translateY = 0
--draw range culls unnecessary tiles
map:setDrawRange(-translateX, -translateY, windowWidth, windowHeight)
--draw map and all objects within
map:draw()
--draw collision map (useful for debugging) comment out to get rid of collision boxes
love.graphics.setColor(255, 0, 0, 255)
map:box2d_draw()
local sprite = map.layers['Sprite Layer'].sprites.player
love.graphics.setColor(255, 0, 0, 255)
love.graphics.polygon("line", sprite.body:getWorldPoints(sprite.shape:getPoints()))
love.graphics.polygon("line", sprite.body:getWorldPoints(sprite.gShape:getPoints()))
love.graphics.polygon("line", sprite.body:getWorldPoints(sprite.wShape:getPoints()))
love.graphics.circle("line",sprite.x, sprite.y + 20, 38)
-----------------------------------------------------------------------------------------------------------------------------
end
Code: Select all
--Calls for physics set up
--Set up Sprite Layer and associated physics
function spritePhysics()
--update callback for custom layer
function spriteLayer:update(dt)
for _, sprite in pairs(self.sprites) do
end
end
--draw callback for custom layer
function spriteLayer:draw()
for _, sprite in pairs(self.sprites) do
local x = math.floor(sprite.x)
local y = math.floor(sprite.y)
local r = sprite.r
love.graphics.draw(sprite.img, x, y - 10, r, 1, 1, 48,68 )
end
end
--set up sprite physics
local sprite = map.layers['Sprite Layer'].sprites.player
sprite.body = love.physics.newBody(world, sprite.x/2, sprite.y/2, 'dynamic')
sprite.body:setMassData(0, 0, 200, 0)
sprite.body:setLinearDamping(5)
sprite.body:setFixedRotation(true)
sprite.shape = love.physics.newRectangleShape(0, 0, 75, 80, 0)
sprite.gShape = love.physics.newRectangleShape(1, 78, 70, 10, 0)
sprite.fShape = love.physics.newCircleShape(0, 40, 38)
sprite.wShape = love.physics.newRectangleShape(0, 0, 85, 50, 0)
sprite.fixture = love.physics.newFixture(sprite.body, sprite.shape)
sprite.feet = love.physics.newFixture(sprite.body, sprite.fShape)
sprite.groundSensor = love.physics.newFixture(sprite.body, sprite.gShape)
sprite.wallSensor = love.physics.newFixture(sprite.body, sprite.wShape)
sprite.groundSensor:setSensor(true)
sprite.wallSensor:setSensor(true)
sprite.isOnGround = false
sprite.isOnWall = false
sprite.wallCheck = false
sprite.doubleJump = false
end