Bullet = Object:extend() cos = math.cos sin = math.sin --optimisation pi = math.pi function Bullet:new(x, y, p, speed, rotation) self.image = love.graphics.newImage("assets/bullet.png") self.x = x self.y = y self.p = p self.speed = speed self.rotation = rotation self.width = self.image:getWidth() self.height = self.image:getHeight() self.scaleX = 1 self.scaleY = 1 self.originX = self.width / 2 self.originY = self.height / 2 self.collider = World:newCircleCollider(x, y, 10) self.collider:setFixedRotation(true) self.collider:setPosition(self.x, self.y) if self.p == 1 then self.collider:setCollisionClass("Bullet1") elseif self.p == 2 then self.collider:setCollisionClass("Bullet2") end end function Bullet:update(dt) --If a bullet hits a wall, make it bounce off the wall and change its rotation if self.p == 1 then if self.collider:enter("Wall") then --calculate normal of the wall --calculate the angle of reflection local angle = (math.atan2(dx, dy)) --get normal of the wall without using getNormal() ----TODO: fix this --set the new angle self.rotation = angle self.collider:setAngle(self.rotation) end dx = cos(self.rotation) * self.speed * dt dy = sin(self.rotation) * self.speed * dt self.collider:setLinearVelocity(dx, dy) end if self.p == 2 then local dx = cos(self.rotation) * self.speed * dt local dy = sin(self.rotation) * self.speed * dt self.collider:setLinearVelocity(dx, dy) end self.x = self.collider:getX() self.y = self.collider:getY() end function Bullet:draw() for _, _ in ipairs(Bullets1) do love.graphics.draw( self.image, self.x, self.y, self.rotation, self.scaleX, self.scaleY, self.originX, self.originY ) end for _, _ in ipairs(Bullets2) do love.graphics.draw( self.image, self.x, self.y, self.rotation, self.scaleX, self.scaleY, self.originX, self.originY ) end end