diff --git a/assets/images/entities/enemies/enemy.png b/assets/images/entities/enemies/enemy.png new file mode 100644 index 0000000..888b03f Binary files /dev/null and b/assets/images/entities/enemies/enemy.png differ diff --git a/assets/images/entities/towers/cannon/red_cannon.png b/assets/images/entities/towers/cannon/red_cannon.png new file mode 100644 index 0000000..c5ef0fb Binary files /dev/null and b/assets/images/entities/towers/cannon/red_cannon.png differ diff --git a/assets/images/entities/towers/cannon/shoot/0.png b/assets/images/entities/towers/cannon/shoot/0.png new file mode 100644 index 0000000..2fcde4b Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/0.png differ diff --git a/assets/images/entities/towers/cannon/shoot/1.png b/assets/images/entities/towers/cannon/shoot/1.png new file mode 100644 index 0000000..68c1ac3 Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/1.png differ diff --git a/assets/images/entities/towers/cannon/shoot/2.png b/assets/images/entities/towers/cannon/shoot/2.png new file mode 100644 index 0000000..08f55e4 Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/2.png differ diff --git a/assets/images/entities/towers/cannon/shoot/3.png b/assets/images/entities/towers/cannon/shoot/3.png new file mode 100644 index 0000000..7c597e6 Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/3.png differ diff --git a/assets/images/entities/towers/cannon/shoot/4.png b/assets/images/entities/towers/cannon/shoot/4.png new file mode 100644 index 0000000..38638d8 Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/4.png differ diff --git a/assets/images/entities/towers/cannon/shoot/5.png b/assets/images/entities/towers/cannon/shoot/5.png new file mode 100644 index 0000000..01c0cba Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/5.png differ diff --git a/assets/images/entities/towers/cannon/shoot/6.png b/assets/images/entities/towers/cannon/shoot/6.png new file mode 100644 index 0000000..e1e9ba0 Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/6.png differ diff --git a/assets/images/entities/towers/cannon/shoot/7.png b/assets/images/entities/towers/cannon/shoot/7.png new file mode 100644 index 0000000..b1f1bbc Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/7.png differ diff --git a/assets/images/entities/towers/cannon/shoot/8.png b/assets/images/entities/towers/cannon/shoot/8.png new file mode 100644 index 0000000..4def5bd Binary files /dev/null and b/assets/images/entities/towers/cannon/shoot/8.png differ diff --git a/assets/images/tiles/desert/0.png b/assets/images/tiles/desert/0.png new file mode 100644 index 0000000..c6abb51 Binary files /dev/null and b/assets/images/tiles/desert/0.png differ diff --git a/assets/images/tiles/desert/1.png b/assets/images/tiles/desert/1.png new file mode 100644 index 0000000..17889a0 Binary files /dev/null and b/assets/images/tiles/desert/1.png differ diff --git a/assets/images/tiles/desert/10.png b/assets/images/tiles/desert/10.png new file mode 100644 index 0000000..376608b Binary files /dev/null and b/assets/images/tiles/desert/10.png differ diff --git a/assets/images/tiles/desert/11.png b/assets/images/tiles/desert/11.png new file mode 100644 index 0000000..e05f6ff Binary files /dev/null and b/assets/images/tiles/desert/11.png differ diff --git a/assets/images/tiles/desert/12.png b/assets/images/tiles/desert/12.png new file mode 100644 index 0000000..4397d01 Binary files /dev/null and b/assets/images/tiles/desert/12.png differ diff --git a/assets/images/tiles/desert/13.png b/assets/images/tiles/desert/13.png new file mode 100644 index 0000000..8207dd2 Binary files /dev/null and b/assets/images/tiles/desert/13.png differ diff --git a/assets/images/tiles/desert/14.png b/assets/images/tiles/desert/14.png new file mode 100644 index 0000000..687f306 Binary files /dev/null and b/assets/images/tiles/desert/14.png differ diff --git a/assets/images/tiles/desert/15.png b/assets/images/tiles/desert/15.png new file mode 100644 index 0000000..3b00717 Binary files /dev/null and b/assets/images/tiles/desert/15.png differ diff --git a/assets/images/tiles/desert/16.png b/assets/images/tiles/desert/16.png new file mode 100644 index 0000000..356e01b Binary files /dev/null and b/assets/images/tiles/desert/16.png differ diff --git a/assets/images/tiles/desert/17.png b/assets/images/tiles/desert/17.png new file mode 100644 index 0000000..8cd09f5 Binary files /dev/null and b/assets/images/tiles/desert/17.png differ diff --git a/assets/images/tiles/desert/18.png b/assets/images/tiles/desert/18.png new file mode 100644 index 0000000..043c757 Binary files /dev/null and b/assets/images/tiles/desert/18.png differ diff --git a/assets/images/tiles/desert/2.png b/assets/images/tiles/desert/2.png new file mode 100644 index 0000000..3b82596 Binary files /dev/null and b/assets/images/tiles/desert/2.png differ diff --git a/assets/images/tiles/desert/3.png b/assets/images/tiles/desert/3.png new file mode 100644 index 0000000..5a285a6 Binary files /dev/null and b/assets/images/tiles/desert/3.png differ diff --git a/assets/images/tiles/desert/4.png b/assets/images/tiles/desert/4.png new file mode 100644 index 0000000..2125bd8 Binary files /dev/null and b/assets/images/tiles/desert/4.png differ diff --git a/assets/images/tiles/desert/5.png b/assets/images/tiles/desert/5.png new file mode 100644 index 0000000..a115c97 Binary files /dev/null and b/assets/images/tiles/desert/5.png differ diff --git a/assets/images/tiles/desert/6.png b/assets/images/tiles/desert/6.png new file mode 100644 index 0000000..b24ae33 Binary files /dev/null and b/assets/images/tiles/desert/6.png differ diff --git a/assets/images/tiles/desert/7.png b/assets/images/tiles/desert/7.png new file mode 100644 index 0000000..a8265b9 Binary files /dev/null and b/assets/images/tiles/desert/7.png differ diff --git a/assets/images/tiles/desert/8.png b/assets/images/tiles/desert/8.png new file mode 100644 index 0000000..b188b4c Binary files /dev/null and b/assets/images/tiles/desert/8.png differ diff --git a/assets/images/tiles/desert/9.png b/assets/images/tiles/desert/9.png new file mode 100644 index 0000000..bf27760 Binary files /dev/null and b/assets/images/tiles/desert/9.png differ diff --git a/assets/maps/desert.json b/assets/maps/desert.json new file mode 100644 index 0000000..f1cd5e3 --- /dev/null +++ b/assets/maps/desert.json @@ -0,0 +1 @@ +{"tilemap": {"0;0": {"type": "desert", "variant": 0, "pos": [0, 0]}, "0;1": {"type": "desert", "variant": 0, "pos": [0, 1]}, "0;2": {"type": "desert", "variant": 0, "pos": [0, 2]}, "1;0": {"type": "desert", "variant": 0, "pos": [1, 0]}, "2;0": {"type": "desert", "variant": 0, "pos": [2, 0]}, "3;0": {"type": "desert", "variant": 0, "pos": [3, 0]}, "4;0": {"type": "desert", "variant": 0, "pos": [4, 0]}, "5;0": {"type": "desert", "variant": 0, "pos": [5, 0]}, "0;3": {"type": "desert", "variant": 0, "pos": [0, 3]}, "0;4": {"type": "desert", "variant": 0, "pos": [0, 4]}, "0;5": {"type": "desert", "variant": 0, "pos": [0, 5]}, "0;6": {"type": "desert", "variant": 0, "pos": [0, 6]}, "0;7": {"type": "desert", "variant": 1, "pos": [0, 7]}, "0;8": {"type": "desert", "variant": 0, "pos": [0, 8]}, "0;9": {"type": "desert", "variant": 0, "pos": [0, 9]}, "0;10": {"type": "desert", "variant": 4, "pos": [0, 10]}, "0;11": {"type": "desert", "variant": 0, "pos": [0, 11]}, "1;11": {"type": "desert", "variant": 0, "pos": [1, 11]}, "2;11": {"type": "desert", "variant": 0, "pos": [2, 11]}, "3;11": {"type": "desert", "variant": 0, "pos": [3, 11]}, "4;11": {"type": "desert", "variant": 0, "pos": [4, 11]}, "5;11": {"type": "desert", "variant": 0, "pos": [5, 11]}, "6;11": {"type": "desert", "variant": 0, "pos": [6, 11]}, "7;11": {"type": "desert", "variant": 0, "pos": [7, 11]}, "8;11": {"type": "desert", "variant": 9, "pos": [8, 11]}, "9;11": {"type": "desert", "variant": 8, "pos": [9, 11]}, "10;11": {"type": "desert", "variant": 10, "pos": [10, 11]}, "11;11": {"type": "desert", "variant": 5, "pos": [11, 11]}, "6;0": {"type": "desert", "variant": 0, "pos": [6, 0]}, "7;0": {"type": "desert", "variant": 0, "pos": [7, 0]}, "8;0": {"type": "desert", "variant": 9, "pos": [8, 0]}, "9;0": {"type": "desert", "variant": 8, "pos": [9, 0]}, "10;0": {"type": "desert", "variant": 10, "pos": [10, 0]}, "11;0": {"type": "desert", "variant": 0, "pos": [11, 0]}, "12;0": {"type": "desert", "variant": 0, "pos": [12, 0]}, "13;0": {"type": "desert", "variant": 1, "pos": [13, 0]}, "14;0": {"type": "desert", "variant": 0, "pos": [14, 0]}, "14;1": {"type": "desert", "variant": 0, "pos": [14, 1]}, "14;2": {"type": "desert", "variant": 18, "pos": [14, 2]}, "14;3": {"type": "desert", "variant": 0, "pos": [14, 3]}, "14;4": {"type": "desert", "variant": 0, "pos": [14, 4]}, "14;5": {"type": "desert", "variant": 18, "pos": [14, 5]}, "14;6": {"type": "desert", "variant": 0, "pos": [14, 6]}, "14;7": {"type": "desert", "variant": 0, "pos": [14, 7]}, "14;8": {"type": "desert", "variant": 0, "pos": [14, 8]}, "14;9": {"type": "desert", "variant": 0, "pos": [14, 9]}, "14;10": {"type": "desert", "variant": 0, "pos": [14, 10]}, "14;11": {"type": "desert", "variant": 0, "pos": [14, 11]}, "13;11": {"type": "desert", "variant": 7, "pos": [13, 11]}, "12;11": {"type": "desert", "variant": 6, "pos": [12, 11]}, "1;10": {"type": "desert", "variant": 18, "pos": [1, 10]}, "2;10": {"type": "desert", "variant": 18, "pos": [2, 10]}, "3;10": {"type": "desert", "variant": 18, "pos": [3, 10]}, "4;10": {"type": "desert", "variant": 18, "pos": [4, 10]}, "5;10": {"type": "desert", "variant": 18, "pos": [5, 10]}, "6;10": {"type": "desert", "variant": 15, "pos": [6, 10]}, "6;9": {"type": "desert", "variant": 16, "pos": [6, 9]}, "6;8": {"type": "desert", "variant": 16, "pos": [6, 8]}, "6;7": {"type": "desert", "variant": 2, "pos": [6, 7]}, "5;7": {"type": "desert", "variant": 18, "pos": [5, 7]}, "4;7": {"type": "desert", "variant": 18, "pos": [4, 7]}, "3;7": {"type": "desert", "variant": 18, "pos": [3, 7]}, "2;7": {"type": "desert", "variant": 18, "pos": [2, 7]}, "1;7": {"type": "desert", "variant": 3, "pos": [1, 7]}, "2;8": {"type": "desert", "variant": 0, "pos": [2, 8]}, "1;8": {"type": "desert", "variant": 0, "pos": [1, 8]}, "1;9": {"type": "desert", "variant": 0, "pos": [1, 9]}, "2;9": {"type": "desert", "variant": 0, "pos": [2, 9]}, "3;8": {"type": "desert", "variant": 0, "pos": [3, 8]}, "3;9": {"type": "desert", "variant": 0, "pos": [3, 9]}, "4;9": {"type": "desert", "variant": 0, "pos": [4, 9]}, "4;8": {"type": "desert", "variant": 0, "pos": [4, 8]}, "5;8": {"type": "desert", "variant": 0, "pos": [5, 8]}, "5;9": {"type": "desert", "variant": 0, "pos": [5, 9]}, "1;6": {"type": "desert", "variant": 16, "pos": [1, 6]}, "1;4": {"type": "desert", "variant": 16, "pos": [1, 4]}, "1;5": {"type": "desert", "variant": 16, "pos": [1, 5]}, "1;3": {"type": "desert", "variant": 16, "pos": [1, 3]}, "1;2": {"type": "desert", "variant": 17, "pos": [1, 2]}, "1;1": {"type": "desert", "variant": 0, "pos": [1, 1]}, "2;1": {"type": "desert", "variant": 0, "pos": [2, 1]}, "3;1": {"type": "desert", "variant": 0, "pos": [3, 1]}, "4;1": {"type": "desert", "variant": 1, "pos": [4, 1]}, "5;1": {"type": "desert", "variant": 0, "pos": [5, 1]}, "6;1": {"type": "desert", "variant": 0, "pos": [6, 1]}, "7;1": {"type": "desert", "variant": 0, "pos": [7, 1]}, "8;1": {"type": "desert", "variant": 9, "pos": [8, 1]}, "9;1": {"type": "desert", "variant": 8, "pos": [9, 1]}, "10;1": {"type": "desert", "variant": 10, "pos": [10, 1]}, "11;1": {"type": "desert", "variant": 0, "pos": [11, 1]}, "12;1": {"type": "desert", "variant": 0, "pos": [12, 1]}, "13;1": {"type": "desert", "variant": 0, "pos": [13, 1]}, "2;2": {"type": "desert", "variant": 18, "pos": [2, 2]}, "3;2": {"type": "desert", "variant": 18, "pos": [3, 2]}, "4;2": {"type": "desert", "variant": 18, "pos": [4, 2]}, "5;2": {"type": "desert", "variant": 18, "pos": [5, 2]}, "6;2": {"type": "desert", "variant": 18, "pos": [6, 2]}, "7;2": {"type": "desert", "variant": 18, "pos": [7, 2]}, "8;2": {"type": "desert", "variant": 11, "pos": [8, 2]}, "9;2": {"type": "desert", "variant": 12, "pos": [9, 2]}, "10;2": {"type": "desert", "variant": 13, "pos": [10, 2]}, "11;2": {"type": "desert", "variant": 18, "pos": [11, 2]}, "12;2": {"type": "desert", "variant": 18, "pos": [12, 2]}, "13;2": {"type": "desert", "variant": 18, "pos": [13, 2]}, "15;2": {"type": "desert", "variant": 2, "pos": [15, 2]}, "15;3": {"type": "desert", "variant": 16, "pos": [15, 3]}, "15;4": {"type": "desert", "variant": 16, "pos": [15, 4]}, "15;5": {"type": "desert", "variant": 15, "pos": [15, 5]}, "13;5": {"type": "desert", "variant": 18, "pos": [13, 5]}, "12;5": {"type": "desert", "variant": 17, "pos": [12, 5]}, "12;6": {"type": "desert", "variant": 16, "pos": [12, 6]}, "12;7": {"type": "desert", "variant": 16, "pos": [12, 7]}, "12;8": {"type": "desert", "variant": 16, "pos": [12, 8]}, "12;9": {"type": "desert", "variant": 16, "pos": [12, 9]}, "12;10": {"type": "desert", "variant": 16, "pos": [12, 10]}, "7;9": {"type": "desert", "variant": 1, "pos": [7, 9]}, "12;3": {"type": "desert", "variant": 1, "pos": [12, 3]}, "13;7": {"type": "desert", "variant": 1, "pos": [13, 7]}, "11;8": {"type": "desert", "variant": 1, "pos": [11, 8]}, "2;4": {"type": "desert", "variant": 1, "pos": [2, 4]}, "7;8": {"type": "desert", "variant": 0, "pos": [7, 8]}, "7;7": {"type": "desert", "variant": 0, "pos": [7, 7]}, "7;10": {"type": "desert", "variant": 0, "pos": [7, 10]}, "7;6": {"type": "desert", "variant": 0, "pos": [7, 6]}, "7;5": {"type": "desert", "variant": 0, "pos": [7, 5]}, "7;4": {"type": "desert", "variant": 0, "pos": [7, 4]}, "7;3": {"type": "desert", "variant": 0, "pos": [7, 3]}, "6;3": {"type": "desert", "variant": 0, "pos": [6, 3]}, "5;3": {"type": "desert", "variant": 0, "pos": [5, 3]}, "4;3": {"type": "desert", "variant": 0, "pos": [4, 3]}, "3;3": {"type": "desert", "variant": 0, "pos": [3, 3]}, "2;3": {"type": "desert", "variant": 0, "pos": [2, 3]}, "3;4": {"type": "desert", "variant": 0, "pos": [3, 4]}, "3;5": {"type": "desert", "variant": 0, "pos": [3, 5]}, "3;6": {"type": "desert", "variant": 0, "pos": [3, 6]}, "2;6": {"type": "desert", "variant": 0, "pos": [2, 6]}, "2;5": {"type": "desert", "variant": 0, "pos": [2, 5]}, "4;6": {"type": "desert", "variant": 0, "pos": [4, 6]}, "4;5": {"type": "desert", "variant": 0, "pos": [4, 5]}, "4;4": {"type": "desert", "variant": 0, "pos": [4, 4]}, "5;4": {"type": "desert", "variant": 0, "pos": [5, 4]}, "6;4": {"type": "desert", "variant": 0, "pos": [6, 4]}, "5;5": {"type": "desert", "variant": 0, "pos": [5, 5]}, "5;6": {"type": "desert", "variant": 0, "pos": [5, 6]}, "6;6": {"type": "desert", "variant": 0, "pos": [6, 6]}, "6;5": {"type": "desert", "variant": 0, "pos": [6, 5]}, "11;7": {"type": "desert", "variant": 0, "pos": [11, 7]}, "11;6": {"type": "desert", "variant": 0, "pos": [11, 6]}, "11;5": {"type": "desert", "variant": 0, "pos": [11, 5]}, "11;4": {"type": "desert", "variant": 0, "pos": [11, 4]}, "11;3": {"type": "desert", "variant": 0, "pos": [11, 3]}, "12;4": {"type": "desert", "variant": 0, "pos": [12, 4]}, "13;4": {"type": "desert", "variant": 0, "pos": [13, 4]}, "13;3": {"type": "desert", "variant": 0, "pos": [13, 3]}, "13;6": {"type": "desert", "variant": 0, "pos": [13, 6]}, "13;8": {"type": "desert", "variant": 0, "pos": [13, 8]}, "13;9": {"type": "desert", "variant": 0, "pos": [13, 9]}, "13;10": {"type": "desert", "variant": 0, "pos": [13, 10]}, "11;9": {"type": "desert", "variant": 0, "pos": [11, 9]}, "11;10": {"type": "desert", "variant": 0, "pos": [11, 10]}, "15;1": {"type": "desert", "variant": 0, "pos": [15, 1]}, "15;0": {"type": "desert", "variant": 0, "pos": [15, 0]}, "16;0": {"type": "desert", "variant": 0, "pos": [16, 0]}, "16;1": {"type": "desert", "variant": 0, "pos": [16, 1]}, "16;2": {"type": "desert", "variant": 0, "pos": [16, 2]}, "16;3": {"type": "desert", "variant": 0, "pos": [16, 3]}, "16;4": {"type": "desert", "variant": 0, "pos": [16, 4]}, "16;5": {"type": "desert", "variant": 0, "pos": [16, 5]}, "16;6": {"type": "desert", "variant": 0, "pos": [16, 6]}, "15;6": {"type": "desert", "variant": 0, "pos": [15, 6]}, "15;7": {"type": "desert", "variant": 0, "pos": [15, 7]}, "15;8": {"type": "desert", "variant": 0, "pos": [15, 8]}, "15;9": {"type": "desert", "variant": 0, "pos": [15, 9]}, "15;10": {"type": "desert", "variant": 0, "pos": [15, 10]}, "15;11": {"type": "desert", "variant": 0, "pos": [15, 11]}, "16;11": {"type": "desert", "variant": 0, "pos": [16, 11]}, "16;10": {"type": "desert", "variant": 1, "pos": [16, 10]}, "16;9": {"type": "desert", "variant": 0, "pos": [16, 9]}, "16;8": {"type": "desert", "variant": 0, "pos": [16, 8]}, "16;7": {"type": "desert", "variant": 0, "pos": [16, 7]}, "10;3": {"type": "desert", "variant": 10, "pos": [10, 3]}, "10;4": {"type": "desert", "variant": 10, "pos": [10, 4]}, "10;5": {"type": "desert", "variant": 10, "pos": [10, 5]}, "10;6": {"type": "desert", "variant": 10, "pos": [10, 6]}, "10;7": {"type": "desert", "variant": 10, "pos": [10, 7]}, "10;8": {"type": "desert", "variant": 10, "pos": [10, 8]}, "10;9": {"type": "desert", "variant": 10, "pos": [10, 9]}, "10;10": {"type": "desert", "variant": 10, "pos": [10, 10]}, "8;3": {"type": "desert", "variant": 9, "pos": [8, 3]}, "8;4": {"type": "desert", "variant": 9, "pos": [8, 4]}, "8;5": {"type": "desert", "variant": 9, "pos": [8, 5]}, "8;6": {"type": "desert", "variant": 9, "pos": [8, 6]}, "8;7": {"type": "desert", "variant": 9, "pos": [8, 7]}, "8;8": {"type": "desert", "variant": 9, "pos": [8, 8]}, "8;9": {"type": "desert", "variant": 9, "pos": [8, 9]}, "8;10": {"type": "desert", "variant": 9, "pos": [8, 10]}, "9;10": {"type": "desert", "variant": 8, "pos": [9, 10]}, "9;9": {"type": "desert", "variant": 8, "pos": [9, 9]}, "9;8": {"type": "desert", "variant": 8, "pos": [9, 8]}, "9;7": {"type": "desert", "variant": 8, "pos": [9, 7]}, "9;6": {"type": "desert", "variant": 8, "pos": [9, 6]}, "9;5": {"type": "desert", "variant": 8, "pos": [9, 5]}, "9;4": {"type": "desert", "variant": 8, "pos": [9, 4]}, "9;3": {"type": "desert", "variant": 8, "pos": [9, 3]}}, "tile_size": 16, "waypoints": [[0, 10], [6, 10], [6, 7], [1, 7], [1, 2], [15, 2], [15, 5], [12, 5], [12, 11]]} \ No newline at end of file diff --git a/editor.py b/editor.py index 43c3e5a..462a572 100644 --- a/editor.py +++ b/editor.py @@ -18,7 +18,7 @@ class Editor(): self.manager = pgi.UIManager(self.screen.get_size(), "assets/theme/editor_theme.json") - self.map = 'test' + self.map = 'desert' self.path = 'assets/maps/' + str(self.map) + '.json' try: @@ -30,7 +30,8 @@ class Editor(): self.assets = { "base": load_images("/tiles/test"), - "jungle": load_images("/tiles/jungle") + "jungle": load_images("/tiles/jungle"), + "desert": load_images('/tiles/desert') } self.tile_list = list(self.assets) diff --git a/game/camera.py b/game/camera.py index 5cbc230..6d5a69e 100644 --- a/game/camera.py +++ b/game/camera.py @@ -2,7 +2,7 @@ import pygame as pg class Camera(): def __init__(self): - self.zoom = 1 + self.zoom = 2 self.offset = pg.math.Vector2(0, 0) def world_to_screen(self, pos): @@ -23,4 +23,15 @@ class Camera(): def change_zoom(self, amount): self.zoom += amount - self.zoom = max(0.5, min(self.zoom, 4.0)) \ No newline at end of file + self.zoom = max(0.5, min(self.zoom, 4.0)) + + + def zoom_offset(self, screen_pos, zoom_factor): + world_before = self.screen_to_world(screen_pos) + + self.change_zoom(zoom_factor) + + world_after = self.screen_to_world(screen_pos) + + self.offset.x += world_before[0] - world_after[0] + self.offset.y += world_before[1] - world_after[1] \ No newline at end of file diff --git a/game/enemy.py b/game/enemy.py index 311dfc8..49660fa 100644 --- a/game/enemy.py +++ b/game/enemy.py @@ -1,17 +1,18 @@ from game.util import * import pygame as pg +import math class Enemy(pg.sprite.Group): def __init__(self, game, speed, health): super().__init__() self.game = game self.waypoints = self.game.tilemap.waypoints - print(self.waypoints) self.speed = speed + self.angle = 0 self.health = health - self.image = self.game.assets['enemy'] + self.image = pg.transform.rotate(self.game.assets['enemy'].copy(), self.angle) self.rect = self.image.get_rect() self.pos = pg.Vector2( @@ -23,12 +24,16 @@ class Enemy(pg.sprite.Group): self.rect.center = self.pos def update(self): + self.move() + self.rotate() + + def move(self): if self.target_index >= len(self.waypoints): return tile_size = self.game.tilemap.tile_size - target = pg.Vector2( + self.target = pg.Vector2( tile_to_pixel( self.waypoints[self.target_index], tile_size, @@ -36,16 +41,22 @@ class Enemy(pg.sprite.Group): ) ) - direction = target - self.pos + direction = self.target - self.pos distance = direction.length() if distance <= self.speed: - self.pos = target + self.pos = self.target self.target_index += 1 else: direction = direction.normalize() self.pos += direction * self.speed + def rotate(self): + dist = self.target - self.pos + + self.angle = math.degrees(math.atan2(-dist[1], dist[0])) + self.image = pg.transform.rotate(self.game.assets['enemy'].copy(), self.angle) + self.rect = self.image.get_rect() self.rect.center = self.pos def render(self, surf, camera): diff --git a/game/game.py b/game/game.py index 24a07da..dade825 100644 --- a/game/game.py +++ b/game/game.py @@ -23,18 +23,15 @@ class Game: "assets/theme/theme.json" ) self.tilemap = Tilemap(self) - self.map = 'test' - self.path = 'assets/maps/' + str(self.map) + '.json' - try: - self.tilemap.load(self.path) - except FileNotFoundError: - print('File not Found') - print(self.tilemap.waypoints) self.assets={ "base": load_images('/tiles/test'), "jungle": load_images('/tiles/jungle'), - "enemy": load_image('/entities/enemies/sand_monster.png') + "desert": load_images('/tiles/desert'), + "enemy": load_image('/entities/enemies/enemy.png'), + "cannon": load_image('/entities/towers/cannon/shoot/0.png'), + "red_cannon": load_image('/entities/towers/cannon/red_cannon.png'), + "cannon/shoot": Animation(load_images('/entities/towers/cannon/shoot'), 10, False) } self.screens = { diff --git a/game/screens/game_play.py b/game/screens/game_play.py index f40085c..a4162d5 100644 --- a/game/screens/game_play.py +++ b/game/screens/game_play.py @@ -1,6 +1,7 @@ from game.screens.base_screen import BaseScreen from game.enemy import Enemy from game.camera import Camera +from game.tower import Tower, TowerGroup from game.util import * import pygame as pg import pygame_gui as pgi @@ -15,19 +16,99 @@ class GamePlay(BaseScreen): # self.map_surface = pg.surface.Surface((self.game_surface.get_width()/self.tile_multiplicator,self.game_surface.get_height()/self.tile_multiplicator)) self.camera = Camera() + self.center = (self.game_surface.get_width() /2, self.game_surface.get_height() /2) self.movment = [False, False, False, False] + self.selected = None + self.notunselect = True - self.map = 'test' + self.map = 'desert' self.path = 'assets/maps/' + str(self.map) + '.json' - self.enemy = Enemy(self.game, 0.5, 100) - try: self.game.tilemap.load(self.path) except FileNotFoundError: print('File not Found') + self.enemy_group = pg.sprite.Group() + self.tower_group = TowerGroup() + + self.enemy = Enemy(self.game, 0.5, 100) + + self.buy_button = pgi.elements.UIButton( + relative_rect=pg.Rect( + self.width - 200, + self.height -250, + 150, + 50 + ), + + text="Buy Tower", + manager=self.game.ui_manager + ) + self.cancel_button = pgi.elements.UIButton( + relative_rect=pg.Rect( + self.width - 200, + self.height -175, + 150, + 50 + ), + + text="Cancel", + manager=self.game.ui_manager + ) + self.buy_button.hide() + self.cancel_button.hide() + self.bought = False + self.elements = [ + self.buy_button, + self.cancel_button + ] + def process_event(self, event): + #calculate tile position from mouse position + self.mpos = pg.mouse.get_pos() + game_rect = self.game_surface.get_rect(topleft=(0, self.height / 6)) + + if game_rect.collidepoint(self.mpos): + local_mpos = ( + self.mpos[0] - game_rect.x, + self.mpos[1] - game_rect.y + ) + + world_pos = self.camera.screen_to_world(local_mpos) + self.tile_pos_decimal = pixel_to_tile(world_pos, self.game.tilemap.tile_size) + self.tile_pos = (int(self.tile_pos_decimal[0]), int(self.tile_pos_decimal[1])) + else: + self.tile_pos = None + + if event.type == pgi.UI_BUTTON_PRESSED: + if event.ui_element == self.buy_button: + self.bought = True + # self.tower = Tower(self.game, self.mpos, self.tile_pos, 'cannon') + if event.ui_element == self.cancel_button: + self.bought = False + + self.tile_pos = (int(self.tile_pos_decimal[0]), int(self.tile_pos_decimal[1])) + if event.type == pg.MOUSEBUTTONDOWN: + if self.tile_pos is not None: + if event.button == 1: + self.selected = self.select_turret(self.tile_pos) + self.clear_selection() + if self.selected is not None: + print(f'selected: {self.selected}') + self.selected.selected = True + print(f'{self.selected}') + if self.bought: + if self.game.tilemap.placeable(self.tile_pos): + if not any(tower.tile_pos == self.tile_pos for tower in self.tower_group): + tower = Tower(self.game, self.mpos, self.tile_pos, 'cannon', 40) + self.tower_group.add(tower) + self.bought = False + if event.button == 3: + for tower in self.tower_group: + if tower.tile_pos == self.tile_pos: + tower.kill() + if event.type == pg.KEYDOWN: if event.key == pg.K_a: self.movment[0] = True @@ -39,9 +120,9 @@ class GamePlay(BaseScreen): self.movment[3] = True if event.key == pg.K_q: - self.camera.change_zoom(-0.25) + self.camera.zoom_offset(self.center, -0.25) if event.key == pg.K_e: - self.camera.change_zoom(0.25) + self.camera.zoom_offset(self.center ,0.25) if event.type == pg.KEYUP: if event.key == pg.K_a: self.movment[0] = False @@ -54,6 +135,7 @@ class GamePlay(BaseScreen): def update(self, dt): self.enemy.update() + self.tower_group.update("sigma") self.camera.move((self.movment[1] - self.movment[0]) * 2, (self.movment[3] - self.movment[2]) * 2) @@ -64,7 +146,26 @@ class GamePlay(BaseScreen): self.game.tilemap.render_game(self.game_surface, self.camera) self.enemy.render(self.game_surface, self.camera) + self.tower_group.render(self.game_surface, self.camera) + + if self.bought: + if self.game.tilemap.placeable(self.tile_pos): + self.game_surface.blit(pg.transform.scale2x(self.game.assets["cannon"]), (self.mpos[0] - (self.game.tilemap.tile_size //2), self.mpos[1] - (self.game.tilemap.tile_size //2 + self.height/6))) + else: + self.game_surface.blit(pg.transform.scale2x(self.game.assets["red_cannon"]), (self.mpos[0] - (self.game.tilemap.tile_size //2), self.mpos[1] - (self.game.tilemap.tile_size //2 + self.height/6))) # self.game_surface.blit(pg.transform.scale(self.map_surface, self.game_surface.get_size())) - + surface.blit(self.game_surface, (0, self.height/6)) + + # if self.bought: + # self.game_surface.blit(pg.transform.scale2x(self.game.assets["cannon"]), (self.mpos[0] - (self.game.tilemap.tile_size //2), self.mpos[1] - (self.game.tilemap.tile_size //2))) + + def select_turret(self, tile_pos): + for tower in self.tower_group: + if (tile_pos[0], tile_pos[1]) == (tower.tile_pos[0], tower.tile_pos[1]): + return tower + + def clear_selection(self): + for tower in self.tower_group: + tower.selected = False \ No newline at end of file diff --git a/game/screens/main_menu.py b/game/screens/main_menu.py index 2831a04..ca36441 100644 --- a/game/screens/main_menu.py +++ b/game/screens/main_menu.py @@ -70,7 +70,6 @@ class MainMenu(BaseScreen): if event.type == pgi.UI_BUTTON_PRESSED: if event.ui_element == self.play_button: - # Zum Gameplay wechseln self.game.change_screen("game") diff --git a/game/tilemap.py b/game/tilemap.py index 59e510b..e1bd591 100644 --- a/game/tilemap.py +++ b/game/tilemap.py @@ -13,6 +13,8 @@ class Tilemap: self.offgrid_tiles = [] self.waypoints=[] + self.tower_placeable = [{"type": "desert", "variant": 0}] + def save(self, path): f = open(path, 'w') json.dump({'tilemap': self.tilemap, 'tile_size': self.tile_size, 'waypoints': self.waypoints}, f) @@ -27,6 +29,17 @@ class Tilemap: self.tile_size = map_data['tile_size'] self.waypoints = map_data['waypoints'] + def placeable(self, tile_pos): + str_tile_pos = f'{tile_pos[0]};{tile_pos[1]}' + if str_tile_pos not in self.tilemap: + return False + + tile = self.tilemap[str_tile_pos] + for ti in self.tower_placeable: + if tile['type'] == ti['type'] and tile['variant'] == ti['variant']: + return True + return False + def render(self, surf, offset=(0, 0)): for x in range(offset[0] // self.tile_size, (offset[0] + surf.get_width()) // self.tile_size + 1): for y in range(offset[1] // self.tile_size, (offset[1] + surf.get_height()) // self.tile_size + 1): diff --git a/game/tower.py b/game/tower.py new file mode 100644 index 0000000..3683740 --- /dev/null +++ b/game/tower.py @@ -0,0 +1,62 @@ +import pygame as pg +from game.util import * + +class Tower(pg.sprite.Sprite): + def __init__(self, game, pos, tile_pos, type, range, level=1): + super().__init__() + self.game = game + self.type = type + self.image = self.game.assets[type] + self.rect = self.image.get_rect() + self.rect.center = pos + + self.range = range + self.selected = False + + self.pos = pos + self.tile_pos = tile_pos + self.level = level + self.action = "" + self.set_action('shoot') + + def update(self, enemies): + self.animation.update() + + def set_action(self, action): + if action != self.action: + self.action = action + self.animation = self.game.assets[self.type + '/' + self.action].copy() + + def render(self, surf, camera): + screen_pos = camera.world_to_screen(pg.Vector2( + tile_to_pixel(self.tile_pos, self.game.tilemap.tile_size, True) + )) + + anim_img = self.animation.img() + scaled_image = pg.transform.scale( + anim_img, + ( + int(anim_img.get_width() * camera.zoom), + int(anim_img.get_height() * camera.zoom) + ) + ) + + rect = scaled_image.get_rect(center=screen_pos) + + if self.selected: + scaled_range = int(self.range * camera.zoom) + range_surf = pg.Surface((scaled_range * 2, scaled_range * 2), pg.SRCALPHA) + pg.draw.circle(range_surf, (200, 200, 200, 100), (scaled_range, scaled_range), scaled_range) + range_rect = range_surf.get_rect(center=screen_pos) + surf.blit(range_surf, range_rect) + + surf.blit(scaled_image, rect) + +class TowerGroup(pg.sprite.Group): + def render(self, surf, camera): + for tower in self.sprites(): + tower.render(surf, camera) + + def update(self, enemies): + for tower in self.sprites(): + tower.update(enemies) \ No newline at end of file diff --git a/game/util.py b/game/util.py index 73ce868..3c750f8 100644 --- a/game/util.py +++ b/game/util.py @@ -26,3 +26,31 @@ def tile_to_pixel(waypoint, tile_size, center=False): waypoint[0] * tile_size, waypoint[1] * tile_size ) + +def pixel_to_tile(waypoint, tile_size): + return ( + waypoint[0] / tile_size, + waypoint[1] / tile_size + ) + +class Animation: + def __init__(self, images, img_dur=5, loop=True): + self.images = images + self.loop = loop + self.img_duration = img_dur + self.done = False + self.frame = 0 + + def copy(self): + return Animation(self.images, self.img_duration, self.loop) + + def update(self): + if self.loop: + self.frame = (self.frame + 1) % (self.img_duration * len(self.images)) + else: + self.frame = min(self.frame + 1, self.img_duration * len(self.images)) + if self.frame >= self.img_duration * len(self.images) - 1: + self.done = True + + def img(self): + return self.images[int(self.frame / self.img_duration) - 1] \ No newline at end of file