[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
Before you make a thread asking for help, read this.
Post Reply
maxtrautwein
Prole
Posts: 17
Joined: Sun Apr 14, 2019 5:14 pm

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

Post by maxtrautwein »

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()
	world:add(red, red.x, red.y, red.w, red.h)
end

Code: Select all

function love.keypressed(key)
	if key == 'q' then 
		world:remove(red) 	
	end	
end
MrFariator
Party member
Posts: 509
Joined: Wed Oct 05, 2016 11:53 am

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

Post by MrFariator »

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?
maxtrautwein
Prole
Posts: 17
Joined: Sun Apr 14, 2019 5:14 pm

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

Post by maxtrautwein »

First thank you for your answer.
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 
		world:add(test,test.x,test.y,test.w,test.h)
	end	

	if key == "d" then
		world:remove(test)
	end
grump
Party member
Posts: 947
Joined: Sat Jul 22, 2017 7:43 pm

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

Post by grump »

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 
		world:add(test,test.x,test.y,test.w,test.h)
	end	

	if key == "d" then
		world:remove(test)
	end
end
maxtrautwein
Prole
Posts: 17
Joined: Sun Apr 14, 2019 5:14 pm

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

Post by maxtrautwein »

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)
	world:add(tir,tir.x,tir.y,tir.w,tir.h)
	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
Party member
Posts: 509
Joined: Wed Oct 05, 2016 11:53 am

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

Post by MrFariator »

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
maxtrautwein
Prole
Posts: 17
Joined: Sun Apr 14, 2019 5:14 pm

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

Post by maxtrautwein »

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

Who is online

Users browsing this forum: Google [Bot] and 50 guests