From 890193b31f0451b6557d31f56715338e3cbd2547 Mon Sep 17 00:00:00 2001 From: Benjamin Kirkbride Date: Tue, 20 May 2025 12:13:50 -0400 Subject: [PATCH 1/7] ignore uv --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8d2b38dd2..8248d7cfe 100644 --- a/.gitignore +++ b/.gitignore @@ -61,4 +61,5 @@ temp/ # pending: Sphinx 8.1.4 + deps are verified as working with Arcade # see util/sphinx_static_file_temp_fix.py -.ENABLE_DEVMACHINE_SPHINX_STATIC_FIX \ No newline at end of file +.ENABLE_DEVMACHINE_SPHINX_STATIC_FIX +uv.lock From a0833e273e5ec074edb2de170a6047dbda6f8fcd Mon Sep 17 00:00:00 2001 From: Benjamin Kirkbride Date: Tue, 20 May 2025 13:10:59 -0400 Subject: [PATCH 2/7] add hexagon and tests --- arcade/hexagon.py | 343 +++++++++++++++++++++++++++++++++++++ tests/unit/test_hexagon.py | 167 ++++++++++++++++++ 2 files changed, 510 insertions(+) create mode 100644 arcade/hexagon.py create mode 100644 tests/unit/test_hexagon.py diff --git a/arcade/hexagon.py b/arcade/hexagon.py new file mode 100644 index 000000000..edf32b5b8 --- /dev/null +++ b/arcade/hexagon.py @@ -0,0 +1,343 @@ +"""Hexagon utilities. + +This module started as the Python implementation of the hexagon utilities +from Red Blob Games. + +See: https://www.redblobgames.com/grids/hexagons/ + +CC0 -- No Rights Reserved +""" + +import math +from dataclasses import dataclass +from math import isclose +from typing import Literal, NamedTuple, cast + +from pyglet.math import Vec2 + +_EVEN: Literal[1] = 1 +_ODD: Literal[-1] = -1 + +offset_system = Literal["odd-r", "even-r", "odd-q", "even-q"] + + +class _Orientation(NamedTuple): + """Helper class to store forward and inverse matrix for hexagon conversion. + + Also stores the start angle for hexagon corners. + """ + + f0: float + f1: float + f2: float + f3: float + b0: float + b1: float + b2: float + b3: float + start_angle: float + + +pointy_orientation = _Orientation( + math.sqrt(3.0), + math.sqrt(3.0) / 2.0, + 0.0, + 3.0 / 2.0, + math.sqrt(3.0) / 3.0, + -1.0 / 3.0, + 0.0, + 2.0 / 3.0, + 0.5, +) +flat_orientation = _Orientation( + 3.0 / 2.0, + 0.0, + math.sqrt(3.0) / 2.0, + math.sqrt(3.0), + 2.0 / 3.0, + 0.0, + -1.0 / 3.0, + math.sqrt(3.0) / 3.0, + 0.0, +) + + +class Layout(NamedTuple): + """Helper class to store hexagon layout information.""" + + orientation: _Orientation + size: Vec2 + origin: Vec2 + + +# TODO: should this be a np.array? +# TODO: should this be in rust? +# TODO: should this be cached/memoized? +# TODO: benchmark +@dataclass(frozen=True) +class Hex: + """A hexagon in cube coordinates.""" + + q: float + r: float + s: float + + def __post_init__(self) -> None: + """Create a hexagon in cube coordinates.""" + cube_sum = self.q + self.r + self.s + assert isclose(0, cube_sum, abs_tol=1e-14), f"q + r + s must be 0, is {cube_sum}" + + def __eq__(self, other: object) -> bool: + """Check if two hexagons are equal.""" + result = self.q == other.q and self.r == other.r and self.s == other.s # type: ignore[attr-defined] + assert isinstance(result, bool) + return result + + def __add__(self, other: "Hex") -> "Hex": + """Add two hexagons.""" + return Hex(self.q + other.q, self.r + other.r, self.s + other.s) + + def __sub__(self, other: "Hex") -> "Hex": + """Subtract two hexagons.""" + return Hex(self.q - other.q, self.r - other.r, self.s - other.s) + + def __mul__(self, k: int) -> "Hex": + """Multiply a hexagon by a scalar.""" + return Hex(self.q * k, self.r * k, self.s * k) + + def __neg__(self) -> "Hex": + """Negate a hexagon.""" + return Hex(-self.q, -self.r, -self.s) + + def __round__(self) -> "Hex": + """Round a hexagon.""" + qi = round(self.q) + ri = round(self.r) + si = round(self.s) + q_diff = abs(qi - self.q) + r_diff = abs(ri - self.r) + s_diff = abs(si - self.s) + if q_diff > r_diff and q_diff > s_diff: + qi = -ri - si + elif r_diff > s_diff: + ri = -qi - si + else: + si = -qi - ri + return Hex(qi, ri, si) + + def rotate_left(self) -> "Hex": + """Rotate a hexagon to the left.""" + return Hex(-self.s, -self.q, -self.r) + + def rotate_right(self) -> "Hex": + """Rotate a hexagon to the right.""" + return Hex(-self.r, -self.s, -self.q) + + @staticmethod + def direction(direction: int) -> "Hex": + """Return a relative hexagon in a given direction.""" + hex_directions = [ + Hex(1, 0, -1), + Hex(1, -1, 0), + Hex(0, -1, 1), + Hex(-1, 0, 1), + Hex(-1, 1, 0), + Hex(0, 1, -1), + ] + return hex_directions[direction] + + def neighbor(self, direction: int) -> "Hex": + """Return the neighbor in a given direction.""" + return self + self.direction(direction) + + def neighbors(self) -> list["Hex"]: + """Return the neighbors of a hexagon.""" + return [self.neighbor(i) for i in range(6)] + + def diagonal_neighbor(self, direction: int) -> "Hex": + """Return the diagonal neighbor in a given direction.""" + hex_diagonals = [ + Hex(2, -1, -1), + Hex(1, -2, 1), + Hex(-1, -1, 2), + Hex(-2, 1, 1), + Hex(-1, 2, -1), + Hex(1, 1, -2), + ] + return self + hex_diagonals[direction] + + def length(self) -> int: + """Return the length of a hexagon.""" + return int((abs(self.q) + abs(self.r) + abs(self.s)) // 2) + + def distance_to(self, other: "Hex") -> float: + """Return the distance between self and another Hex.""" + return (self - other).length() + + def line_to(self, other: "Hex") -> list["Hex"]: + """Return a list of hexagons between self and another Hex.""" + return line(self, other) + + def lerp_between(self, other: "Hex", t: float) -> "Hex": + """Perform a linear interpolation between self and another Hex.""" + return lerp(self, other, t) + + def to_pixel(self, layout: Layout) -> Vec2: + """Convert a hexagon to pixel coordinates.""" + return hex_to_pixel(self, layout) + + def to_offset(self, system: offset_system) -> "OffsetCoord": + """Convert a hexagon to offset coordinates.""" + if system == "odd-r": + return roffset_from_cube(self, _ODD) + if system == "even-r": + return roffset_from_cube(self, _EVEN) + if system == "odd-q": + return qoffset_from_cube(self, _ODD) + if system == "even-q": + return qoffset_from_cube(self, _EVEN) + + msg = "system must be odd-r, even-r, odd-q, or even-q" + raise ValueError(msg) + + +def lerp(a: Hex, b: Hex, t: float) -> Hex: + """Perform a linear interpolation between two hexagons.""" + return Hex( + a.q * (1.0 - t) + b.q * t, + a.r * (1.0 - t) + b.r * t, + a.s * (1.0 - t) + b.s * t, + ) + + +def distance(a: Hex, b: Hex) -> int: + """Return the distance between two hexagons.""" + return (a - b).length() + + +def line(a: Hex, b: Hex) -> list[Hex]: + """Return a list of hexagons between two hexagons.""" + n = distance(a, b) + # epsilon to nudge points by to falling on an edge + a_nudge = Hex(a.q + 1e-06, a.r + 1e-06, a.s - 2e-06) + b_nudge = Hex(b.q + 1e-06, b.r + 1e-06, b.s - 2e-06) + step = 1.0 / max(n, 1) + return [round(lerp(a_nudge, b_nudge, step * i)) for i in range(n + 1)] + + +def hex_to_pixel(h: Hex, layout: Layout) -> Vec2: + """Convert axial hexagon coordinates to pixel coordinates.""" + M = layout.orientation # noqa: N806 + size = layout.size + origin = layout.origin + x = (M.f0 * h.q + M.f1 * h.r) * size.x + y = (M.f2 * h.q + M.f3 * h.r) * size.y + return Vec2(x + origin.x, y + origin.y) + + +def pixel_to_hex( + p: Vec2, + layout: Layout, +) -> Hex: + """Convert pixel coordinates to cubic hexagon coordinates.""" + M = layout.orientation # noqa: N806 + size = layout.size + origin = layout.origin + pt = Vec2((p.x - origin.x) / size.x, (p.y - origin.y) / size.y) + q = M.b0 * pt.x + M.b1 * pt.y + r = M.b2 * pt.x + M.b3 * pt.y + return Hex(q, r, -q - r) + + +def hex_corner_offset(corner: int, layout: Layout) -> Vec2: + """Return the offset of a hexagon corner.""" + # Hexagons have 6 corners + assert 0 <= corner < 6 # noqa: PLR2004 + M = layout.orientation # noqa: N806 + size = layout.size + angle = 2.0 * math.pi * (M.start_angle - corner) / 6.0 + return Vec2(size.x * math.cos(angle), size.y * math.sin(angle)) + + +hex_corners = tuple[Vec2, Vec2, Vec2, Vec2, Vec2, Vec2] + + +def polygon_corners(h: Hex, layout: Layout) -> hex_corners: + """Return the corners of a hexagon in a list of pixels.""" + corners = [] + center = hex_to_pixel(h, layout) + for i in range(6): + offset = hex_corner_offset(i, layout) + corners.append(Vec2(center.x + offset.x, center.y + offset.y)) + result = tuple(corners) + # Hexagons have 6 corners + assert len(result) == 6 # noqa: PLR2004 + return cast("hex_corners", result) + + +@dataclass(frozen=True) +class OffsetCoord: + """Offset coordinates.""" + + col: float + row: float + + def to_cube(self, system: offset_system) -> Hex: + """Convert offset coordinates to cube coordinates.""" + if system == "odd-r": + return roffset_to_cube(self, _ODD) + if system == "even-r": + return roffset_to_cube(self, _EVEN) + if system == "odd-q": + return qoffset_to_cube(self, _ODD) + if system == "even-q": + return qoffset_to_cube(self, _EVEN) + + msg = "system must be EVEN (+1) or ODD (-1)" + raise ValueError(msg) + + +def qoffset_from_cube(h: Hex, offset: Literal[-1, 1]) -> OffsetCoord: + """Convert a hexagon in cube coordinates to q offset coordinates.""" + if offset not in (_EVEN, _ODD): + msg = "offset must be EVEN (+1) or ODD (-1)" + raise ValueError(msg) + + col = h.q + row = h.r + (h.q + offset * (h.q & 1)) // 2 # type: ignore[operator] + return OffsetCoord(col, row) + + +def qoffset_to_cube(h: OffsetCoord, offset: Literal[-1, 1]) -> Hex: + """Convert a hexagon in q offset coordinates to cube coordinates.""" + if offset not in (_EVEN, _ODD): + msg = "offset must be EVEN (+1) or ODD (-1)" + raise ValueError(msg) + + q = h.col + r = h.row - (h.col + offset * (h.col & 1)) // 2 # type: ignore[operator] + s = -q - r + return Hex(q, r, s) + + +def roffset_from_cube(h: Hex, offset: Literal[-1, 1]) -> OffsetCoord: + """Convert a hexagon in cube coordinates to r offset coordinates.""" + if offset not in (_EVEN, _ODD): + msg = "offset must be EVEN (+1) or ODD (-1)" + raise ValueError(msg) + + col = h.q + (h.r + offset * (h.r & 1)) // 2 # type: ignore[operator] + row = h.r + return OffsetCoord(col, row) + + +def roffset_to_cube(h: OffsetCoord, offset: Literal[-1, 1]) -> Hex: + """Convert a hexagon in r offset coordinates to cube coordinates.""" + if offset not in (_EVEN, _ODD): + msg = "offset must be EVEN (+1) or ODD (-1)" + raise ValueError(msg) + + q = h.col - (h.row + offset * (h.row & 1)) // 2 # type: ignore[operator] + r = h.row + s = -q - r + return Hex(q, r, s) diff --git a/tests/unit/test_hexagon.py b/tests/unit/test_hexagon.py new file mode 100644 index 000000000..fa8029abf --- /dev/null +++ b/tests/unit/test_hexagon.py @@ -0,0 +1,167 @@ +from arcade.hexagon import ( + Hex, + Layout, + OffsetCoord, + flat_orientation, + hex_to_pixel, + line, + pixel_to_hex, + pointy_orientation, +) +from pyglet.math import Vec2 + +# TODO: grab the rest of the tests from my main machine + + +def equal_offset_coord(name, a, b): + assert a.col == b.col and a.row == b.row + + +def equal_doubled_coord(name, a, b): + assert a.col == b.col and a.row == b.row + + +def test_hex_equality(): + assert Hex(3, 4, -7) == Hex(3, 4, -7) + assert Hex(3, 4, -7) != Hex(3, 3, -6) + assert Hex(3, 4, -7) != Hex(0, 0, 0) + assert Hex(3, 4, -7) != Hex(4, -7, 3) + + +def test_hex_pixel_roundtrip(): + flat = Layout(flat_orientation, Vec2(10.0, 15.0), Vec2(35.0, 71.0)) + pointy = Layout(pointy_orientation, Vec2(10.0, 15.0), Vec2(35.0, 71.0)) + + h = Hex(3, 4, -7) + assert h == round(pixel_to_hex(hex_to_pixel(h, flat), flat)) + assert h == round(pixel_to_hex(hex_to_pixel(h, pointy), pointy)) + + +def test_list_of_hexes(): + assert [ + Hex(0, 0, 0), + Hex(0, -1, 1), + Hex(0, -2, 2), + ] == [ + Hex(0, 0, 0), + Hex(0, -1, 1), + Hex(0, -2, 2), + ] + + assert [Hex(0, 0, 0), Hex(0, -1, 1)] != [Hex(0, 0, 0)] + + assert [Hex(0, 0, 0), Hex(0, -1, 1)] != [Hex(0, -1, 1)] + + assert [Hex(0, 0, 0), Hex(0, -1, 1)] != [Hex(0, -1, 1), Hex(0, 0, 0)] + + assert Hex(0, 0, 0) in [Hex(0, 0, 0), Hex(0, -1, 1)] + + assert Hex(0, 0, 0) not in [Hex(0, -1, 1), Hex(0, -2, 2)] + + +def test_hex_arithmetic(): + assert Hex(4, -10, 6) == Hex(1, -3, 2) + Hex(3, -7, 4) + assert Hex(-2, 4, -2) == Hex(1, -3, 2) - Hex(3, -7, 4) + + +def test_hex_direction(): + assert Hex(0, -1, 1) == Hex.direction(2) + + +def test_hex_neighbor(): + assert Hex(1, -3, 2) == Hex(1, -2, 1).neighbor(2) + + +def test_hex_diagonal(): + assert Hex(-1, -1, 2) == Hex(1, -2, 1).diagonal_neighbor(3) + + +def test_hex_distance(): + assert 7 == Hex(3, -7, 4).distance_to(Hex(0, 0, 0)) + + +def test_hex_rotate_right(): + assert Hex(1, -3, 2).rotate_right() == Hex(3, -2, -1) + + +def test_hex_rotate_left(): + assert Hex(1, -3, 2).rotate_left() == Hex(-2, -1, 3) + + +def test_hex_round(): + a = Hex(0.0, 0.0, 0.0) + b = Hex(1.0, -1.0, 0.0) + c = Hex(0.0, -1.0, 1.0) + assert Hex(5, -10, 5) == round(Hex(0.0, 0.0, 0.0).lerp_between(Hex(10.0, -20.0, 10.0), 0.5)) + assert round(a) == round(a.lerp_between(b, 0.499)) + assert round(b) == round(a.lerp_between(b, 0.501)) + + assert round(a) == round( + Hex( + a.q * 0.4 + b.q * 0.3 + c.q * 0.3, + a.r * 0.4 + b.r * 0.3 + c.r * 0.3, + a.s * 0.4 + b.s * 0.3 + c.s * 0.3, + ) + ) + + assert round(c) == round( + Hex( + a.q * 0.3 + b.q * 0.3 + c.q * 0.4, + a.r * 0.3 + b.r * 0.3 + c.r * 0.4, + a.s * 0.3 + b.s * 0.3 + c.s * 0.4, + ) + ) + + +def test_hex_line_draw(): + assert [ + Hex(0, 0, 0), + Hex(0, -1, 1), + Hex(0, -2, 2), + Hex(1, -3, 2), + Hex(1, -4, 3), + Hex(1, -5, 4), + ] == line(Hex(0, 0, 0), Hex(1, -5, 4)) + + +def test_layout(): + h = Hex(3, 4, -7) + flat = Layout(flat_orientation, Vec2(10.0, 15.0), Vec2(35.0, 71.0)) + + assert h == round(pixel_to_hex(hex_to_pixel(h, flat), flat)) + + pointy = Layout(pointy_orientation, Vec2(10.0, 15.0), Vec2(35.0, 71.0)) + assert h == round(pixel_to_hex(hex_to_pixel(h, pointy), pointy)) + + +def test_offset_roundtrip(): + a = Hex(3, 4, -7) + b = OffsetCoord(1, -3) + + assert a == a.to_offset("even-q").to_cube("even-q") + + assert b == b.to_cube("even-q").to_offset("even-q") + + assert a == a.to_offset("odd-q").to_cube("odd-q") + + assert b == b.to_cube("odd-q").to_offset("odd-q") + + assert a == a.to_offset("even-r").to_cube("even-r") + + assert b == b.to_cube("even-r").to_offset("even-r") + + assert a == a.to_offset("odd-r").to_cube("odd-r") + + assert b == b.to_cube("odd-r").to_offset("odd-r") + + +def test_offset_from_cube(): + assert OffsetCoord(1, 3) == Hex(1, 2, -3).to_offset("even-q") + + assert OffsetCoord(1, 2) == Hex(1, 2, -3).to_offset("odd-q") + + +def test_offset_to_cube(): + assert Hex(1, 2, -3) == OffsetCoord(1, 3).to_cube("even-q") + + assert Hex(1, 2, -3) == OffsetCoord(1, 2).to_cube("odd-q") From d74e6f657c9e2d1b7de07a14e452538684e8c571 Mon Sep 17 00:00:00 2001 From: Benjamin Kirkbride Date: Tue, 20 May 2025 13:33:50 -0400 Subject: [PATCH 3/7] fix example --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ffd028c5d..3f3b12bb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -94,7 +94,7 @@ exclude = [ ".pytest_cache", "temp", "bugs", - "arcade/examples/platform_tutorial", + "arcade/examples/*", ] lint.ignore = [ "E731", # E731 do not assign a lambda expression, use a def From c15d4873c72f5c89f0f746d731e99f89bdaf92e2 Mon Sep 17 00:00:00 2001 From: Benjamin Kirkbride Date: Tue, 20 May 2025 16:14:47 -0400 Subject: [PATCH 4/7] add hex support and example --- arcade/examples/hex_map.py | 114 ++++++++++ .../images/spritesheets/hex_tilesheet.png | Bin 0 -> 117019 bytes .../resources/assets/tiled_maps/hex_map.tmj | 89 ++++++++ .../assets/tiled_maps/hex_tilesheet.tsj | 91 ++++++++ arcade/tilemap/tilemap.py | 108 ++++++++-- hex_map.py | 195 ++++++++++++++++++ 6 files changed, 584 insertions(+), 13 deletions(-) create mode 100644 arcade/examples/hex_map.py create mode 100644 arcade/resources/assets/images/spritesheets/hex_tilesheet.png create mode 100644 arcade/resources/assets/tiled_maps/hex_map.tmj create mode 100644 arcade/resources/assets/tiled_maps/hex_tilesheet.tsj create mode 100644 hex_map.py diff --git a/arcade/examples/hex_map.py b/arcade/examples/hex_map.py new file mode 100644 index 000000000..10c5fdc97 --- /dev/null +++ b/arcade/examples/hex_map.py @@ -0,0 +1,114 @@ +""" +Hex Map Example + +If Python and Arcade are installed, this example can be run from the command line with: +python -m arcade.examples.hex_map +""" +import arcade +from arcade import TileMap + +WINDOW_WIDTH = 1280 +WINDOW_HEIGHT = 720 +WINDOW_TITLE = "Hex Map" + + +class GameView(arcade.View): + """ + Main application class. + """ + + def __init__(self): + super().__init__() + + # Variable to hold our Tiled Map + self.tile_map: TileMap + + # Replacing all of our SpriteLists with a Scene variable + self.scene: arcade.Scene + + # A variable to store our camera object + self.camera: arcade.camera.Camera2D + + # A variable to store our gui camera object + self.gui_camera: arcade.camera.Camera2D + + + # If you have sprite lists, you should create them here, + # and set them to None + + def reset(self): + """Reset the game to the initial state.""" + # Do changes needed to restart the game here if you want to support that + pass + + def on_draw(self): + """ + Render the screen. + """ + + # This command should happen before we start drawing. It will clear + # the screen to the background color, and erase what we drew last frame. + self.clear() + + # Call draw() on all your sprite lists below + + def on_update(self, delta_time): + """ + All the logic to move, and the game logic goes here. + Normally, you'll call update() on the sprite lists that + need it. + """ + pass + + def on_key_press(self, key, key_modifiers): + """ + Called whenever a key on the keyboard is pressed. + + For a full list of keys, see: + https://api.arcade.academy/en/latest/arcade.key.html + """ + pass + + def on_key_release(self, key, key_modifiers): + """ + Called whenever the user lets off a previously pressed key. + """ + pass + + def on_mouse_motion(self, x, y, delta_x, delta_y): + """ + Called whenever the mouse moves. + """ + pass + + def on_mouse_press(self, x, y, button, key_modifiers): + """ + Called when the user presses a mouse button. + """ + pass + + def on_mouse_release(self, x, y, button, key_modifiers): + """ + Called when a user releases a mouse button. + """ + pass + + +def main(): + """ Main function """ + # Create a window class. This is what actually shows up on screen + window = arcade.Window(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE) + + # Create and setup the GameView + game = GameView() + + # Show GameView on screen + window.show_view(game) + + # Start the arcade game loop + arcade.run() + + + +if __name__ == "__main__": + main() diff --git a/arcade/resources/assets/images/spritesheets/hex_tilesheet.png b/arcade/resources/assets/images/spritesheets/hex_tilesheet.png new file mode 100644 index 0000000000000000000000000000000000000000..28cf56785cdd5dc746f0e8afebda2b6038c37e61 GIT binary patch literal 117019 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]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%0D0!T~k%58kDZaE+9h6NE4^()Z_fL|pyz0h> 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 EA3H&L+W-In literal 0 HcmV?d00001 diff --git a/arcade/resources/assets/tiled_maps/hex_map.tmj b/arcade/resources/assets/tiled_maps/hex_map.tmj new file mode 100644 index 000000000..8d6d9c91c --- /dev/null +++ b/arcade/resources/assets/tiled_maps/hex_map.tmj @@ -0,0 +1,89 @@ +{ "compressionlevel":-1, + "height":20, + "hexsidelength":70, + "infinite":false, + "layers":[ + { + "data":[38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 37, 37, 37, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 37, 37, 37, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 37, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 37, 37, 37, 38, 38, + 38, 38, 38, 37, 37, 37, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 39, 40, 40, 37, 37, 37, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 39, 39, 40, 40, 37, 37, 37, 38, 38, + 38, 38, 38, 37, 37, 37, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 36, 39, 39, 40, 37, 37, 37, 38, 38, 38, + 38, 38, 38, 37, 37, 37, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 39, 39, 40, 40, 37, 37, 37, 38, 38, + 38, 38, 38, 37, 37, 37, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 39, 39, 40, 40, 40, 37, 37, 37, 38, 38, + 38, 38, 38, 37, 37, 37, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 37, 37, 37, 38, 38, + 38, 38, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 37, 37, 37, 37, 38, 38, + 38, 38, 38, 37, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 37, 37, 37, 37, 38, 38, + 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 37, 37, 37, 37, 37, 38, 38, 38, + 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, + 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38], + "height":20, + "id":1, + "name":"TILE", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 0, 0, 0, 0, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 42, 0, 0, 44, 47, 47, 47, 0, 51, 0, 41, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 0, 0, 0, 44, 0, 0, 68, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 0, 0, 0, 0, 0, 56, 0, 0, 46, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 42, 0, 0, 0, 0, 69, 69, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 69, 69, 69, 69, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":20, + "id":2, + "name":"POI", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }], + "nextlayerid":3, + "nextobjectid":1, + "orientation":"hexagonal", + "renderorder":"right-down", + "staggeraxis":"y", + "staggerindex":"odd", + "tiledversion":"1.11.2", + "tileheight":140, + "tilesets":[ + { + "firstgid":1, + "source":"..\/..\/..\/..\/..\/sim\/assets\/maps\/tilesheet.tsj" + }, + { + "firstgid":36, + "source":"hex_tilesheet.tsj" + }], + "tilewidth":120, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file diff --git a/arcade/resources/assets/tiled_maps/hex_tilesheet.tsj b/arcade/resources/assets/tiled_maps/hex_tilesheet.tsj new file mode 100644 index 000000000..035100274 --- /dev/null +++ b/arcade/resources/assets/tiled_maps/hex_tilesheet.tsj @@ -0,0 +1,91 @@ +{ "columns":5, + "image":"..\/images\/spritesheets\/hex_tilesheet.png", + "imageheight":994, + "imagewidth":610, + "margin":1, + "name":"tilesheet", + "spacing":2, + "tilecount":35, + "tiledversion":"1.11.2", + "tileheight":140, + "tiles":[ + { + "id":0, + "type":"cement" + }, + { + "id":1, + "type":"desert" + }, + { + "id":2, + "type":"wasteland" + }, + { + "id":3, + "type":"grass" + }, + { + "id":4, + "type":"dirt" + }, + { + "id":5, + "type":"yellow_warehouse" + }, + { + "id":6, + "type":"mine" + }, + { + "id":8, + "type":"barracks" + }, + { + "id":9, + "type":"mountain" + }, + { + "id":10, + "type":"gas station" + }, + { + "id":11, + "type":"farm" + }, + { + "id":13, + "type":"house_1" + }, + { + "id":15, + "type":"corner store" + }, + { + "id":18, + "type":"house_2" + }, + { + "id":20, + "type":"camp" + }, + { + "id":23, + "type":"house_3" + }, + { + "id":28, + "type":"house_4" + }, + { + "id":32, + "type":"construction" + }, + { + "id":33, + "type":"forest" + }], + "tilewidth":120, + "type":"tileset", + "version":"1.10" +} \ No newline at end of file diff --git a/arcade/tilemap/tilemap.py b/arcade/tilemap/tilemap.py index 3828c6c9c..e5faea8ec 100644 --- a/arcade/tilemap/tilemap.py +++ b/arcade/tilemap/tilemap.py @@ -29,6 +29,7 @@ TextureAnimationSprite, TextureKeyframe, get_window, + hexagon, ) from arcade.hitbox import HitBoxAlgorithm, RotatableHitBox from arcade.types import RGBA255 @@ -153,6 +154,10 @@ class TileMap: SpriteLists will be created lazily. texture_cache_manager: The texture cache manager to use for loading textures. + hex_layout: + The hex layout to use for the map. If not supplied, the map will be + treated as a square map. If supplied, the map will be treated as a hexagonal map. + The ``layer_options`` parameter can be used to specify per layer arguments. The available options for this are: @@ -234,6 +239,7 @@ def __init__( texture_atlas: TextureAtlasBase | None = None, lazy: bool = False, texture_cache_manager: arcade.TextureCacheManager | None = None, + hex_layout: hexagon.Layout | None = None, ) -> None: if not map_file and not tiled_map: raise AttributeError( @@ -261,6 +267,8 @@ def __init__( except RuntimeError: pass + self.hex_layout = hex_layout + self._lazy = lazy self.texture_cache_manager = texture_cache_manager or arcade.texture.default_texture_cache @@ -771,13 +779,79 @@ def _process_tile_layer( atlas=texture_atlas, lazy=self._lazy, ) + + if self.hex_layout is None: + map_array = layer.data + if TYPE_CHECKING: + # Can never be None because we already detect and reject infinite maps + assert map_array + + # Loop through the layer and add in the list + for row_index, row in enumerate(map_array): + for column_index, item in enumerate(row): + # Check for an empty tile + if item == 0: + continue + + tile = self._get_tile_by_gid(item) + if tile is None: + raise ValueError( + f"Couldn't find tile for item {item} in layer " + f"'{layer.name}' in file '{self.tiled_map.map_file}'" + f"at ({column_index}, {row_index})." + ) + + my_sprite = self._create_sprite_from_tile( + tile, + scaling=scaling, + hit_box_algorithm=hit_box_algorithm, + custom_class=custom_class, + custom_class_args=custom_class_args, + ) + + if my_sprite is None: + print( + f"Warning: Could not create sprite number {item} " + f"in layer '{layer.name}' {tile.image}" + ) + else: + my_sprite.center_x = ( + column_index * (self.tiled_map.tile_size[0] * scaling) + + my_sprite.width / 2 + ) + offset[0] + my_sprite.center_y = ( + (self.tiled_map.map_size.height - row_index - 1) + * (self.tiled_map.tile_size[1] * scaling) + + my_sprite.height / 2 + ) + offset[1] + + # Tint + if layer.tint_color: + my_sprite.color = ArcadeColor.from_iterable(layer.tint_color) + + # Opacity + opacity = layer.opacity + if opacity: + my_sprite.alpha = int(opacity * 255) + + sprite_list.visible = layer.visible + sprite_list.append(my_sprite) + + if layer.properties: + sprite_list.properties = layer.properties + + return sprite_list + + # Hexagonal map map_array = layer.data if TYPE_CHECKING: # Can never be None because we already detect and reject infinite maps assert map_array + # FIXME: get tile size from tileset + # Loop through the layer and add in the list - for row_index, row in enumerate(map_array): + for row_index, row in enumerate(reversed(map_array)): for column_index, item in enumerate(row): # Check for an empty tile if item == 0: @@ -785,11 +859,12 @@ def _process_tile_layer( tile = self._get_tile_by_gid(item) if tile is None: - raise ValueError( + msg = ( f"Couldn't find tile for item {item} in layer " f"'{layer.name}' in file '{self.tiled_map.map_file}'" f"at ({column_index}, {row_index})." ) + raise ValueError(msg) my_sprite = self._create_sprite_from_tile( tile, @@ -801,22 +876,24 @@ def _process_tile_layer( if my_sprite is None: print( - f"Warning: Could not create sprite number {item} " - f"in layer '{layer.name}' {tile.image}" + f"Warning: Could not create sprite number {item} in layer '{layer.name}' {tile.image}" ) else: - my_sprite.center_x = ( - column_index * (self.tiled_map.tile_size[0] * scaling) + my_sprite.width / 2 - ) + offset[0] - my_sprite.center_y = ( - (self.tiled_map.map_size.height - row_index - 1) - * (self.tiled_map.tile_size[1] * scaling) - + my_sprite.height / 2 - ) + offset[1] + # FIXME: handle map scaling + # Convert from odd-r offset to cube coordinates + offset_coord = hexagon.OffsetCoord(column_index, row_index) + hex_ = offset_coord.to_cube("even-r") + + # Convert hex position to pixel position + pixel_pos = hex_.to_pixel(self.hex_layout) + # FIXME: why is the y position negative? + pixel_pos = hexagon.Vec2(pixel_pos.x, pixel_pos.y) + my_sprite.center_x = pixel_pos.x + my_sprite.center_y = pixel_pos.y # Tint if layer.tint_color: - my_sprite.color = ArcadeColor.from_iterable(layer.tint_color) + my_sprite.color = layer.tint_color # Opacity opacity = layer.opacity @@ -1032,6 +1109,7 @@ def load_tilemap( offset: Vec2 = Vec2(0, 0), texture_atlas: DefaultTextureAtlas | None = None, lazy: bool = False, + hex_layout: hexagon.Layout | None = None, ) -> TileMap: """ Given a .json map file, loads in and returns a `TileMap` object. @@ -1065,6 +1143,9 @@ def load_tilemap( If not supplied the global default atlas will be used. lazy: SpriteLists will be created lazily. + hex_layout: + The hex layout to use for the map. If not supplied, the map will be + treated as a square map. If supplied, the map will be treated as a hexagonal map. """ return TileMap( map_file=map_file, @@ -1075,4 +1156,5 @@ def load_tilemap( offset=offset, texture_atlas=texture_atlas, lazy=lazy, + hex_layout=hex_layout, ) diff --git a/hex_map.py b/hex_map.py new file mode 100644 index 000000000..2b7b4305b --- /dev/null +++ b/hex_map.py @@ -0,0 +1,195 @@ +""" +Hex Map Example + +If Python and Arcade are installed, this example can be run from the command line with: +python -m arcade.examples.hex_map +""" + +import math +from operator import add + +from pyglet.math import Vec2 + +import arcade +from arcade import hexagon + +WINDOW_WIDTH = 1280 +WINDOW_HEIGHT = 720 +WINDOW_TITLE = "Hex Map" + + +class GameView(arcade.View): + """ + Main application class. + """ + + def __init__(self): + super().__init__() + + # Variable to hold our Tiled Map + self.tile_map: arcade.TileMap + + # Replacing all of our SpriteLists with a Scene variable + self.scene: arcade.Scene + + # A variable to store our camera object + self.camera: arcade.camera.Camera2D + + # A variable to store our gui camera object + self.gui_camera: arcade.camera.Camera2D + + # Initialize the mouse_pan variable + self.mouse_pan = False + + def reset(self): + """Reset the game to the initial state.""" + # Do changes needed to restart the game here + + # Tiled always uses pointy orientations + orientation = hexagon.pointy_orientation + # + hex_size_x = 120 / math.sqrt(3) + hex_size_y = 140 / 2 + map_origin = Vec2(0, 0) + + hex_layout = hexagon.Layout( + orientation=orientation, + size=Vec2(hex_size_x, hex_size_y), + origin=map_origin, + ) + + # Load our TileMap + self.tile_map = arcade.load_tilemap( + ":resources:tiled_maps/hex_map.tmj", + hex_layout=hex_layout, + use_spatial_hash=True, + ) + + # Create our Scene Based on the TileMap + self.scene = arcade.Scene.from_tilemap(self.tile_map) # type: ignore[arg-type] + + # Initialize our camera, setting a viewport the size of our window. + self.camera = arcade.camera.Camera2D() + self.camera.zoom = 0.5 + + # Initialize our gui camera, initial settings are the same as our world camera. + self.gui_camera = arcade.camera.Camera2D() + + # Set the background color to a nice red + self.background_color = arcade.color.BLACK + + def on_draw(self): + """ + Render the screen. + """ + + # This command should happen before we start drawing. It will clear + # the screen to the background color, and erase what we drew last frame. + self.clear() + + with self.camera.activate(): + self.scene.draw() + + # Call draw() on all your sprite lists below + + def on_update(self, delta_time): + """ + All the logic to move, and the game logic goes here. + Normally, you'll call update() on the sprite lists that + need it. + """ + pass + + def on_key_press(self, key, key_modifiers): + """ + Called whenever a key on the keyboard is pressed. + + For a full list of keys, see: + https://api.arcade.academy/en/latest/arcade.key.html + """ + pass + + def on_key_release(self, key, key_modifiers): + """ + Called whenever the user lets off a previously pressed key. + """ + pass + + def on_mouse_motion(self, x, y, delta_x, delta_y): + """ + Called whenever the mouse moves. + """ + if self.mouse_pan: + # If the middle mouse button is pressed, we want to pan the camera + # by the amount of pixels the mouse moved, divided by the zoom level + # to keep the panning speed consistent regardless of zoom level. + # The camera position is updated by adding the delta_x and delta_y + # values to the current camera position, divided by the zoom level. + # This is done using the add function from the operator module to + # add the delta_x and delta_y values to the current camera position. + self.camera.position = tuple( + map( + add, + self.camera.position, + (-delta_x * 1 / self.camera.zoom, -delta_y * 1 / self.camera.zoom), + ) + ) + return + + def on_mouse_press(self, x, y, button, key_modifiers): + """ + Called when the user presses a mouse button. + """ + if button == arcade.MOUSE_BUTTON_MIDDLE: + self.mouse_pan = True + return + + def on_mouse_release(self, x, y, button, key_modifiers): + """ + Called when a user releases a mouse button. + """ + if button == arcade.MOUSE_BUTTON_MIDDLE: + self.mouse_pan = False + return + + def on_mouse_scroll(self, x: int, y: int, scroll_x: int, scroll_y: int) -> None: + """Called whenever the mouse scrolls.""" + # If the mouse wheel is scrolled, we want to zoom the camera in or out + # by the amount of scroll_y. The zoom level is adjusted by adding the + # scroll_y value multiplied by a zoom factor (0.1 in this case) to the + # current zoom level. This allows for smooth zooming in and out of the + # camera view. + + self.camera.zoom += scroll_y * 0.1 + + # The zoom level is clamped to a minimum of 0.1 to prevent the camera + # from zooming out too far. + if self.camera.zoom < 0.1: + self.camera.zoom = 0.1 + + # The zoom level is clamped to a maximum of 10 to prevent the camera + # from zooming in too far. + if self.camera.zoom > 2: + self.camera.zoom = 2 + + +def main(): + """Main function""" + # Create a window class. This is what actually shows up on screen + window = arcade.Window(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE) + + # Create and setup the GameView + game = GameView() + + # Show GameView on screen + window.show_view(game) + + # Reset the game to the initial state + game.reset() + + # Start the arcade game loop + arcade.run() + + +if __name__ == "__main__": + main() From de9175cd0dac67a13753b1783695f081f9c22e89 Mon Sep 17 00:00:00 2001 From: Benjamin Kirkbride Date: Tue, 20 May 2025 16:19:48 -0400 Subject: [PATCH 5/7] fixes --- arcade/examples/hex_map.py | 105 +++++++++++++++++--- arcade/tilemap/tilemap.py | 3 +- hex_map.py | 195 ------------------------------------- 3 files changed, 95 insertions(+), 208 deletions(-) delete mode 100644 hex_map.py diff --git a/arcade/examples/hex_map.py b/arcade/examples/hex_map.py index 10c5fdc97..2b7b4305b 100644 --- a/arcade/examples/hex_map.py +++ b/arcade/examples/hex_map.py @@ -4,8 +4,14 @@ If Python and Arcade are installed, this example can be run from the command line with: python -m arcade.examples.hex_map """ + +import math +from operator import add + +from pyglet.math import Vec2 + import arcade -from arcade import TileMap +from arcade import hexagon WINDOW_WIDTH = 1280 WINDOW_HEIGHT = 720 @@ -21,7 +27,7 @@ def __init__(self): super().__init__() # Variable to hold our Tiled Map - self.tile_map: TileMap + self.tile_map: arcade.TileMap # Replacing all of our SpriteLists with a Scene variable self.scene: arcade.Scene @@ -32,14 +38,45 @@ def __init__(self): # A variable to store our gui camera object self.gui_camera: arcade.camera.Camera2D - - # If you have sprite lists, you should create them here, - # and set them to None + # Initialize the mouse_pan variable + self.mouse_pan = False def reset(self): """Reset the game to the initial state.""" - # Do changes needed to restart the game here if you want to support that - pass + # Do changes needed to restart the game here + + # Tiled always uses pointy orientations + orientation = hexagon.pointy_orientation + # + hex_size_x = 120 / math.sqrt(3) + hex_size_y = 140 / 2 + map_origin = Vec2(0, 0) + + hex_layout = hexagon.Layout( + orientation=orientation, + size=Vec2(hex_size_x, hex_size_y), + origin=map_origin, + ) + + # Load our TileMap + self.tile_map = arcade.load_tilemap( + ":resources:tiled_maps/hex_map.tmj", + hex_layout=hex_layout, + use_spatial_hash=True, + ) + + # Create our Scene Based on the TileMap + self.scene = arcade.Scene.from_tilemap(self.tile_map) # type: ignore[arg-type] + + # Initialize our camera, setting a viewport the size of our window. + self.camera = arcade.camera.Camera2D() + self.camera.zoom = 0.5 + + # Initialize our gui camera, initial settings are the same as our world camera. + self.gui_camera = arcade.camera.Camera2D() + + # Set the background color to a nice red + self.background_color = arcade.color.BLACK def on_draw(self): """ @@ -50,6 +87,9 @@ def on_draw(self): # the screen to the background color, and erase what we drew last frame. self.clear() + with self.camera.activate(): + self.scene.draw() + # Call draw() on all your sprite lists below def on_update(self, delta_time): @@ -79,23 +119,62 @@ def on_mouse_motion(self, x, y, delta_x, delta_y): """ Called whenever the mouse moves. """ - pass + if self.mouse_pan: + # If the middle mouse button is pressed, we want to pan the camera + # by the amount of pixels the mouse moved, divided by the zoom level + # to keep the panning speed consistent regardless of zoom level. + # The camera position is updated by adding the delta_x and delta_y + # values to the current camera position, divided by the zoom level. + # This is done using the add function from the operator module to + # add the delta_x and delta_y values to the current camera position. + self.camera.position = tuple( + map( + add, + self.camera.position, + (-delta_x * 1 / self.camera.zoom, -delta_y * 1 / self.camera.zoom), + ) + ) + return def on_mouse_press(self, x, y, button, key_modifiers): """ Called when the user presses a mouse button. """ - pass + if button == arcade.MOUSE_BUTTON_MIDDLE: + self.mouse_pan = True + return def on_mouse_release(self, x, y, button, key_modifiers): """ Called when a user releases a mouse button. """ - pass + if button == arcade.MOUSE_BUTTON_MIDDLE: + self.mouse_pan = False + return + + def on_mouse_scroll(self, x: int, y: int, scroll_x: int, scroll_y: int) -> None: + """Called whenever the mouse scrolls.""" + # If the mouse wheel is scrolled, we want to zoom the camera in or out + # by the amount of scroll_y. The zoom level is adjusted by adding the + # scroll_y value multiplied by a zoom factor (0.1 in this case) to the + # current zoom level. This allows for smooth zooming in and out of the + # camera view. + + self.camera.zoom += scroll_y * 0.1 + + # The zoom level is clamped to a minimum of 0.1 to prevent the camera + # from zooming out too far. + if self.camera.zoom < 0.1: + self.camera.zoom = 0.1 + + # The zoom level is clamped to a maximum of 10 to prevent the camera + # from zooming in too far. + if self.camera.zoom > 2: + self.camera.zoom = 2 def main(): - """ Main function """ + """Main function""" # Create a window class. This is what actually shows up on screen window = arcade.Window(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE) @@ -105,10 +184,12 @@ def main(): # Show GameView on screen window.show_view(game) + # Reset the game to the initial state + game.reset() + # Start the arcade game loop arcade.run() - if __name__ == "__main__": main() diff --git a/arcade/tilemap/tilemap.py b/arcade/tilemap/tilemap.py index e5faea8ec..83680840f 100644 --- a/arcade/tilemap/tilemap.py +++ b/arcade/tilemap/tilemap.py @@ -876,7 +876,8 @@ def _process_tile_layer( if my_sprite is None: print( - f"Warning: Could not create sprite number {item} in layer '{layer.name}' {tile.image}" + f"Warning: Could not create sprite number {item} " + f"in layer '{layer.name}' {tile.image}" ) else: # FIXME: handle map scaling diff --git a/hex_map.py b/hex_map.py deleted file mode 100644 index 2b7b4305b..000000000 --- a/hex_map.py +++ /dev/null @@ -1,195 +0,0 @@ -""" -Hex Map Example - -If Python and Arcade are installed, this example can be run from the command line with: -python -m arcade.examples.hex_map -""" - -import math -from operator import add - -from pyglet.math import Vec2 - -import arcade -from arcade import hexagon - -WINDOW_WIDTH = 1280 -WINDOW_HEIGHT = 720 -WINDOW_TITLE = "Hex Map" - - -class GameView(arcade.View): - """ - Main application class. - """ - - def __init__(self): - super().__init__() - - # Variable to hold our Tiled Map - self.tile_map: arcade.TileMap - - # Replacing all of our SpriteLists with a Scene variable - self.scene: arcade.Scene - - # A variable to store our camera object - self.camera: arcade.camera.Camera2D - - # A variable to store our gui camera object - self.gui_camera: arcade.camera.Camera2D - - # Initialize the mouse_pan variable - self.mouse_pan = False - - def reset(self): - """Reset the game to the initial state.""" - # Do changes needed to restart the game here - - # Tiled always uses pointy orientations - orientation = hexagon.pointy_orientation - # - hex_size_x = 120 / math.sqrt(3) - hex_size_y = 140 / 2 - map_origin = Vec2(0, 0) - - hex_layout = hexagon.Layout( - orientation=orientation, - size=Vec2(hex_size_x, hex_size_y), - origin=map_origin, - ) - - # Load our TileMap - self.tile_map = arcade.load_tilemap( - ":resources:tiled_maps/hex_map.tmj", - hex_layout=hex_layout, - use_spatial_hash=True, - ) - - # Create our Scene Based on the TileMap - self.scene = arcade.Scene.from_tilemap(self.tile_map) # type: ignore[arg-type] - - # Initialize our camera, setting a viewport the size of our window. - self.camera = arcade.camera.Camera2D() - self.camera.zoom = 0.5 - - # Initialize our gui camera, initial settings are the same as our world camera. - self.gui_camera = arcade.camera.Camera2D() - - # Set the background color to a nice red - self.background_color = arcade.color.BLACK - - def on_draw(self): - """ - Render the screen. - """ - - # This command should happen before we start drawing. It will clear - # the screen to the background color, and erase what we drew last frame. - self.clear() - - with self.camera.activate(): - self.scene.draw() - - # Call draw() on all your sprite lists below - - def on_update(self, delta_time): - """ - All the logic to move, and the game logic goes here. - Normally, you'll call update() on the sprite lists that - need it. - """ - pass - - def on_key_press(self, key, key_modifiers): - """ - Called whenever a key on the keyboard is pressed. - - For a full list of keys, see: - https://api.arcade.academy/en/latest/arcade.key.html - """ - pass - - def on_key_release(self, key, key_modifiers): - """ - Called whenever the user lets off a previously pressed key. - """ - pass - - def on_mouse_motion(self, x, y, delta_x, delta_y): - """ - Called whenever the mouse moves. - """ - if self.mouse_pan: - # If the middle mouse button is pressed, we want to pan the camera - # by the amount of pixels the mouse moved, divided by the zoom level - # to keep the panning speed consistent regardless of zoom level. - # The camera position is updated by adding the delta_x and delta_y - # values to the current camera position, divided by the zoom level. - # This is done using the add function from the operator module to - # add the delta_x and delta_y values to the current camera position. - self.camera.position = tuple( - map( - add, - self.camera.position, - (-delta_x * 1 / self.camera.zoom, -delta_y * 1 / self.camera.zoom), - ) - ) - return - - def on_mouse_press(self, x, y, button, key_modifiers): - """ - Called when the user presses a mouse button. - """ - if button == arcade.MOUSE_BUTTON_MIDDLE: - self.mouse_pan = True - return - - def on_mouse_release(self, x, y, button, key_modifiers): - """ - Called when a user releases a mouse button. - """ - if button == arcade.MOUSE_BUTTON_MIDDLE: - self.mouse_pan = False - return - - def on_mouse_scroll(self, x: int, y: int, scroll_x: int, scroll_y: int) -> None: - """Called whenever the mouse scrolls.""" - # If the mouse wheel is scrolled, we want to zoom the camera in or out - # by the amount of scroll_y. The zoom level is adjusted by adding the - # scroll_y value multiplied by a zoom factor (0.1 in this case) to the - # current zoom level. This allows for smooth zooming in and out of the - # camera view. - - self.camera.zoom += scroll_y * 0.1 - - # The zoom level is clamped to a minimum of 0.1 to prevent the camera - # from zooming out too far. - if self.camera.zoom < 0.1: - self.camera.zoom = 0.1 - - # The zoom level is clamped to a maximum of 10 to prevent the camera - # from zooming in too far. - if self.camera.zoom > 2: - self.camera.zoom = 2 - - -def main(): - """Main function""" - # Create a window class. This is what actually shows up on screen - window = arcade.Window(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE) - - # Create and setup the GameView - game = GameView() - - # Show GameView on screen - window.show_view(game) - - # Reset the game to the initial state - game.reset() - - # Start the arcade game loop - arcade.run() - - -if __name__ == "__main__": - main() From 9205c1d3b97aa5e98818d9b786daa3206c85b0d1 Mon Sep 17 00:00:00 2001 From: Benjamin Kirkbride Date: Tue, 20 May 2025 16:21:07 -0400 Subject: [PATCH 6/7] final fix o ya --- arcade/tilemap/tilemap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arcade/tilemap/tilemap.py b/arcade/tilemap/tilemap.py index 83680840f..7d1a4a9e0 100644 --- a/arcade/tilemap/tilemap.py +++ b/arcade/tilemap/tilemap.py @@ -894,7 +894,7 @@ def _process_tile_layer( # Tint if layer.tint_color: - my_sprite.color = layer.tint_color + my_sprite.color = ArcadeColor.from_iterable(layer.tint_color) # Opacity opacity = layer.opacity From 64c6e1de83944867c3ed0841f081a1fee4a7c0ed Mon Sep 17 00:00:00 2001 From: Benjamin Kirkbride Date: Sun, 25 May 2025 13:51:29 -0400 Subject: [PATCH 7/7] fix reference to tilesheet --- .../resources/assets/tiled_maps/hex_map.tmj | 62 +++++++++---------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/arcade/resources/assets/tiled_maps/hex_map.tmj b/arcade/resources/assets/tiled_maps/hex_map.tmj index 8d6d9c91c..0cec4af11 100644 --- a/arcade/resources/assets/tiled_maps/hex_map.tmj +++ b/arcade/resources/assets/tiled_maps/hex_map.tmj @@ -4,26 +4,26 @@ "infinite":false, "layers":[ { - "data":[38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, - 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, - 38, 38, 38, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 37, 37, 37, 38, 38, 38, - 38, 38, 38, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 37, 37, 37, 38, 38, 38, - 38, 38, 38, 37, 37, 37, 37, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 37, 37, 37, 38, 38, - 38, 38, 38, 37, 37, 37, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 39, 40, 40, 37, 37, 37, 38, 38, 38, - 38, 38, 38, 37, 37, 37, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 39, 39, 40, 40, 37, 37, 37, 38, 38, - 38, 38, 38, 37, 37, 37, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 36, 39, 39, 40, 37, 37, 37, 38, 38, 38, - 38, 38, 38, 37, 37, 37, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 36, 39, 39, 40, 40, 37, 37, 37, 38, 38, - 38, 38, 38, 37, 37, 37, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 36, 36, 36, 39, 39, 40, 40, 40, 37, 37, 37, 38, 38, - 38, 38, 38, 37, 37, 37, 40, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 37, 37, 37, 38, 38, - 38, 38, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 39, 39, 39, 40, 40, 40, 40, 37, 37, 37, 37, 38, 38, - 38, 38, 38, 37, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 37, 37, 37, 37, 38, 38, - 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 40, 40, 40, 40, 40, 40, 40, 37, 37, 37, 37, 37, 38, 38, 38, - 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, - 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38], + "data":[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 5, 5, 5, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 2, 2, 2, 3, 3, + 3, 3, 3, 2, 2, 2, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 4, 5, 5, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 4, 4, 5, 5, 2, 2, 2, 3, 3, + 3, 3, 3, 2, 2, 2, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 4, 4, 5, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 1, 4, 4, 5, 5, 2, 2, 2, 3, 3, + 3, 3, 3, 2, 2, 2, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 4, 4, 5, 5, 5, 2, 2, 2, 3, 3, + 3, 3, 3, 2, 2, 2, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 2, 2, 2, 3, 3, + 3, 3, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 3, 3, + 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], "height":20, "id":1, "name":"TILE", @@ -41,14 +41,14 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 0, 0, 0, 0, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 42, 0, 0, 44, 47, 47, 47, 0, 51, 0, 41, 49, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 0, 0, 0, 44, 0, 0, 68, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 45, 0, 0, 0, 0, 0, 56, 0, 0, 46, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 45, 45, 42, 0, 0, 0, 0, 69, 69, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 69, 69, 69, 69, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 69, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 7, 0, 0, 9, 12, 12, 12, 0, 16, 0, 6, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 9, 0, 0, 33, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 0, 0, 0, 0, 0, 21, 0, 0, 11, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 7, 0, 0, 0, 0, 34, 34, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -76,14 +76,10 @@ "tilesets":[ { "firstgid":1, - "source":"..\/..\/..\/..\/..\/sim\/assets\/maps\/tilesheet.tsj" - }, - { - "firstgid":36, "source":"hex_tilesheet.tsj" }], "tilewidth":120, "type":"map", - "version":"1.10", + "version":"1.11", "width":30 } \ No newline at end of file