Exemplo n.º 1
0
 def physicsStep(self, entity):
     force = Vector()
     if not isinstance(self.root, Sprite):
         stack = [self.root]
         while len(stack) > 0:
             curr = stack.pop()
             d = curr.size/Vector.Distance(curr.center_of_mass, entity.pos)
             if d < THETA:
                 force += QuadTree.calc_force(curr.center_of_mass,
                                              entity.pos,
                                              curr.total_mass,
                                              entity.mass)
             else:
                 for c in curr.children.values():
                     if c is None or c is entity:
                         continue
                     elif isinstance(c, Sprite):
                         force += QuadTree.calc_force(c.pos, entity.pos,
                                                      c.mass, entity.mass)
                     else:
                         stack.append(c)
     entity.pos = entity.pos + entity.vel * DT
     entity.vel = entity.vel + (force / entity.mass) * DT
     if Vector.Length(entity.vel) > SPEED_LIMIT:
         entity.vel *= OVERSPEED_DAMP
     else:
         entity.vel *= NORMAL_DAMP
Exemplo n.º 2
0
 def calc_force(pos1, pos2, mass1, mass2):
     force = (pos1 - pos2) / Vector.Distance(pos1, pos2)**3
     force *= mass1*mass2 * G
     return force
Exemplo n.º 3
0
 def BruteForceCircles(self, group):
     for a, b in combinations(group, 2):
         collided = Vector.Distance(a.pos, b.pos) < (a.rad + b.rad)
         if collided:
             physics.collide(a, b)