def stopObjectEarly(obj, colTime, time, neighborDict, collisionList): newPos = obj.getPosInTime(colTime) #Set the new object position as the position right before the collision #set its movement to 0 obj.pos = newPos; obj.requestedPos = newPos; obj.movedDir = (0,0) obj.vel = Vector(0.0,0.0) #remove all references to obj from collisionList collisionList = [x for x in collisionList if x[1] is not obj and x[3] is not obj] #Now, recalculate collision for all of its check if any of its neighbors s1 = obj.shape.translate(obj.getPos()) s1vel = obj.vel for n in neighborDict[obj]: s2 = n.shape.translate(n.getPos()) s2vel = n.vel colInfo = getCollisionInfo(s1, s1vel, s2, s2vel) if colInfo is not None: #only consider events <= time cTime, objIStops, objJStops = colInfo #ctime must be > original colTime if cTime <= time and cTime >= colTime: #print colInfo #if objI not in d: # d[objI] = set([()]) collisionList.append((cTime, obj, objIStops,n,objJStops)) #sort collision list again collisionList.sort(key=lambda x:x[0])
def generateCollisionList(self, time): """Generate a dictionary of collisions between object that are allowed to generate collision events TODO: FINISH DOC HERE only considers collisions that happen <= time""" #d = {} l = [] #TODO: improve, this is O(n^2) for testing for i in range(len(self.objectList)): objI = self.objectList[i] #create bounding box of trajectory and test for collision with appropriate tiles p1 = objI.pos p2 = objI.getPosInTime(time) shape = self.objectList[i].shape #Get bounding boxes at the 2 positions box1 = shape.getBoundingBox().translate(p1) box2 = shape.getBoundingBox().translate(p2) #generate the union between them and store it bbox = Rect.union(box1, box2) tl = [int(floor(bbox.x1/32)), int(floor(bbox.y1/32))] #top left tile indices br = [int(ceil(bbox.x2/32)), int(ceil(bbox.y2/32))] #bottom right tile indices #print tl[0], br[0] for x in range(tl[0], br[0]+1): for y in range(tl[1], br[1]+1): objJ = self.tileGrid[x][y] #the following is copied from below if not CollisionFilter.canCollide(objI, objJ): continue #Note, the shapes are at the origin, so we have to translate them # to the objects current position s1 = objI.shape.translate(objI.getPos()) s1vel = objI.vel s2 = objJ.shape.translate(objJ.getPos()) s2vel = objJ.vel #TODO: this will always return none!!! colInfo = getCollisionInfo(s1,s1vel,s2,s2vel) if colInfo is not None: #only consider events <= time colTime, objIStops, objJStops = colInfo if colTime <= time: #print colInfo #if objI not in d: # d[objI] = set([()]) l.append((colTime, objI, objIStops,objJ,objJStops)) ####end of copied code #check collision with other objects for j in range(i+1, len(self.objectList)): #objI = self.objectList[i] objJ = self.objectList[j] #If the objects can't collide, don't even bother # comparing them if not CollisionFilter.canCollide(objI, objJ): continue #Note, the shapes are at the origin, so we have to translate them # to the objects current position s1 = objI.shape.translate(objI.getPos()) s1vel = objI.vel s2 = objJ.shape.translate(objJ.getPos()) s2vel = objJ.vel #TODO: this will always return none!!! colInfo = getCollisionInfo(s1,s1vel,s2,s2vel) if colInfo is not None: #only consider events <= time colTime, objIStops, objJStops = colInfo if colTime <= time: #print colInfo #if objI not in d: # d[objI] = set([()]) l.append((colTime, objI, objIStops,objJ,objJStops)) return l