Collision of sub-table objects

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
User avatar
CanYouReply
Prole
Posts: 10
Joined: Sat May 16, 2020 7:33 pm

Collision of sub-table objects

Post by CanYouReply »

I am making a small game where two objects are there (i) bigBox & (2) avtarGod. Now 'avtarGod' is having one subtable object named 'arrows'. The object 'bigBox' is like an enemy entity. Both bigBox & avtarGod objects are moving opposite direction and crossing each other. Subtable object 'arrows' are being fired by 'avtarGod' object (when '1' is pressed). When 'arrows' objects are colliding with 'bigBox' object then 'arrows' are destroyed and deleted from the screen. Here is my question... can this 'arrows' object be bounced back in opposite direction, rather than getting destroyed, once 'arrows' collides with 'bigBox' ? We need to bounce back only those 'arrows' which are colliding with 'bigBox' not the other 'arrows' which are not colliding. my full code is given below :

Code: Select all

function love.load(arg)

  -- create table for the big box:
  bigBox = {}
  bigBox.width = 80
  bigBox.height = 60
  bigBox.x = 100
  bigBox.y = 40
  bigBox_Speed = 120

  -- Gamelogic: 'avtarGod' is a god and he has a wepon 'arrows' This arrows is a sub table of
  -- 'avtarGod' We are here controlling the subtable object arrows each item separately
  avtarGod = {}
    avtarGod.x = 740
    avtarGod.y = 550
    avtarGod.width = 35
    avtarGod.height = 25
    avtarGod.arrows = {} -- weapons of the avtarGod. This is a sub table of 'avtarGod'.

end



function love.update(dt)

  -- move bigBox in a direction as per below codes
  bigBox.x = bigBox.x + 10 * dt
  bigBox.y = bigBox.y + 15 * dt

  -- move the avtarGod towards bigBox enemy
  avtarGod.x = avtarGod.x - 12 * dt
  avtarGod.y = avtarGod.y - 20 * dt

  -- create a table to store arrow's index which hit the bigBox and went outside the screen
  local remArrows = {}

  -- move avtarGod arrows (we have to do it in loop using 'for' as it is a sub table of avtar)
  for i, v in ipairs(avtarGod.arrows) do

      if v.y < 0 then -- if arrows moved outside the screen then remember their index numbers
        table.insert(remArrows, i)
      end

      -- move the arrows
      v.x = v.x - 115 * dt
      v.y = v.y - 30 * dt

    -- when collision happened remember the arrows which has collided
    if Collision(v.x, v.y, v.width, v.height, bigBox.x, bigBox.y, bigBox.width, bigBox.height) then
      -- mark the arrow index for later removal
      table.insert(remArrows, i)
    end
  end

    -- remove the collided arrows and the arrows which went out of the screen
    for i, v in ipairs(remArrows) do
      table.remove(avtarGod.arrows, v)
    end
end



function love.draw()
  -- draw the bigBox
  love.graphics.setColor(200, 200, 60, 255)
  love.graphics.rectangle('fill', bigBox.x, bigBox.y, bigBox.width, bigBox.height)

  -- draw the avtar avtarGod
  love.graphics.setColor(255, 200, 190, math.random(40, 255))
  love.graphics.rectangle('fill', avtarGod.x, avtarGod.y, avtarGod.width, avtarGod.height)

  -- show weapon1 of avtarGod
  love.graphics.setColor(255, 0, 0, 255)
  for i, v in ipairs(avtarGod.arrows) do
    love.graphics.rectangle('fill', v.x, v.y, v.width, v.height)
  end
end


function love.keypressed(key)
  if key == '1' then
    callWeapon1()
  end
end


-- create collision of the objects
function Collision(ax1,ay1,aw,ah, bx1,by1,bw,bh)
  local ax2,ay2,bx2,by2 = ax1 + aw, ay1 + ah, bx1 + bw, by1 + bh
  return ax1 < bx2 and ax2 > bx1 and ay1 < by2 and ay2 > by1
end


function callWeapon1()
  weapon = {}
  weapon.x = avtarGod.x
  weapon.y = avtarGod.y
  weapon.width = 2
  weapon.height = 5
  table.insert(avtarGod.arrows, weapon)
end
User avatar
rougan
Citizen
Posts: 58
Joined: Wed Aug 12, 2015 10:30 am

Re: Collision of sub-table objects

Post by rougan »

Yep, they can! A simple solution is keeping track of the arrow 'direction' and inverting this when necessary.
Adding

Code: Select all

weapon.direction = -1
in callWeapon1()
and modifying the arrow update code slightly to:

Code: Select all

      -- move the arrows
      v.x = v.x + 115 * dt * v.direction
      v.y = v.y + 30 * dt * v.direction

    -- when collision happened remember the arrows which has collided
    if Collision(v.x, v.y, v.width, v.height, bigBox.x, bigBox.y, bigBox.width, bigBox.height) then
      -- reverse the arrow's direction
      v.direction = v.direction * -1
    end
Which will move the object in the specified direction, and then reverse movement on both axes when collided with the enemy. This will only work properly with collisions on the enemy's right edge, so you'll to look at adding direction scalars for both x and y axes and detecting on which enemy edge the collision occurs, but this is the general idea!
Post Reply

Who is online

Users browsing this forum: Google [Bot], sawby and 2 guests