Skip to content

Instantly share code, notes, and snippets.

@tnn4
Last active May 7, 2025 00:39
Show Gist options
  • Save tnn4/be82014b078219fa0e5b7bc7252e1d1b to your computer and use it in GitHub Desktop.
Save tnn4/be82014b078219fa0e5b7bc7252e1d1b to your computer and use it in GitHub Desktop.
circle class example in love

Requires love 11.5.

Put files in a directory then run love path/to/directory

dir
  main.lua
  classic.lua
--
-- classic
--
-- Copyright (c) 2014, rxi
--
-- This module is free software; you can redistribute it and/or modify it under
-- the terms of the MIT license. See LICENSE for details.
--
local Object = {}
Object.__index = Object
function Object:new()
end
function Object:extend()
local cls = {}
for k, v in pairs(self) do
if k:find("__") == 1 then
cls[k] = v
end
end
cls.__index = cls
cls.super = self
setmetatable(cls, self)
return cls
end
function Object:implement(...)
for _, cls in pairs({...}) do
for k, v in pairs(cls) do
if self[k] == nil and type(v) == "function" then
self[k] = v
end
end
end
end
function Object:is(T)
local mt = getmetatable(self)
while mt do
if mt == T then
return true
end
mt = getmetatable(mt)
end
return false
end
function Object:__tostring()
return "Object"
end
function Object:__call(...)
local obj = setmetatable({}, self)
obj:new(...)
return obj
end
return Object
Object = require 'classic'
function love.load()
circle1 = circle(400,300,50)
end
function love.draw()
Circle2:drawShaking(0.2)
end
function love.update()
end
function love.mousepressed(x,y,btn,istouch)
Circle2:mousePressed(x,y,btn,istouch, function()
print('Circle2 was pressed')
end)
end
local circle = Object:extend()
--Creates a circle with position x,y and radius
--
--
---@param x number
---@param y number
---@param radius number
---@param r number
---@param g number
---@param b number
--**creation_time** Will have a creation_time
function circle:new(x,y,radius, r,g,b)
self.x = x or 0
self.y = y or 0
self.radius = radius or 1
self.r = r or 1
self.g = r or 1
self.b = r or 1
self.creation_time = love.timer.getTime()
end
function circle:getCreationTime()
return self.creation_time
end
function circle:draw()
love.graphics.circle("fill", self.x, self.y, self.radius)
-- love.graphics.reset()
end
-- see: https://stackoverflow.com/questions/5837572/generate-a-random-point-within-a-circle-uniformly
-- how to create a shaking circle
--
-- r = R * sqrt(random())
--
-- theta = random() *2 * pi
--
-- x = centerX + r * cos(theta)
--
-- y = centerY + r * sin(theta)
---@param _shake_radius number magnitude of shaking [0..1] / default 10% of circle radius
---@return nil
function circle:drawShaking(_shake_radius)
local shake_radius = (_shake_radius*self.radius) or (.1*self.radius)
local pi = 3.14159
local r = shake_radius * math.sqrt(love.math.random())
local theta = love.math.random() *2*pi
local new_x = self.x + r * math.cos(theta)
local new_y = self.y + r * math.sin(theta)
love.graphics.circle("fill", new_x, new_y, self.radius)
end
function circle:update(dt)
end
-- Put this function inside love.mousepressed(x,y,btn,istouch)
function circle:mousePressed(x,y, btn, istouch, callback)
if btn == 1 then
-- For a circle button at 20, 50 coordinates with 40 radius:
if math.sqrt((self.x-x)^2+(self.y-y)^2) <= self.radius then
--do your stuff because the button was pressed
callback()
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment