Problem when a table collides with a table

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
galaxified
Prole
Posts: 3
Joined: Sun Aug 07, 2022 4:21 am

Problem when a table collides with a table

Post by galaxified »

When checking collisions between two tables, and then removing the objects that collided from their corresponding table, the next one in that table moves it's y position by -something; also I'm using the classic library for classes

I check collisions by putting this in love.update()

Code: Select all

for i,v in pairs(enemies) do
		for g,h in pairs(bullets) do
			v:collisionbullets(h, i, g)
		end
end
then v:collisionbullets is this

Code: Select all

function Enemy:collisionbullets(b, i, g)
	if self.y + self.height >= b.y and self.y <= b.y + b.height
		and self.x <= b.x + b.width and self.x + self.width >= b.x then
		table.remove(enemies, i)
		table.remove(bullets, g)
	end
end
(b is the bullet)

And all of that works just as it should, except for the table.remove part

Basically if it removes the first object from the table, then the now first (which before the removal was second) has it's y value shifted slightly, or atleast that's how I understand it

I kinda resolved it by modyfying v:collisionbullets like so:

Code: Select all

function Enemy1:collisionbullets(b, i, g)
	if self.y + self.height >= b.y and self.y <= b.y + b.height
		and self.x <= b.x + b.width and self.x + self.width >= b.x then
		table.remove(enemies, i)
		table.remove(bullets, g)
		for i,v in ipairs(enemies) do
	      		if i == 1 then
	        		v.y = v.y+x --x is the shifted value--
	      		end
	    	end
	end
end
However x varies depending on the height of the object, I believe (e.g an object with the height of 50 is shifted by -4).
I'm not sure what this is and I do realize this is a fairly long post, but if you would like to help, I'll appreciate all of it, maybe the problem is in the library, or maybe it's in me, also I hope I provided all the needed information
User avatar
darkfrei
Party member
Posts: 737
Joined: Sat Feb 08, 2020 11:09 pm

Re: Problem when a table collides with a table

Post by darkfrei »

Always iterate it backwards

Code: Select all

for iTarget = #targets, 1, -1 do
	local target = targets[iTarget]
	for iBullet = #bullets, 1, -1 do
		local bullet = bullets[iBullet]
		if isBulletToTargetCollision (bullet, target) then
			-- any events here
			table.remove (targets, iTarget)
			table.remove (bullets, iBullet)
			break -- do not check any bullet-to-target collision for this removed target
		end
	end
end
OR in the cycle set it as

Code: Select all

enemy.valid = false 
bullet.valid = false
and ignore it without actual removing. After all collidings do two cycles (backwards) to remove all not valid objects.
User avatar
ReFreezed
Party member
Posts: 587
Joined: Sun Oct 25, 2015 11:32 pm
Location: Sweden
Contact:

Re: Problem when a table collides with a table

Post by ReFreezed »

In addition to darkfrei's answer, pairs() does not iterate over items in any particular order. (It's also for iterating over all fields in a table, numeric or not. See Lua's manual.) You should be using ipairs() when you want to iterate from index 1 and forward (but not in this case, as darkfrei is explaining).
Tools: Hot Particles, LuaPreprocess, InputField, (more) Games: Momento Temporis
"If each mistake being made is a new one, then progress is being made."
Post Reply

Who is online

Users browsing this forum: No registered users and 16 guests