From 099f8fb5654362fd28772a5775af5b19a2fcdcb6 Mon Sep 17 00:00:00 2001 From: Aleksandrs Karpovs Date: Thu, 28 Mar 2024 08:30:36 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?plagiats=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plagiats/projectile.py | 67 +++++++++++++++++++++++++++++++++++++++++ plagiats/projectiles.py | 50 ++++++++++++++++++++++++++++++ plagiats/settings.py | 32 ++++++++++++++++++++ plagiats/utils.py | 13 ++++++++ 4 files changed, 162 insertions(+) create mode 100644 plagiats/projectile.py create mode 100644 plagiats/projectiles.py create mode 100644 plagiats/settings.py create mode 100644 plagiats/utils.py diff --git a/plagiats/projectile.py b/plagiats/projectile.py new file mode 100644 index 0000000..7cc35b0 --- /dev/null +++ b/plagiats/projectile.py @@ -0,0 +1,67 @@ +import os +from pygame import image +import pygame +import pygame.transform + + +class Projectile: + UP = "up" + DOWN = "down" + LEFT = "left" + RIGHT = "right" + + def __init__(self, game, x, y, direction: str): + self.game = game + self.settings = self.game.settings + + self.x = x + self.y = y + self.direction = direction + + self.h, self.w = self.settings.projectile_size, self.settings.projectile_size + + self.image = image.load(os.path.join(self.settings.img_folder, "tanks", "explotions", "shot", self.direction + ".png")) + self.image = pygame.transform.scale(self.image, (self.settings.projectile_size, self.settings.projectile_size)) + + def move(self): + if self.direction == self.UP: + self.y -= self.settings.projectile_speed + elif self.direction == self.DOWN: + self.y += self.settings.projectile_speed + elif self.direction == self.LEFT: + self.x -= self.settings.projectile_speed + elif self.direction == self.RIGHT: + self.x += self.settings.projectile_speed + + def update(self): + self.move() + self.game.screen.blit(self.image, (self.x, self.y)) + + def change_coords_by_delta(self, dx=None, dy=None): + self.x = self.x - dx + self.y = self.y - dy + + def get_check_points(self): + result = None + if self.direction == self.UP: + result = ( + (self.x + 1, self.y), + (self.x + self.w - 1, self.y) + ) + elif self.direction == self.DOWN: + result = ( + (self.x + 1, self.y + self.h), + (self.x + self.w - 1, self.y + self.h) + ) + elif self.direction == self.LEFT: + result = ( + (self.x, self.y + 1), + (self.x, self.y + self.h - 1) + ) + elif self.direction == self.RIGHT: + result = ( + (self.x + self.w, self.y + 1), + (self.x + self.w, self.y + self.h - 1) + ) + + return result diff --git a/plagiats/projectiles.py b/plagiats/projectiles.py new file mode 100644 index 0000000..6f0a1d7 --- /dev/null +++ b/plagiats/projectiles.py @@ -0,0 +1,50 @@ +class Projectiles: + def __init__(self, game): + self.projectiles = [] + self.game = game + self.map = game.map + + def add(self, projectile): + self.projectiles.append(projectile) + + def update(self): + result = set() + for projectile in self.projectiles: + cp1, cp2 = projectile.get_check_points() + + for enemy in self.game.enemies: + r = enemy.get_rect() + if r.collidepoint(cp1) or r.collidepoint(cp2): + #Check if projectile collides enemy + self.game.enemies.remove(enemy) + self.remove(projectile) + self.game.score += 1 + break + + pr = self.game.player.get_rect() + if pr.collidepoint(cp1) or pr.collidepoint(cp2): + self.game.settings.running = False + + if self.map != None: + block1 = self.map.find_block_on_coords(cp1[0], cp1[1]) + block2 = self.map.find_block_on_coords(cp2[0], cp2[1]) + + if block1.projectile_passable and block2.projectile_passable: + projectile.update() + else: + try: + index = self.projectiles.index(projectile) + del self.projectiles[index] + del projectile + except: + pass + + return result + + def change_coords_by_delta(self, dx=None, dy=None): + for projectile in self.projectiles: + projectile.change_coords_by_delta(dx, dy) + + def remove(self, projectile): + self.projectiles.pop(self.projectiles.index(projectile)) + diff --git a/plagiats/settings.py b/plagiats/settings.py new file mode 100644 index 0000000..fc93298 --- /dev/null +++ b/plagiats/settings.py @@ -0,0 +1,32 @@ +import os +import sys +import pygame + +class GameSettings: + def __init__(self): + self.screen_height = 640 + self.screen_width = 1024 + self.c_x = self.screen_width // 2 + self.c_y = self.screen_height // 2 + self.fps = 30 + self.caption = "TankiOffline" + self.running = True + + self.path_separator = os.sep + self.img_folder = os.path.join(os.path.realpath(sys.argv[0]).rsplit(os.sep, 1)[0], 'sprites') + self.map_folder = os.path.join(os.path.realpath(sys.argv[0]).rsplit(os.sep, 1)[0], 'maps') + self.move_speed = 60 / self.fps + + self.block_size = 64 + self.entity_size = 60 + + self.projectile_size = 20 + self.projectile_speed = 240 / self.fps + self.recharge_time = 0.5 + + self.enemy_spawn_rev = 6000 / self.fps + self.enemy_spawn_rev_thresh = 30 + self.enemy_spawn_rev_delta = 0.001 + self.enemy_shot_rev = 1200 / self.fps + + diff --git a/plagiats/utils.py b/plagiats/utils.py new file mode 100644 index 0000000..140ed3b --- /dev/null +++ b/plagiats/utils.py @@ -0,0 +1,13 @@ +import pygame +from pygame import image, Surface + +def load_image(settings, image_path: str) -> Surface: + s = settings + i = image.load(image_path) + return pygame.transform.scale(i, (s.block_size, s.block_size)) + + +def load_entity_image(settings, image_path: str) -> Surface: + s = settings + i = image.load(image_path) + return pygame.transform.scale(i, (s.entity_size, s.entity_size)) \ No newline at end of file