Refactor code into separate modules.

This commit is contained in:
Dorian 2016-11-15 12:10:47 -05:00
parent f4494af342
commit 89e74bb7a6
5 changed files with 61 additions and 58 deletions

0
doric/__init__.py Normal file
View File

39
doric/map.py Normal file
View File

@ -0,0 +1,39 @@
from math import ceil
class Coordinates(object):
def __init__(self, row, col):
self.row = row
self.col = col
# set the cube coordinates of the hexagon as [x, y, z]
self.cube_coords = self.even_r_to_cube(self.row, self.col)
@staticmethod
def even_r_to_cube(row, col):
"""compute cube coordinates from even-r hex coordinates"""
x = int(col - ceil(float(row) / 2))
z = row
y = - x - z
return [x, y, z]
@staticmethod
def cube_to_even_r(x, y, z):
row = int(x + ceil(z / 2))
col = z
return [row, col]
@property
def even_r_coords(self):
"""return even-r coordinates of the hexagon."""
return self.cube_to_even_r(*self.cube_coords)
@even_r_coords.setter
def even_r_coords(self, value):
self.cube_coords = self.even_r_to_cube(*value)
def even_r_coordinate_text(self):
return '{}'.format(self.even_r_coords)
def cube_coordinate_text(self):
return '{!r}'.format(self.cube_coords)

View File

@ -1,26 +1,19 @@
import collections import kivy.utils
from math import ceil from kivy.graphics import Color, Line, Ellipse
from kivy.logger import Logger from kivy.logger import Logger
from kivy.uix.label import Label from kivy.uix.label import Label
from kivy.graphics import Color, Line, Ellipse
import kivy.utils
from kivy.vector import Vector from kivy.vector import Vector
from terrain import choose_random_terrain, Terrains from doric.map import Coordinates
from doric.terrain import choose_random_terrain, Terrains
MapCoords = collections.namedtuple('MapCoords', ['row', 'col'])
class Tile(Label): class MapTile(Label):
def __init__(self, row=0, col=0, **kwargs): def __init__(self, row=0, col=0, **kwargs):
super(Tile, self).__init__(**kwargs) super(MapTile, self).__init__(**kwargs)
self.coords = MapCoords(row, col) self.coords = Coordinates(row, col)
# set the cube coordinates of the hexagon
# as [x, y, z]
self.cube_coords = self.even_r_to_cube(self.coords.row, self.coords.col)
self.selected = False
self.selected = False
# Pick a random terrain for each hex. # Pick a random terrain for each hex.
self.terrain = choose_random_terrain() self.terrain = choose_random_terrain()
self.terrain_colour = kivy.utils.get_color_from_hex(Terrains[self.terrain]['color']) self.terrain_colour = kivy.utils.get_color_from_hex(Terrains[self.terrain]['color'])
@ -39,41 +32,13 @@ class Tile(Label):
Color(0, 0, 0, 1) Color(0, 0, 0, 1)
self.coord_label = Label( self.coord_label = Label(
text=self.even_r_coordinate_text(), text=self.coords.even_r_coordinate_text(),
center_x=self.center_x, center_x=self.center_x,
center_y=self.center_y) center_y=self.center_y)
@staticmethod
def even_r_to_cube(row, col):
"""compute cube coordinates from even-r hex coordinates"""
x = int(col - ceil(float(row)/2))
z = row
y = - x - z
return [x, y, z]
@staticmethod
def cube_to_even_r(x, y, z):
row = int(x + ceil(z / 2))
col = z
return [row, col]
@property
def even_r_coords(self):
"""return even-r coordinates of the hexagon."""
return self.cube_to_even_r(*self.cube_coords)
@even_r_coords.setter
def even_r_coords(self, value):
self.cube_coords = self.even_r_to_cube(*value)
def even_r_coordinate_text(self):
return '{}'.format(self.even_r_coords)
def cube_coordinate_text(self):
return '{!r}'.format(self.cube_coords)
def map_display_text(self): def map_display_text(self):
return "{}\n{} \n {}".format(self.even_r_coordinate_text(), self.cube_coordinate_text(), self.terrain) return "{}\n{} \n {}".format(
self.coords.even_r_coordinate_text(), self.coords.cube_coordinate_text(), self.terrain)
def update_pos(self, instance, value): def update_pos(self, instance, value):
@ -92,10 +57,10 @@ class Tile(Label):
self.coord_label.center_y = self.center_y self.coord_label.center_y = self.center_y
def on_touch_down(self, touch): def on_touch_down(self, touch):
if super(Tile, self).on_touch_down(touch): if super(MapTile, self).on_touch_down(touch):
return False return False
coord_x, coord_y = self.even_r_coords coord_x, coord_y = self.coords.even_r_coords
with self.canvas.after: with self.canvas.after:
Color(*kivy.utils.get_color_from_hex('#000000')) Color(*kivy.utils.get_color_from_hex('#000000'))
@ -127,3 +92,8 @@ class Tile(Label):
Logger.debug('({}, {}) -> ({}, {})'.format(self.x, self.y, coord_x, coord_y)) Logger.debug('({}, {}) -> ({}, {})'.format(self.x, self.y, coord_x, coord_y))
Logger.debug('Dist: {} Diff: {}'.format(dist, dist - radius)) Logger.debug('Dist: {} Diff: {}'.format(dist, dist - radius))
return dist - radius <= 0 return dist - radius <= 0
class SpacerTile(Label):
def __init__(self):
super(SpacerTile, self).__init__(size_hint=(0.5, 1), text=':)')

14
main.py
View File

@ -1,14 +1,8 @@
from kivy import app, properties from kivy import app, properties
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Color, Rectangle from kivy.graphics import Color, Rectangle
from hexmap import Tile from doric.tiles import MapTile, SpacerTile
class HexSpace(Label):
def __init__(self):
super(HexSpace, self).__init__(size_hint=(0.5, 1), text=':)')
class StrategyGame(BoxLayout): class StrategyGame(BoxLayout):
@ -25,14 +19,14 @@ class StrategyGame(BoxLayout):
hex_map_row = BoxLayout(orientation='horizontal') hex_map_row = BoxLayout(orientation='horizontal')
if row % 2 == 1: if row % 2 == 1:
hex_map_row.add_widget(HexSpace()) hex_map_row.add_widget(SpacerTile())
for col in range(0, self.map_cols): for col in range(0, self.map_cols):
map_tile = Tile(row=row, col=col) map_tile = MapTile(row=row, col=col)
hex_map_row.add_widget(map_tile) hex_map_row.add_widget(map_tile)
if row % 2 == 0: if row % 2 == 0:
hex_map_row.add_widget(HexSpace()) hex_map_row.add_widget(SpacerTile())
self.main_map.add_widget(hex_map_row) self.main_map.add_widget(hex_map_row)