user3020530
user3020530

Reputation: 21

How can I work with class in lua love2d (OOP)

I don't know how make classes in lua so I used code which was recommended on forum. But always only one object works. First one have coordinates x,y and the other object share his coordinates. Can you explain what I´m doing wrong in this code. Thank you for your advice.

My code:

require("class") 

asteroid = class:new()

function asteroid:init(x,y)
        asteroid.b = love.physics.newBody(world, x ,y , "dynamic")
        asteroid.s = love.physics.newCircleShape(35)
        asteroid.f = love.physics.newFixture(asteroid.b, asteroid.s)  
end

function love.load() 
world = love.physics.newWorld(0, 50, true)  

asteroid1= asteroid:new(100,100)
asteroid2= asteroid:new(700,100)
end


function love.update(dt)
 world:update(dt)
end

function love.draw()
love.graphics.circle("line", asteroid1.b:getX(),asteroid1.b:getY(), asteroid1.s:getRadius(), 35)
love.graphics.circle("line", asteroid2.b:getX(),asteroid2.b:getY(), asteroid2.s:getRadius(), 35)
end

Recommended code:

__HAS_SECS_COMPATIBLE_CLASSES__ = true

local class_mt = {}

function class_mt:__index(key)
    return self.__baseclass[key]
end

class = setmetatable({ __baseclass = {} }, class_mt)

function class:new(...)
    local c = {}
    c.__baseclass = self
    setmetatable(c, getmetatable(self))
    if c.init then
        c:init(...)
    end
    return c
end

Upvotes: 2

Views: 2340

Answers (2)

Oliver
Oliver

Reputation: 29463

The : syntax causes an implicit self to be available as a local, referring to the object instance. But you are assigning to b at class level. Use self.b = instead of asteroid.b = so that the assignment is specific to the instance.

Upvotes: 0

Jatin Malwal
Jatin Malwal

Reputation: 5263

Here is a demo code for you

local MyClass = {}
MyClass.__index = MyClass

setmetatable(MyClass, {
  __call = function (cls, ...)
    return cls.new(...)
  end,
})

function MyClass.new(init)
  local self = setmetatable({}, MyClass)
  self.value = init
  return self
end

-- the : syntax here causes a "self" arg to be implicitly added before any other args
function MyClass:set_value(newval)
  self.value = newval
end

function MyClass:get_value()
  return self.value
end

local instance = MyClass(5)
-- do stuff with instance...

I would suggest you to follow these tutorials

http://lua-users.org/wiki/ObjectOrientationTutorial

http://lua-users.org/wiki/TutorialDirectory

Upvotes: 2

Related Questions