def collide(self, Object): results = false Position = None X = self.x Y = self.y if (Position != None): X = Position.x Y = Position.y #Figure out what tiles we need to check against selectionX = Math.floor((Object.x - X) / self._tileSize) selectionY = Math.floor((Object.y - Y) / self._tileSize) selectionWidth = selectionX + (Math.ceil( Object.width / self._tileSize)) + 1 selectionHeight = selectionY + Math.ceil( Object.height / self._tileSize) + 1 #Then bound these coordinates by the map edges if (selectionX < 0): selectionX = 0 if (selectionY < 0): selectionY = 0 if (selectionWidth > self.widthInTiles): selectionWidth = self.widthInTiles if (selectionHeight > self.heightInTiles): selectionHeight = self.heightInTiles #Then loop through this selection of tiles and call FlxObject.separate() accordingly rowStart = selectionY * self.widthInTiles row = selectionY overlapFound = false deltaX = X - self.last.x deltaY = Y - self.last.y #print "selection=====" #print selectionX,selectionY,selectionWidth,selectionHeight while (row <= selectionHeight): column = selectionX while (column <= selectionWidth): overlapFound = false #print "at="+str(int(rowStart+column)) tile = self._tileObjects[self._data[int(rowStart + column)]] #print "row,column",row,column,tile.allowCollisions #print "data="+str(self._data[int(rowStart+column)]) if (tile.allowCollisions): tile.x = X + column * self._tileSize tile.y = Y + row * self._tileSize tile.last.x = tile.x - deltaX tile.last.y = tile.y - deltaY #print "===========" #print tile.x,tile.y,self._tileSize #print Object.x,Object.y,Object.width,Object.height mycollide.collide(Object, tile) #raw_input() column += 1 rowStart += self.widthInTiles row += 1 return results
def overlapsWithCallback(self,Object,Callback=None,FlipCallbackParams=false,Position=None): results = false; X = self.x; Y = self.y; if(Position != None): X = Position.x; Y = Position.y; #Figure out what tiles we need to check against selectionX = Math.floor((Object.x - X)/self._tileSize) selectionY = Math.floor((Object.y - Y)/self._tileSize) selectionWidth = selectionX + (Math.ceil(Object.width/self._tileSize)) + 1; selectionHeight = selectionY + Math.ceil(Object.height/self._tileSize) + 1; #Then bound these coordinates by the map edges if(selectionX < 0): selectionX = 0; if(selectionY < 0): selectionY = 0; if(selectionWidth > self.widthInTiles): selectionWidth = self.widthInTiles; if(selectionHeight > self.heightInTiles): selectionHeight = self.heightInTiles; #Then loop through this selection of tiles and call FlxObject.separate() accordingly rowStart = selectionY*self.widthInTiles; row = selectionY; overlapFound=false; deltaX = X - self.last.x; deltaY = Y - self.last.y; while(row < selectionHeight): column = selectionX; while(column < selectionWidth): #print "row,column",row,column overlapFound = false; tile = self._tileObjects[self._data[int(rowStart+column)]]; if(tile.allowCollisions): tile.x = X+column*self._tileSize; tile.y = Y+row*self._tileSize; tile.last.x = tile.x - deltaX; tile.last.y = tile.y - deltaY; if(Callback != None): if(FlipCallbackParams): overlapFound = Callback(Object,tile); else: overlapFound = Callback(tile,Object); else: overlapFound = (Object.x + Object.width > tile.x) and (Object.x < tile.x + tile.width) and (Object.y + Object.height > tile.y) and (Object.y < tile.y + tile.height); if(overlapFound): if((tile.callback != None) and ((tile.filter == None) or (Object is tile.filter))): tile.mapIndex = rowStart+column; tile.callback(tile,Object); results = true; elif((tile.callback != None) and ((tile.filter == None) or (Object is tile.filter))): tile.mapIndex = rowStart+column; tile.callback(tile,Object); column+=1; rowStart += self.widthInTiles; row+=1; return results;
def __init__(self, MapData, TileGraphic, CollisionIndex=1, DrawIndex=1): #image = pyglet.resource.image("data/logo.png") FlxCore.__init__(self) self.CollideIndex = CollisionIndex self.DrawIndex = 1 self._ci = CollisionIndex self.widthInTiles = 0 self.heightInTiles = 0 self._data = FlxArray() #c; #cols:Array; rows = open(MapData).read().split("\n") rows.reverse() rows = rows[2:] self.heightInTiles = len(rows) for r in range(self.heightInTiles): cols = rows[r].split(",") if (len(cols) <= 1): self.heightInTiles -= 1 continue if (self.widthInTiles == 0): self.widthInTiles = len(cols) for c in range(self.widthInTiles): self._data.append(int(cols[c])) self._pixels = TileGraphic self._rects = FlxArray() self._p = FlxPoint() self._tileSize = self._pixels.height self.width = self.widthInTiles * self._tileSize self.height = self.heightInTiles * self._tileSize self.numTiles = self.widthInTiles * self.heightInTiles for i in range(self.numTiles): if (self._data[i] >= DrawIndex): self._rects.append( FlxRect(self._tileSize * self._data[i], 0, self._tileSize, self._tileSize)) else: self._rects.append(None) #self._block = FlxBlock(0,0,self._tileSize,self._tileSize,None); self._screenRows = int(Math.ceil(FlxG.height / self._tileSize) + 1) if (self._screenRows > self.heightInTiles): self._screenRows = self.heightInTiles self._screenCols = int(Math.ceil(FlxG.width / self._tileSize) + 1) if (self._screenCols > self.widthInTiles): self._screenCols = self.widthInTiles self._tileObjects = range(self._pixels.width / self._pixels.height) i = 0 while (i < self._pixels.width / self._pixels.height): collide = FlxCore.NONE if (i >= self.CollideIndex): collide = self.allowCollisions self._tileObjects[i] = FlxTile(self, i, self._tileSize, self._tileSize, (i >= self.DrawIndex), collide) i += 1
def collide(self,Object): results = false; Position=None X = self.x; Y = self.y; if(Position != None): X = Position.x; Y = Position.y; #Figure out what tiles we need to check against selectionX = Math.floor((Object.x - X)/self._tileSize) selectionY = Math.floor((Object.y - Y)/self._tileSize) selectionWidth = selectionX + (Math.ceil(Object.width/self._tileSize)) + 1; selectionHeight = selectionY + Math.ceil(Object.height/self._tileSize) + 1; #Then bound these coordinates by the map edges if(selectionX < 0): selectionX = 0; if(selectionY < 0): selectionY = 0; if(selectionWidth > self.widthInTiles): selectionWidth = self.widthInTiles; if(selectionHeight > self.heightInTiles): selectionHeight = self.heightInTiles; #Then loop through this selection of tiles and call FlxObject.separate() accordingly rowStart = selectionY*self.widthInTiles; row = selectionY; overlapFound=false; deltaX = X - self.last.x; deltaY = Y - self.last.y; #print "selection=====" #print selectionX,selectionY,selectionWidth,selectionHeight while(row <= selectionHeight): column = selectionX; while(column <=selectionWidth): overlapFound = false; #print "at="+str(int(rowStart+column)) tile = self._tileObjects[self._data[int(rowStart+column)]]; #print "row,column",row,column,tile.allowCollisions #print "data="+str(self._data[int(rowStart+column)]) if(tile.allowCollisions): tile.x = X+column*self._tileSize; tile.y = Y+row*self._tileSize; tile.last.x = tile.x - deltaX; tile.last.y = tile.y - deltaY; #print "===========" #print tile.x,tile.y,self._tileSize #print Object.x,Object.y,Object.width,Object.height mycollide.collide(Object,tile) #raw_input() column+=1; rowStart += self.widthInTiles; row+=1; return results;
def __init__(self,MapData, TileGraphic, CollisionIndex=1, DrawIndex=1): #image = pyglet.resource.image("data/logo.png") FlxCore.__init__(self); self.CollideIndex = CollisionIndex;self.DrawIndex = 1; self._ci = CollisionIndex; self.widthInTiles = 0; self.heightInTiles = 0; self._data = FlxArray(); #c; #cols:Array; rows = open(MapData).read().split("\n"); rows.reverse() rows=rows[2:] self.heightInTiles = len(rows); for r in range(self.heightInTiles): cols = rows[r].split(","); if(len(cols) <= 1): self.heightInTiles-=1; continue; if(self.widthInTiles == 0): self.widthInTiles = len(cols); for c in range(self.widthInTiles): self._data.append(int(cols[c])); self._pixels = TileGraphic self._rects = FlxArray(); self._p = FlxPoint(); self._tileSize =self._pixels.height; self.width = self.widthInTiles*self._tileSize; self.height = self.heightInTiles*self._tileSize; self.numTiles = self.widthInTiles*self.heightInTiles; for i in range(self.numTiles): if(self._data[i] >= DrawIndex): self._rects.append(FlxRect(self._tileSize*self._data[i],0,self._tileSize,self._tileSize)); else: self._rects.append(None); #self._block = FlxBlock(0,0,self._tileSize,self._tileSize,None); self._screenRows =int( Math.ceil(FlxG.height/self._tileSize)+1); if(self._screenRows > self.heightInTiles): self._screenRows = self.heightInTiles; self._screenCols = int(Math.ceil(FlxG.width/self._tileSize)+1); if(self._screenCols > self.widthInTiles): self._screenCols = self.widthInTiles; self._tileObjects = range(self._pixels.width/self._pixels.height) i=0 while(i < self._pixels.width/self._pixels.height): collide=FlxCore.NONE if(i>= self.CollideIndex): collide=self.allowCollisions self._tileObjects[i] =FlxTile(self,i,self._tileSize,self._tileSize,(i >= self.DrawIndex),collide) i+=1;
def old_collide(self,Spr): #print "map collide"#Spr.velocity.x ix =int(Math.floor((Spr.x - self.x)/self._tileSize)) iy =int(Math.floor((Spr.y - self.y)/self._tileSize)) for r in [iy-1,iy,iy+1]: if((r < 0) or (r >= self.heightInTiles)): continue; for c in [ix-1,ix,ix+1]: if((c < 0) or (c >= self.widthInTiles)): continue; at=(r)*self.widthInTiles+c #print "at=",at if( self._data[at] >= self._ci): self._block.x = self.x+c*self._tileSize; self._block.y = self.y+r*self._tileSize; self._block.collide(Spr); #print at,self._block.x,self._block.y return #old ix =int(Math.floor((Spr.x - self.x)/self._tileSize)) iy =int(Math.floor((Spr.y - self.y)/self._tileSize)) iw =int( Math.ceil(float(Spr.width)/self._tileSize)+1) ih =int(Math.ceil(float(Spr.height)/self._tileSize)+1) print "map collide",ih,iw print Spr.width,self._tileSize,Spr.x,Spr.y for r in range( ih): if((r < 0) or (r >= self.heightInTiles)): continue; for c in range(iw): if((c < 0) or (c >= self.widthInTiles)): continue; at=(iy+r)*self.widthInTiles+ix+c print "at=",at, if(at<len(self._data) and self._data[at] >= self._ci): self._block.x = self.x+(ix+c)*self._tileSize; self._block.y = self.y+(iy+r)*self._tileSize; self._block.collide(Spr);
def old_collide(self, Spr): #print "map collide"#Spr.velocity.x ix = int(Math.floor((Spr.x - self.x) / self._tileSize)) iy = int(Math.floor((Spr.y - self.y) / self._tileSize)) for r in [iy - 1, iy, iy + 1]: if ((r < 0) or (r >= self.heightInTiles)): continue for c in [ix - 1, ix, ix + 1]: if ((c < 0) or (c >= self.widthInTiles)): continue at = (r) * self.widthInTiles + c #print "at=",at if (self._data[at] >= self._ci): self._block.x = self.x + c * self._tileSize self._block.y = self.y + r * self._tileSize self._block.collide(Spr) #print at,self._block.x,self._block.y return #old ix = int(Math.floor((Spr.x - self.x) / self._tileSize)) iy = int(Math.floor((Spr.y - self.y) / self._tileSize)) iw = int(Math.ceil(float(Spr.width) / self._tileSize) + 1) ih = int(Math.ceil(float(Spr.height) / self._tileSize) + 1) print "map collide", ih, iw print Spr.width, self._tileSize, Spr.x, Spr.y for r in range(ih): if ((r < 0) or (r >= self.heightInTiles)): continue for c in range(iw): if ((c < 0) or (c >= self.widthInTiles)): continue at = (iy + r) * self.widthInTiles + ix + c print "at=", at, if (at < len(self._data) and self._data[at] >= self._ci): self._block.x = self.x + (ix + c) * self._tileSize self._block.y = self.y + (iy + r) * self._tileSize self._block.collide(Spr)
def overlapsWithCallback(self, Object, Callback=None, FlipCallbackParams=false, Position=None): results = false X = self.x Y = self.y if (Position != None): X = Position.x Y = Position.y #Figure out what tiles we need to check against selectionX = Math.floor((Object.x - X) / self._tileSize) selectionY = Math.floor((Object.y - Y) / self._tileSize) selectionWidth = selectionX + (Math.ceil( Object.width / self._tileSize)) + 1 selectionHeight = selectionY + Math.ceil( Object.height / self._tileSize) + 1 #Then bound these coordinates by the map edges if (selectionX < 0): selectionX = 0 if (selectionY < 0): selectionY = 0 if (selectionWidth > self.widthInTiles): selectionWidth = self.widthInTiles if (selectionHeight > self.heightInTiles): selectionHeight = self.heightInTiles #Then loop through this selection of tiles and call FlxObject.separate() accordingly rowStart = selectionY * self.widthInTiles row = selectionY overlapFound = false deltaX = X - self.last.x deltaY = Y - self.last.y while (row < selectionHeight): column = selectionX while (column < selectionWidth): #print "row,column",row,column overlapFound = false tile = self._tileObjects[self._data[int(rowStart + column)]] if (tile.allowCollisions): tile.x = X + column * self._tileSize tile.y = Y + row * self._tileSize tile.last.x = tile.x - deltaX tile.last.y = tile.y - deltaY if (Callback != None): if (FlipCallbackParams): overlapFound = Callback(Object, tile) else: overlapFound = Callback(tile, Object) else: overlapFound = (Object.x + Object.width > tile.x) and ( Object.x < tile.x + tile.width) and ( Object.y + Object.height > tile.y) and (Object.y < tile.y + tile.height) if (overlapFound): if ((tile.callback != None) and ((tile.filter == None) or (Object is tile.filter))): tile.mapIndex = rowStart + column tile.callback(tile, Object) results = true elif ((tile.callback != None) and ((tile.filter == None) or (Object is tile.filter))): tile.mapIndex = rowStart + column tile.callback(tile, Object) column += 1 rowStart += self.widthInTiles row += 1 return results