Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/python-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,4 @@ jobs:
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test
run: |
python -m unittest tests/pyscroll/test_pyscroll.py
python -m unittest discover -s tests/pyscroll -p "test_*.py"
28 changes: 21 additions & 7 deletions pyscroll/isometric.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,33 @@
import logging

from pyscroll.common import Vector2D, Vector2DInt
from pyscroll.orthographic import BufferedRenderer

log = logging.getLogger(__file__)


def vector3_to_iso(vector3):
offset = 0, 0
def vector3_to_iso(
vector3: tuple[int, int, int], offset: tuple[int, int] = (0, 0)
) -> tuple[int, int]:
"""
Convert 3D cartesian coordinates to isometric coordinates.
"""
if len(vector3) != 3:
raise ValueError("Input tuple must have exactly 3 elements")
return (
(vector3[0] - vector3[1]) + offset[0],
((vector3[0] + vector3[1]) >> 1) - vector3[2] + offset[1],
)


def vector2_to_iso(vector2):
offset = 0, 0
def vector2_to_iso(
vector2: tuple[int, int], offset: tuple[int, int] = (0, 0)
) -> tuple[int, int]:
"""
Convert 2D cartesian coordinates to isometric coordinates.
"""
if len(vector2) != 2:
raise ValueError("Input tuple must have exactly 2 elements")
return (
(vector2[0] - vector2[1]) + offset[0],
((vector2[0] + vector2[1]) >> 1) + offset[1],
Expand All @@ -34,7 +47,7 @@ def _draw_surfaces(self, surface, rect, surfaces) -> None:
if surfaces is not None:
[(surface.blit(i[0], i[1]), i[2]) for i in surfaces]

def _initialize_buffers(self, view_size) -> None:
def _initialize_buffers(self, view_size: Vector2DInt) -> None:
"""Create the buffers to cache tile drawing

:param view_size: (int, int): size of the draw area
Expand Down Expand Up @@ -85,7 +98,7 @@ def _flush_tile_queue(self) -> None:
iso_y = (x + y) * thh
surface_blit(tile, (iso_x, iso_y))

def center(self, coords) -> None:
def center(self, coords: Vector2D) -> None:
"""center the map on a "map pixel" """
x, y = [round(i, 0) for i in coords]
self.view_rect.center = x, y
Expand All @@ -102,6 +115,7 @@ def center(self, coords) -> None:
self._y_offset = iso[1]

print(self._tile_view.size)
assert self._buffer
print(self._buffer.get_size())

# center the buffer on the screen
Expand Down Expand Up @@ -134,7 +148,7 @@ def center(self, coords) -> None:
# self._buffer.fill(self._clear_color)
#
# v = self._tile_view
# self._tile_queue = list()
# self._tile_queue = []
# for x in range(v.left, v.right):
# for y in range(v.top, v.bottom):
# ix, iy = vector2_to_iso((x, y))
Expand Down
39 changes: 39 additions & 0 deletions tests/pyscroll/test_isometric.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import unittest
from pyscroll.isometric import vector2_to_iso, vector3_to_iso

class IsometricFunctionsTest(unittest.TestCase):
def test_vector3_to_iso(self):
self.assertEqual(vector3_to_iso((1, 1, 0)), (0, 1))
self.assertEqual(vector3_to_iso((2, 1, 0)), (1, 1))
self.assertEqual(vector3_to_iso((1, 2, 0)), (-1, 1))
self.assertEqual(vector3_to_iso((1, 1, 1)), (0, 0))
self.assertEqual(vector3_to_iso((-1, -1, 0)), (0, -1))
self.assertEqual(vector3_to_iso((-2, -1, 0)), (-1, -2))
self.assertEqual(vector3_to_iso((-1, -2, 0)), (1, -2))
self.assertEqual(vector3_to_iso((-1, -1, -1)), (0, 0))
self.assertEqual(vector3_to_iso((0, 0, 0)), (0, 0))
self.assertEqual(vector3_to_iso((100, 100, 0)), (0, 100))
self.assertEqual(vector3_to_iso((200, 100, 0)), (100, 150))
self.assertEqual(vector3_to_iso((100, 200, 0)), (-100, 150))
self.assertEqual(vector3_to_iso((100, 100, 100)), (0, 0))

def test_vector2_to_iso(self):
self.assertEqual(vector2_to_iso((1, 1)), (0, 1))
self.assertEqual(vector2_to_iso((2, 1)), (1, 1))
self.assertEqual(vector2_to_iso((1, 2)), (-1, 1))
self.assertEqual(vector2_to_iso((0, 0)), (0, 0))
self.assertEqual(vector2_to_iso((-1, -1)), (0, -1))
self.assertEqual(vector2_to_iso((-2, -1)), (-1, -2))
self.assertEqual(vector2_to_iso((-1, -2)), (1, -2))
self.assertEqual(vector2_to_iso((0, 0)), (0, 0))
self.assertEqual(vector2_to_iso((100, 100)), (0, 100))
self.assertEqual(vector2_to_iso((200, 100)), (100, 150))
self.assertEqual(vector2_to_iso((100, 200)), (-100, 150))

def test_vector3_to_iso_invalid_inputs(self):
with self.assertRaises(ValueError):
vector3_to_iso((1, 2))

def test_vector2_to_iso_invalid_inputs(self):
with self.assertRaises(ValueError):
vector2_to_iso((1, 2, 3))