def collide(self, obj): dist = sqrt((self.pos[0]-obj.pos[0])**2 + (self.pos[1]-obj.pos[1])**2) d = util.vsub(obj.pos, self.pos) par = util.vproj(self.vel, d) orth = util.vsub(self.vel, par) if util.vdot(self.vel, d) > 0: self.force = util.vadd(self.force, util.vmuls(par, -1.5 * self.mass)) overlap = max(((self.size + obj.size) - dist) / 20.0, .1) self.force = util.vadd(self.force, util.vmuls(d, -overlap / dist * self.mass))
def update(self): self.force[1] += -.1 * self.mass self.compute_wall_force_circle(self.size, .5) # air resistance if util.vmag(self.vel) > 1: vmag = util.vmag(self.vel) vdir = util.vdivs(self.vel, -.9 * vmag) self.force = util.vadd(self.force, vdir) self.integrate_force() self.vel[0] = util.clamp(self.vel[0], -20, 20) self.vel[1] = util.clamp(self.vel[1], -20, 20)