from kivy.app import App from kivy.graphics import * from kivy.properties import ObjectProperty from kivy.uix.widget import Widget from kivy.utils import get_color_from_hex HEX_SIZE = 100 HORIZONTAL_BUFFER = 0.9 VERTICAL_BUFFER = 0.8 class HexMap(Widget): # TODO: Incorporate design into main application. coords_display = ObjectProperty(None) def __init__(self, **kwargs): super(HexMap, self).__init__(**kwargs) self.redraw_scene() # It is crucial to redraw the scene whenever the scene or position changes. self.bind(size=self.redraw_scene, pos=self.redraw_scene) self.updates = 0 self.on_touch_down = self.update_coords def redraw_scene(self, *args): with self.canvas: # Clear scene Color(*get_color_from_hex("#000000ff")) Rectangle( pos=(0, 0), size=(self.width, self.height) ) # Draw a hexagon in a decent spot. tiles_in_even_row = int(self.width / (HEX_SIZE * HORIZONTAL_BUFFER)) tiles_in_odd_row = int((self.width - HEX_SIZE / 2) / (HEX_SIZE * HORIZONTAL_BUFFER)) tiles_in_col = int(self.height / (HEX_SIZE * VERTICAL_BUFFER)) for y in range(tiles_in_col): even_row = y % 2 == 0 hex_color = "#0000dd55" if even_row else "#dd000055" tiles_in_row = tiles_in_even_row if even_row else tiles_in_odd_row y_position = y * HEX_SIZE * VERTICAL_BUFFER for x in range(tiles_in_row): Color(*get_color_from_hex(hex_color)) x_position = x * HEX_SIZE * HORIZONTAL_BUFFER if not even_row: x_position += 0.5 * HEX_SIZE * HORIZONTAL_BUFFER Ellipse( pos=(x_position, y_position), segments=6, size=(HEX_SIZE, HEX_SIZE), ) def update_coords(self, touch_event): self.coords_display.text = "Touched at {}".format(touch_event.spos) # TODO: Add in finding of hexes by what position found at touch event. # TODO: May need a buffer around "untouchable" regions" return True class HexMapApp(App): pass if __name__ == '__main__': HexMapApp().run()