## [bump.lua] world:remove doesn't work

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
maxtrautwein
Prole
Posts: 5
Joined: Sun Apr 14, 2019 5:14 pm

### [bump.lua] world:remove doesn't work

Hi! I'm using the collision library bump.lua and everything works well except world:remove, I can't remove any items from my world and I have the following error message "item table must be added to the world before getting its rect. Use world:add." but i have already used world:add to add my player to the world and it still doesn't work.
any ideas? thanks!

Code: Select all

function love.load()
end


Code: Select all

function love.keypressed(key)
if key == 'q' then
world:remove(red)
end
end


MrFariator
Citizen
Posts: 98
Joined: Wed Oct 05, 2016 11:53 am

### Re: [bump.lua] world:remove doesn't work

Bump uses hard references to whatever you insert into the world with the add() function. As such, I suspect when you are trying to call remove() with your 'red' object, the 'red' is not the same exact object that you passed to the bump world previously. Are you deleting or recreating the table representing 'red' at some point before the remove() function gets invoked?
-- Run once in a blue moon
if math.random() > 0.99 then
account:post ( currentProgress:getGIF() )
end

maxtrautwein
Prole
Posts: 5
Joined: Sun Apr 14, 2019 5:14 pm

### Re: [bump.lua] world:remove doesn't work

I have only this at the top of my code

Code: Select all

local red = {x=120, y=300, w=30, h=50, vx=0, vy=0, jump=false}

But I don't understand why it doesn't work, I also tried this inside love.keypressed as a test and it still doesn't work :

Code: Select all

        test = {x=0,y=0,w=10,h=10}

if key == "c" then
end

if key == "d" then
world:remove(test)
end


grump
Party member
Posts: 553
Joined: Sat Jul 22, 2017 7:43 pm

### Re: [bump.lua] world:remove doesn't work

You're creating a new 'test' table every time love.keypressed is called, and the one you've added before is lost.

This should work:

Code: Select all

local test = { x = 0, y... } -- outside the function!

function love.keypressed(key)
if key == "c" then
end

if key == "d" then
world:remove(test)
end
end


maxtrautwein
Prole
Posts: 5
Joined: Sun Apr 14, 2019 5:14 pm

### Re: [bump.lua] world:remove doesn't work

Ho ok yes it works this time but with my other items it still doesn't work, here is an exemple of where I want to use world:remove, "tir" means bullet in french, these are some functions that create a bullet each time I press "space" and delete it when the bullet collide.

Code: Select all


local tirs = {liste={}}

-- TIRS --
function tirs.create(player)
local tir = {x=player.x+40, y=player.y+player.h/3, w=10, h=3}
table.insert(tirs.liste, tir)
return tir
end

function tirs.delete(tir)
local delete = false
for i = 1, len do
local col = cols[i]
if col.normal.x == -1 or col.normal.x == 1 or col.normal.y == -1 or col.normal.y == 1 then
world:remove(tir)
end
end
end

function tirs.update(dt)
for i = #tirs.liste, 1, -1 do
local tir = tirs.liste[i]
local vx = 0
vx = vx + 500*dt
tir.x, tir.y, cols, len = world:move(tir, tir.x + vx, tir.y)
tirs.delete(tir)
end
end

function tirs.draw()
for i = #tirs.liste, 1, -1 do
local tir = tirs.liste[i]
love.graphics.rectangle("line", tir.x, tir.y, tir.w, tir.h)
end
end
---
function game.keypressed(key)
if key == 'space' then
tirs.create(red)
end
end

Everything works fine until a bullet collide with another object from the world : "item table must be added to the world before getting its rect."

MrFariator
Citizen
Posts: 98
Joined: Wed Oct 05, 2016 11:53 am

### Re: [bump.lua] world:remove doesn't work

From that code-snippet the problem seems to be rather simple: you successfully remove a bullet from the world as the conditions are true in tirs.delete, but you never remove the bullet from the table containing the list of bullets (tirs.liste), or even break the for-loop in which the world:remove() is called. Thus, immediately the next frame or next tick in the for-loop, after you have removed a bullet, it will try to call bump a function with that said bullet, resulting in an error.

What you probably meant to do was:

Code: Select all

function tirs.delete(tir, cols, len)
local delete = false
for i = 1, len do
local col = cols[i]
if col.normal.x == -1 or col.normal.x == 1 or col.normal.y == -1 or col.normal.y == 1 then
world:remove(tir)
return true -- return a value on successful removal, and break the loop
end
end
end

function tirs.update(dt)
for i = #tirs.liste, 1, -1 do
local tir = tirs.liste[i]
local vx = 0
vx = vx + 500*dt
tir.x, tir.y, cols, len = world:move(tir, tir.x + vx, tir.y)
if tirs.delete(tir, cols, len) then -- check for successful removal
table.remove(tirs.liste, i ) -- remove the bullet from the list
end
end
end	
edit: corrected some mistakes in wording
-- Run once in a blue moon
if math.random() > 0.99 then
account:post ( currentProgress:getGIF() )
end

maxtrautwein
Prole
Posts: 5
Joined: Sun Apr 14, 2019 5:14 pm

### Re: [bump.lua] world:remove doesn't work

hoo ok now I understand, thank you very much it works perfectly! I

### Who is online

Users browsing this forum: No registered users and 139 guests