def test(): game = gamebase.GameBase((400,400),30) game.start_scale(2) count = 0 tile_img = utils.load_image("iso_cursor_01.png") tiles = pygame.sprite.Group() ig = IsoGrid((10,5),(100,0)) r = pygame.Rect((0,0),(18,10)) for x in range(10): for y in range(10): s = pygame.sprite.Sprite(tiles) s.image = tile_img s.rect = tile_img.get_rect() s.rect.bottomleft = ig.get_bl((x,y)) while True: game.clock.tick(30) events = game.get_events() iso_pos = ig.get_iso(game.get_mousepos()) tiles.draw(game.screen) r.bottomright = ig.get_br(iso_pos) pygame.draw.rect(game.screen,(0,0,0),r,1) game.flip() game.screen.fill((120,120,120)) pygame.display.set_caption(str(iso_pos) + str(game.get_mousepos())) count += 1
def __init__(self, pos): self.top_index = pos[0] - self.anchor[0], pos[1] - self.anchor[1] indexes = make_indexes(self.top_index, self.size) pygame.sprite.Sprite.__init__(self, self.groups) self.xlen, self.ylen = self.size self.make_geometry() self.sprites = [] x,y = ga.stationGrid.get_tl(self.top_index) self.ig = IsoGrid((TX,TY), (ga.stationGrid.get_mt(self.top_index))) self.mark_tiles(indexes) self.make_sidetiles() BuildingPiece(self.imageset[0], self.ig.get_bl((self.xlen-1, self.ylen-1)),self) for n in range(self.xlen-1): l, b = self.ig.get_bl((n, self.ylen-1)) BuildingPiece(self.imageset[n+1], (l,b),self) for n in range(self.ylen-1): l, b = self.ig.get_mb((self.xlen-1,n)) BuildingPiece(self.imageset[n+self.xlen], (l-1, b),self)
class Building(pygame.sprite.Sprite): anchor = 0,0 # standard anchor point is top tile check_free = (standard_check_free,) def __init__(self, pos): self.top_index = pos[0] - self.anchor[0], pos[1] - self.anchor[1] indexes = make_indexes(self.top_index, self.size) pygame.sprite.Sprite.__init__(self, self.groups) self.xlen, self.ylen = self.size self.make_geometry() self.sprites = [] x,y = ga.stationGrid.get_tl(self.top_index) self.ig = IsoGrid((TX,TY), (ga.stationGrid.get_mt(self.top_index))) self.mark_tiles(indexes) self.make_sidetiles() BuildingPiece(self.imageset[0], self.ig.get_bl((self.xlen-1, self.ylen-1)),self) for n in range(self.xlen-1): l, b = self.ig.get_bl((n, self.ylen-1)) BuildingPiece(self.imageset[n+1], (l,b),self) for n in range(self.ylen-1): l, b = self.ig.get_mb((self.xlen-1,n)) BuildingPiece(self.imageset[n+self.xlen], (l-1, b),self) def mark_tiles(self,indexes): for x,y in indexes: ga.station.free_tiles[x][y] = False ga.station.buildings[x][y] = self def get_piecepos(self, x,y): xpos = self.rect.left + self.topx + x * TX - y * TX ypos = self.rect.top + x * TY + y * TY return xpos, ypos + TH def make_geometry(self): w = (self.xlen + self.ylen) * TX h = (self.xlen + self.ylen) * TY left, top = ga.stationGrid.get_tl(self.top_index) self.topx = (self.ylen-1)*TX left = left - self.topx self.rect = pygame.Rect((left,top),(w,h)) def make_sidetiles(self): self.sidetiles = [] xi, yi = self.top_index self.sidetiles.extend((xi +x, yi -1) for x in range(self.xlen)) self.sidetiles.extend((xi + self.xlen, yi + y) for y in range(self.ylen)) self.sidetiles.extend((xi +x, yi + self.ylen) for x in range(self.xlen)) self.sidetiles.extend((xi -1, yi + y) for y in range(self.ylen)) def destroy(self): for s in self.sprites: s.kill() for x,y in make_indexes(self.top_index, self.size): ga.station.free_tiles[x][y] = True ga.station.buildings[x][y] = None self.kill() def get_roadentry(self): for i in self.sidetiles: b = ga.station.buildings[i[0]][i[1]] if isinstance(b, Road): return i
globals()[name] = i globals()[name+"set"] = set globals()[name+"hint"] = hint globals()[name+"badhint"] = badhint if cls: cls.image = i cls.imageset = set cls.hint = hint cls.badhint = badhint def cut_img(image, (x,y)): # cuts an image into pieces fit for isometric rendering rect = image.get_rect() xoffset = y*TX -1 yoffset = rect.height - x*TY - y*TY isoG = IsoGrid((TX,TY),(xoffset,yoffset)) r = pygame.Rect((0,0),(TW,rect.height)) r.bottomleft = isoG.get_left((x-1,y-1)),rect.height midpiece = cut(image,r) xpieces = [] for n in range(x-1): l,b = isoG.get_bl((n,y-1)) r.height = b r.width = TX r.bottomleft = l,b xpieces.append(cut(image,r)) ypieces = [] for n in range(y-1): l,b = isoG.get_mb((x-1,n))