You can use the mouse wheel to change the size that new objects will have.
Anyway, since this should now count as the cleaned up version, I'll remove the two earlier ones by editing my messages yet again. And since I had to write that thing about licenses before, I'm still putting a license on this. It's now the MIT License, and I am going to stick to that from now on.
So. It's OK to lock this thread. Perhaps you could wait a few days for any last comments if people still want to add something. It's really up to you. I'm pretty sure I'm done by now.
Also, no kicking or screaming was involved. I'm just being busy with hacking at my little Lovefest game with what free time I have. I better pay a little more attention to the code I am going to post in the future, though.
I have no opposition to using the logical or as above. I just prefer the if-then-else style myself, so I'll stick with it for this example, since it is already in the code. And you know what will happen if I try to make some last-minute edits before posting code... Horrors will happen.
Code: Select all
local license = [[
Copyright (c) 2010 Pekka Karjalainen
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
]]
local drawables = {}
local groundbody = nil
local groundshape = nil
local curSize = 40
local timeAcc = 0
local timeStep = 1/60
local TWOPI = math.pi * 2
local TGTFPS = 90
local lastframe = nil
function love.load()
world = love.physics.newWorld(-100,-100, 900, 700, 0, 20)
groundbody = love.physics.newBody(world, 400, 570)
groundshape = love.physics.newRectangleShape(groundbody, 0, 0, 600, 40)
lastframe = love.timer.getMicroTime()
end
function love.keypressed(k)
if k == 'escape' then
love.event.push('q')
end
end
function love.draw()
local haveGR = true
local triangleMessage = ''
for _, d in ipairs(drawables) do
local name, body, shape, size = unpack(d)
if shape.getRestitution == nil then haveGR = false end
local x, y = body:getWorldCenter()
local angle = body:getAngle()
if name == "circle" then
local rad = size/2
love.graphics.circle("line", x, y, rad, 32)
love.graphics.line(x, y, x + math.cos(angle) * rad,
y + math.sin(angle) * rad)
end
if name == "square" then
local mul = math.sqrt(size^2/2) -- from center to corner
for r = 0, 3 do
r = r - 0.5 -- correct orientation
love.graphics.line(x + math.cos(angle + r/4*TWOPI)*mul,
y + math.sin(angle + r/4*TWOPI)*mul,
x + math.cos(angle + (r+1)/4*TWOPI)*mul,
y + math.sin(angle + (r+1)/4*TWOPI)*mul)
end
end
if name == "triangle" then
local mul = size * math.sqrt(3)/3 -- r of circumscribed circle
for r = 0, 2 do
r = r + 3/4 -- correct orientation
love.graphics.line(x + math.cos(angle + r/3*TWOPI)*mul,
y + math.sin(angle + r/3*TWOPI)*mul,
x + math.cos(angle + (r+1)/3*TWOPI)*mul,
y + math.sin(angle + (r+1)/3*TWOPI)*mul)
end
end
end
x, y = groundbody:getPosition()
love.graphics.rectangle("fill", x-300, y-20, 600, 40)
love.graphics.print(tostring(#drawables) .. " objects created", 10, 20)
if haveGR and #drawables > 0 then
love.graphics.print("and they all have a getRestitution method", 10, 40)
end
love.graphics.print('current object size: ' .. curSize, 10, 60)
end
function love.update(dt)
timeAcc = timeAcc + dt
while timeAcc > timeStep do
timeAcc = timeAcc - timeStep
world:update(timeStep)
end
local sleep = 1000/TGTFPS - 1000 * (love.timer.getMicroTime() - lastframe)
if sleep > 0 then love.timer.sleep(sleep) end
lastframe = love.timer.getMicroTime()
end
local circleCreated = false
local polygonCreated = false
function love.mousepressed( x, y, button )
if button == 'wd' then curSize = curSize - 1 end
if button == 'wu' then curSize = curSize + 1 end
if button == 'wd' or button == 'wu' then
if curSize < 5 then curSize = 5 end
if curSize > 100 then curSize = 100 end
return
end
local body = love.physics.newBody(world, x, y)
local shape, name = nil, nil
if button == 'l' then
shape = love.physics.newCircleShape(body, 0, 0, curSize/2)
name = "circle"
if circleCreated == false then
circleCreated = true
mt = getmetatable(shape)
if mt.getRestitution == nil then
mt.getRestitution = mt.getRestituion
end
end
end
if button == 'r' then
shape = love.physics.newRectangleShape(body, 0, 0, curSize, curSize)
name = "square"
if polygonCreated == false then
polygonCreated = true
mt = getmetatable(shape)
if mt.getRestitution == nil then
mt.getRestitution = mt.getRestituion
end
end
end
if button == 'm' then
local ela = curSize*math.sqrt(3)/2 -- altitude of an equilateral triangle
shape = love.physics.newPolygonShape(body, -curSize/2, -ela/3,
curSize/2, -ela/3, 0, 2*ela/3)
name = "triangle"
if polygonCreated == false then
polygonCreated = true
mt = getmetatable(shape)
if mt.getRestitution == nil then
mt.getRestitution = mt.getRestituion
end
end
end
shape:setDensity(50)
body:setMassFromShapes()
table.insert(drawables, {name, body, shape, curSize})
end