Hello,
There are many physics examples out there, but I made one just now that is very simple to understand. Just click, drag and let go and you have an awsome flashing ball bouncing around. You can also tilt your iPad to make them move. Their mass is changed according to their size. They have random bouncynesses too. Try it out! Here’s the code:
--# Main
-- Use this function to perform your initial setup
function setup()
backingMode(RETAINED)
displayMode(STANDARD)
ChangeColor:init(.1)
--gradient background and creates a fade away for circles
bgimg = image(WIDTH,HEIGHT)
setContext(bgimg)
for i = 1, HEIGHT do
ChangeColor:update()
strokeWidth(2)
stroke(ChangeColor:getColor())
line(0,i,WIDTH,i)
end
setContext()
ball = {}
currentBall = 1
canCreate = true
physics.gravity(Gravity)
wall1 = physics.body(EDGE,vec2(0,0),vec2(0,HEIGHT))
wall2 = physics.body(EDGE,vec2(0,0),vec2(WIDTH,0))
wall3 = physics.body(EDGE,vec2(WIDTH,0),vec2(WIDTH,HEIGHT))
wall4 = physics.body(EDGE,vec2(WIDTH,HEIGHT),vec2(0,HEIGHT))
wall1.type = STATIC
wall2.type = STATIC
wall3.type = STATIC
wall4.type = STATIC
wall1.restitution = .8
wall2.restitution = .8
wall3.restitution = .8
wall4.restitution = .8
end
-- This function gets called once every frame
function draw()
tint(255, 255, 255, 180)
spriteMode(CENTER)
sprite(bgimg,WIDTH/2,HEIGHT/2)
stroke(0, 255, 5, 255)
strokeWidth(5)
physics.gravity(Gravity)
currentBall = table.maxn(ball)
if CurrentTouch.state == BEGAN and canCreate then
table.insert(ball,physics.body(CIRCLE, math.random(5,50)))
currentBall = table.maxn(ball)
ball[currentBall].x = CurrentTouch.x
ball[currentBall].y = CurrentTouch.y
ball[currentBall].mass = ball[currentBall].radius / 10
ball[currentBall].restitution = 1
ball[currentBall].gravityScale = math.random(.25,5)
canCreate = false
elseif CurrentTouch.state == BEGAN and canCreate then
table.insert(ball,physics.body(CIRCLE, math.random(5,50)))
currentBall = table.maxn(ball)
ball[currentBall].x = CurrentTouch.x
ball[currentBall].y = CurrentTouch.y
ball[currentBall].mass = ball[currentBall].radius / 10
ball[currentBall].restitution = 1
ball[currentBall].gravityScale = math.random(.25,5)
canCreate = false
end
if CurrentTouch.state == MOVING or CurrentTouch.state == BEGAN then
ball[currentBall]:applyForce(vec2((CurrentTouch.x-ball[currentBall].x)/.5, (CurrentTouch.y-ball[currentBall].y)/.5))
line(CurrentTouch.x,CurrentTouch.y,ball[currentBall].x,ball[currentBall].y)
end
if CurrentTouch.state == ENDED then
canCreate = true
end
--print(currentBall)
if currentBall > 0 then
for i = 0, table.maxn(ball) do
if ball[i] == nil then
else
stroke(math.random(255),math.random(255),math.random(255),math.random(255))
fill(math.random(255),math.random(255),math.random(255),math.random(230,255))
ellipse(ball[i].x,ball[i].y,ball[i].radius*2)
end
end
end
end
--# ChangeColor
--Changing color background
--By Zoyt
ChangeColor = class()
function ChangeColor:init(cc,r,g,b)
self.phase = 0
self.changingpace = cc
self.bgr = r
self.bgg = g
self.bgb = b
end
function ChangeColor:update()
self.bgr = 128+ 127 * math.sin(self.phase / (2*math.pi))
self.bgg = 128+ 127 * math.sin(self.phase * 2/ (2*math.pi))
self.bgb = 128+ 127 * math.sin(self.phase * 3/ (2*math.pi))
self.phase = self.phase + self.changingpace
if self.phase > (360 * 6) then
self.phase = 0
end
end
function ChangeColor:getColor()
return self.bgr,self.bgg,self.bgb
end
Tell me what you think! I’ll post a video and screenshot as soon as possible.