Page 1 of 1
Bump.lua - collision not working
Posted: Mon Jun 17, 2019 1:16 am
by 2lostsouls
I found a great thread on this forum about how to use bump.lua. I was able to add it to my main.lua without an error. But when I move the player, the player is still going through the image of the desk. I put a square around the image and added a property called collideable and made it true as the tutorial states. I think I may have two problems:
1. I do not think I am referencing the player for the new world.
2. I don't have it on my map correctly.
Here is the code and two images showing what I did. Hopefully this helps. Thank you for any assistance.
Code: Select all
-- Include Simple Tiled Implementation into project
sti = require "sti"
bump = require "bump"
function love.load()
-- Load map file
map = sti("map.lua")
local world = bump.newWorld()
local map = sti('map.lua', {"bump"}) -- This loads the map file, and loads the bump plugin for STI
map:bump_init(world) -- This initializes the bump plugin, and loads all of your collidable tiles
-- Create new dynamic data layer called "Sprites" as the 3rd layer
local layer = map:addCustomLayer("Sprites", 3)
-- Get player spawn object
local player
for k, object in pairs(map.objects) do
if object.name == "Player" then
player = object
break
end
end
-- Create player object
local sprite = love.graphics.newImage("sprite.png")
img = love.graphics.newQuad(0, 0, 32, 64, sprite:getDimensions())
layer.player = {
sprite = sprite,
x = player.x,
y = player.y,
ox = sprite:getWidth() / 2,
oy = sprite:getHeight() / 1.35
}
-- Add controls to player
layer.update = function(self, dt)
-- 96 pixels per second
local speed = 96
-- Move player up
if love.keyboard.isDown("w") or love.keyboard.isDown("up") then
self.player.y = self.player.y - speed * dt
end
-- Move player down
if love.keyboard.isDown("s") or love.keyboard.isDown("down") then
self.player.y = self.player.y + speed * dt
end
-- Move player left
if love.keyboard.isDown("a") or love.keyboard.isDown("left") then
self.player.x = self.player.x - speed * dt
end
-- Move player right
if love.keyboard.isDown("d") or love.keyboard.isDown("right") then
self.player.x = self.player.x + speed * dt
end
end
-- Draw player
layer.draw = function(self)
love.graphics.draw(
self.player.sprite,
math.floor(self.player.x),
math.floor(self.player.y),
0,
1,
1,
self.player.ox,
self.player.oy
)
end
-- Remove unneeded object layer
map:removeLayer("Spawn Point")
function love.update(dt)
-- Update world
map:update(dt)
end
function love.draw()
-- Scale world
local scale = 2
local screen_width = love.graphics.getWidth() / scale
local screen_height = love.graphics.getHeight() / scale
map:draw()
end
end[attachment=1]imageCollider.png[/attachment]
Re: Bump.lua - collision not working
Posted: Tue Jun 18, 2019 6:34 pm
by AdrianN
I think because in your collision filter you writed collideable instead of collidable.
I'm not sure, but you could try.
I recommend this tutorial, I used it when i used the bump library.
http://osmstudios.com/tutorials/love2d- ... ing-levels
Re: Bump.lua - collision not working
Posted: Wed Jun 19, 2019 1:54 pm
by 2lostsouls
Thank you, I fixed that. I am just not sure if I am using Tiled correctly. There are not any detailed tutorials out there.
1. Do I put the sprite image on an image layer on the map after making the collidable tiles, or on an object layer?
Thank you for everyone's help.
Re: Bump.lua - collision not working
Posted: Wed Jun 19, 2019 8:25 pm
by AdrianN
2lostsouls wrote: ↑Wed Jun 19, 2019 1:54 pm
1. Do I put the sprite image on an image layer on the map after making the collidable tiles, or on an object layer?
I'm not sure, but I think the image layer and the object layer are identical, only one is dedicated to images.
STI admits both layers.
Re: Bump.lua - collision not working
Posted: Fri Jun 21, 2019 1:39 am
by 2lostsouls
Ok, I really want to learn this but it is getting very frustrating. I cannot get the collision to work. I cannot find a tutorial that really shows me how to do the collision. The picture shows my character but he is going right through the object that I want him not to go through. Is there any one that can look at the code and see if there is something I should be adding. I am showing some pics on how my tileset looks and my map as well as my Main.lua. Thank you.
Code: Select all
-- Include Simple Tiled Implementation into project
sti = require "sti"
bump = require "bump"
function love.load()
-- Load map file
map = sti("map.lua")
local world = bump.newWorld()
local map = sti('map.lua', {"bump"}) -- This loads the map file, and loads the bump plugin for STI
map:bump_init(world) -- This initializes the bump plugin, and loads all of your collidable tiles
-- Create new dynamic data layer called "Sprites" as the 3rd layer
local layer = map:addCustomLayer("Sprites", 3)
-- Get player spawn object
local player
for k, object in pairs(map.objects) do
if object.name == "Player" then
player = object
break
end
end
-- Create player object
local sprite = love.graphics.newImage("sprite.png")
img = love.graphics.newQuad(0, 0, 32, 64, sprite:getDimensions())
layer.player = {
sprite = sprite,
x = player.x,
y = player.y,
ox = sprite:getWidth() / 2,
oy = sprite:getHeight() / 1.35
}
-- Add controls to player
layer.update = function(self, dt)
-- 96 pixels per second
local speed = 96
-- Move player up
if love.keyboard.isDown("w") or love.keyboard.isDown("up") then
self.player.y = self.player.y - speed * dt
end
-- Move player down
if love.keyboard.isDown("s") or love.keyboard.isDown("down") then
self.player.y = self.player.y + speed * dt
end
-- Move player left
if love.keyboard.isDown("a") or love.keyboard.isDown("left") then
self.player.x = self.player.x - speed * dt
end
-- Move player right
if love.keyboard.isDown("d") or love.keyboard.isDown("right") then
self.player.x = self.player.x + speed * dt
end
end
-- Draw player
layer.draw = function(self)
love.graphics.draw(
self.player.sprite,
math.floor(self.player.x),
math.floor(self.player.y),
0,
1,
1,
self.player.ox,
self.player.oy
)
end
-- Remove unneeded object layer
map:removeLayer("Spawn Point")
function love.update(dt)
-- Update world
map:update(dt)
end
function love.draw()
-- Scale world
local scale = 2
local screen_width = love.graphics.getWidth() / scale
local screen_height = love.graphics.getHeight() / scale
map:draw()
end
end
Re: Bump.lua - collision not working
Posted: Fri Jun 21, 2019 3:32 am
by AdrianN
2lostsouls wrote: ↑Fri Jun 21, 2019 1:39 am
Ok, I really want to learn this but it is getting very frustrating. I cannot get the collision to work. I cannot find a tutorial that really shows me how to do the collision. The picture shows my character but he is going right through the object that I want him not to go through. Is there any one that can look at the code and see if there is something I should be adding. I am showing some pics on how my tileset looks and my map as well as my Main.lua. Thank you.
Code: Select all
-- Include Simple Tiled Implementation into project
sti = require "sti"
bump = require "bump"
function love.load()
-- Load map file
map = sti("map.lua")
local world = bump.newWorld()
local map = sti('map.lua', {"bump"}) -- This loads the map file, and loads the bump plugin for STI
map:bump_init(world) -- This initializes the bump plugin, and loads all of your collidable tiles
-- Create new dynamic data layer called "Sprites" as the 3rd layer
local layer = map:addCustomLayer("Sprites", 3)
-- Get player spawn object
local player
for k, object in pairs(map.objects) do
if object.name == "Player" then
player = object
break
end
end
-- Create player object
local sprite = love.graphics.newImage("sprite.png")
img = love.graphics.newQuad(0, 0, 32, 64, sprite:getDimensions())
layer.player = {
sprite = sprite,
x = player.x,
y = player.y,
ox = sprite:getWidth() / 2,
oy = sprite:getHeight() / 1.35
}
-- Add controls to player
layer.update = function(self, dt)
-- 96 pixels per second
local speed = 96
-- Move player up
if love.keyboard.isDown("w") or love.keyboard.isDown("up") then
self.player.y = self.player.y - speed * dt
end
-- Move player down
if love.keyboard.isDown("s") or love.keyboard.isDown("down") then
self.player.y = self.player.y + speed * dt
end
-- Move player left
if love.keyboard.isDown("a") or love.keyboard.isDown("left") then
self.player.x = self.player.x - speed * dt
end
-- Move player right
if love.keyboard.isDown("d") or love.keyboard.isDown("right") then
self.player.x = self.player.x + speed * dt
end
end
-- Draw player
layer.draw = function(self)
love.graphics.draw(
self.player.sprite,
math.floor(self.player.x),
math.floor(self.player.y),
0,
1,
1,
self.player.ox,
self.player.oy
)
end
-- Remove unneeded object layer
map:removeLayer("Spawn Point")
function love.update(dt)
-- Update world
map:update(dt)
end
function love.draw()
-- Scale world
local scale = 2
local screen_width = love.graphics.getWidth() / scale
local screen_height = love.graphics.getHeight() / scale
map:draw()
end
end
http://karai17.github.io/Simple-Tiled-I ... p.lua.html
collidable set to true, can be used on any Layer, Tile, or Object
You need to rename
collidable instead of
Collidable and variable
boolean type
Re: Bump.lua - collision not working
Posted: Fri Jun 21, 2019 6:50 pm
by 2lostsouls
Ok, thank you. I did that but still not working.
Re: Bump.lua - collision not working
Posted: Sat Jun 22, 2019 5:26 pm
by Karai17
Have you looked at the tutorial that is in the github repo?
https://github.com/karai17/Simple-Tiled ... -to-sti.md
Re: Bump.lua - collision not working
Posted: Sat Jun 22, 2019 6:57 pm
by AdrianN
2lostsouls wrote: ↑Fri Jun 21, 2019 1:39 am
Ok, I really want to learn this but it is getting very frustrating. I cannot get the collision to work. I cannot find a tutorial that really shows me how to do the collision. The picture shows my character but he is going right through the object that I want him not to go through. Is there any one that can look at the code and see if there is something I should be adding. I am showing some pics on how my tileset looks and my map as well as my Main.lua. Thank you.
Code: Select all
-- Include Simple Tiled Implementation into project
sti = require "sti"
bump = require "bump"
function love.load()
-- Load map file
map = sti("map.lua")
local world = bump.newWorld()
local map = sti('map.lua', {"bump"}) -- This loads the map file, and loads the bump plugin for STI
map:bump_init(world) -- This initializes the bump plugin, and loads all of your collidable tiles
-- Create new dynamic data layer called "Sprites" as the 3rd layer
local layer = map:addCustomLayer("Sprites", 3)
-- Get player spawn object
local player
for k, object in pairs(map.objects) do
if object.name == "Player" then
player = object
break
end
end
-- Create player object
local sprite = love.graphics.newImage("sprite.png")
img = love.graphics.newQuad(0, 0, 32, 64, sprite:getDimensions())
layer.player = {
sprite = sprite,
x = player.x,
y = player.y,
ox = sprite:getWidth() / 2,
oy = sprite:getHeight() / 1.35
}
-- Add controls to player
layer.update = function(self, dt)
-- 96 pixels per second
local speed = 96
-- Move player up
if love.keyboard.isDown("w") or love.keyboard.isDown("up") then
self.player.y = self.player.y - speed * dt
end
-- Move player down
if love.keyboard.isDown("s") or love.keyboard.isDown("down") then
self.player.y = self.player.y + speed * dt
end
-- Move player left
if love.keyboard.isDown("a") or love.keyboard.isDown("left") then
self.player.x = self.player.x - speed * dt
end
-- Move player right
if love.keyboard.isDown("d") or love.keyboard.isDown("right") then
self.player.x = self.player.x + speed * dt
end
end
-- Draw player
layer.draw = function(self)
love.graphics.draw(
self.player.sprite,
math.floor(self.player.x),
math.floor(self.player.y),
0,
1,
1,
self.player.ox,
self.player.oy
)
end
-- Remove unneeded object layer
map:removeLayer("Spawn Point")
function love.update(dt)
-- Update world
map:update(dt)
end
function love.draw()
-- Scale world
local scale = 2
local screen_width = love.graphics.getWidth() / scale
local screen_height = love.graphics.getHeight() / scale
map:draw()
end
end
I think you need to register the position of you shape in bump word. And check if you can move it.
Code: Select all
world:add(A, 0, 0, 64, 256)
...
local actualX, actualY, cols, len = world:move(B, 0,64)
https://github.com/kikito/bump.lua
Tutorial Bump-Tiled :
http://osmstudios.com/tutorials/love2d- ... ing-levels
Re: Bump.lua - collision not working
Posted: Wed Jul 03, 2019 2:50 pm
by kikito
Hi, bump author here.
It seems to me that there is something wrong with your "update" function. If you are using bump you should never be doing something like this:
Code: Select all
if love.keyboard.isDown("w") or love.keyboard.isDown("up") then
self.player.y = self.player.y - speed * dt
end
The way bump works is by telling it "hey I want to move this object from where it is to *{x,y}*". Then bump "processes the attempt" and gives you a new x and y ("ok, this is where your object ended up when attempting to move to {x,y}") and a list of collisions ("and this is the list of objects it collided with"). This is done with the *world:move* method. See this link:
https://github.com/kikito/bump.lua#movi ... resolution