import Tkinter from Tkinter import * def copy_char(char, n): charRet = "" for x in range(n): charRet += char return charRet class TerrainTileSet: def __init__(self, tileMap): self._tileMap = tileMap self.Y_WAY = len(tileMap) self.X_WAY = len(tileMap[0]) self.WATER_TILE = 0 self.LAND_TILE = 1 self.TILE_TABLE = { self.WATER_TILE:'blue',\ self.LAND_TILE:'#02E522'} def getTile(self,x,y): return self.TILE_TABLE[self._tileMap[x][y]] def getTileSetSize(self): return (self.X_WAY, self.Y_WAY) class WorldMapFrame(Frame): def __init__(self, master, terrainTileSet): Frame.__init__(self,master,relief=SUNKEN,bd=2) self.RECT_SIZE = 30 self.Y_OFFSET = 30 self.X_OFFSET = 20 self.SPACING_BUFFER = 60 self.DEFAULT_BG = "#f3f3f3" self.landTileSet = terrainTileSet self.y_axis = terrainTileSet.getTileSetSize()[0] self.x_axis = terrainTileSet.getTileSetSize()[1] frame = Frame(master) frame.config(bg=self.DEFAULT_BG) frame.pack() self.menuBar = Menu(self) menu = Menu(self.menuBar,tearoff=0) self.menuBar.add_cascade(label="File",menu=menu) menu.add_command(label="New") self.master.config(menu=self.menuBar) self.canvas = Canvas(frame,height=self.x_axis*30+self.SPACING_BUFFER,width=self.y_axis*30+self.SPACING_BUFFER,bd=0,highlightthickness=0) self.canvas.config(bg=self.DEFAULT_BG) self.canvas.bind("",self.__mapLeftClickHandler) self.info_canvas = Canvas(frame, height=50,width=self.y_axis*30,bd=0) self.info_canvas.config(bg=self.DEFAULT_BG) self.info_canvas.create_rectangle(0,0,50,50,fill="black") self.canvas.pack() self.info_canvas.pack() #self.canvas.create_line(0, 0, 200, 100) self.canvas.pack(side=TOP) self.info_canvas.pack(side=TOP) self._drawMap() def _drawTile(self,tileX,tileY,x_cursor,y_cursor): self.canvas.create_rectangle(x_cursor,y_cursor,x_cursor+self.RECT_SIZE, y_cursor+self.RECT_SIZE,\ fill=self.landTileSet.getTile(tileX,tileY),dash=2) def _drawMap(self): x_cursor = self.X_OFFSET y_cursor = self.Y_OFFSET for y in range(self.y_axis): for x in range(self.x_axis): #self.canvas.create_rectangle(x_cursor,y_cursor,x_cursor+self.RECT_SIZE, y_cursor+self.RECT_SIZE,fill="green") self._drawTile(x,y,x_cursor,y_cursor) if x == 0: self.canvas.create_text(x_cursor+self.RECT_SIZE/2.0, y_cursor-self.RECT_SIZE/2.0,text=str(y)+"x") elif x == self.x_axis-1: self.canvas.create_text(x_cursor+self.RECT_SIZE/2.0, y_cursor+2.5*self.RECT_SIZE/2.0,text=str(y)+"x") if y == 0: self.canvas.create_text(self.X_OFFSET/2.0,y_cursor + self.RECT_SIZE/2.0,text=str(x)+"y") elif y == self.y_axis-1: self.canvas.create_text(x_cursor + self.RECT_SIZE+self.X_OFFSET/2.0, y_cursor + self.RECT_SIZE/2.0,text=str(x)+"y") y_cursor += self.RECT_SIZE x_cursor += self.RECT_SIZE if y%2 == 0: y_cursor = self.Y_OFFSET + self.RECT_SIZE/2.0 else: y_cursor = self.Y_OFFSET def __mapLeftClickHandler(self, event): activeTile = self._resolveXYCoordToTile(event.x,event.y) if activeTile is not None: self._updateInformationCanvas(activeTile[1],activeTile[0]) def _updateInformationCanvas(self,x,y): self.info_canvas.create_rectangle(0,0,self.y_axis*30,50,fill=self.DEFAULT_BG,outline=self.DEFAULT_BG) self.info_canvas.create_rectangle(0,0,50,50,fill=self.landTileSet.getTile(x,y),outline=self.DEFAULT_BG) self.curText = self.info_canvas.create_text(65,25,text=str(y)+","+str(x)) def _resolveXYCoordToTile(self,x_coord,y_coord): translatedX = (x_coord - self.X_OFFSET)/self.RECT_SIZE translatedY = 0 if translatedX%2 == 0: translatedY = (y_coord - self.Y_OFFSET)/self.RECT_SIZE else: translatedY = int((y_coord - self.Y_OFFSET-self.RECT_SIZE/2.0)/self.RECT_SIZE) if translatedX not in range(self.y_axis) or translatedY not in range(self.x_axis): return None else: return translatedX,translatedY if __name__ == "__main__": import leader reload(leader) from leader import WorldMapFrame root = Tk() tts = TerrainTileSet( [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\ [0,0,0,1,1,1,1,0,0,0,1,1,1,0,0],\ [0,0,1,1,1,1,1,0,0,1,1,1,1,0,0],\ [0,0,0,1,1,1,1,1,0,1,1,1,1,1,0],\ [0,0,0,1,1,1,1,1,0,0,0,1,1,0,0],\ [0,0,1,1,0,1,1,1,1,0,1,1,0,0,0],\ [0,1,1,0,0,0,1,1,0,0,1,0,0,0,0],\ [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]) map = WorldMapFrame(root,tts) root.mainloop()