Игрок не будет стрелять, находясь в левой части экранаPython

Программы на Python
Anonymous
Игрок не будет стрелять, находясь в левой части экрана

Сообщение Anonymous »


Когда игрок находится в левой части экрана (коснитесь левой стороны), он по какой-то причине не стреляет

Вот мой код, может кто-нибудь помочь мне с этим, я тоже не закончил с кодом, но эта часть меня бесит, и эти изображения пока просто заполнители, я поменяю их, когда все сделаю:
>
Вот мои изображения, если они вам нужны, я не знаю, что попробовать, поскольку на остальных трех сторонах этого не происходит:

введите здесь описание изображения введите сюда описание изображения

введите здесь описание изображения введите сюда описание изображения

введите здесь описание изображения
импортировать pygame импортировать ОС импорт математики импортировать случайный pygame.init() ШИРИНА, ВЫСОТА = 550, 550 ОКНО = pygame.display.set_mode((ШИРИНА, ВЫСОТА)) pygame.display.set_caption("Лучший стрелок") BG = pygame.transform.scale(pygame.image.load(os.path.join("images", "bg.png")), (ШИРИНА, ВЫСОТА)) PLAYER_IMG = pygame.transform.scale(pygame.image.load(os.path.join("images", "player.png")), (50,50)) # BULLET = pygame.transform.scale(pygame.image.load(os.path.join("images", "bullet.png")), (40, 50)) BULLET = pygame.transform.scale(pygame.image.load(os.path.join("images", "bullet1.png")), (10,10)) ЗОМБИ1 = pygame.transform.scale(pygame.image.load(os.path.join("images", "zombie_small.png")), (50,50)) BULLET_SPEED = 10 защита столкновений (obj1, obj2): offset_x = obj2.x - obj1.x смещение_y = obj2.y - obj1.y return obj1.mask.overlap(obj2.mask, (offset_x, offset_y)) != Нет Класс Пуля: def __init__(self, x, y, mouse_x, mouse_y, player_angle): self.x = x self.y = y self.player_angle = player_angle self.mouse_x = mouse_x self.mouse_y = mouse_y self.img = ПУЛЯ self.speed = BULLET_SPEED self.mask = pygame.mask.from_surface(self.img) self.angle = math.atan2(self.y - self.mouse_y, self.x - self.mouse_x) self.x_vel = math.cos(self.angle) * self.speed self.y_vel = math.sin(self.angle) * self.speed def draw(сам, окно): self.rotate = pygame.transform.rotate(self.img, math.grades(self.angle) + self.player_angle) # позиция пули window.blit(self.rotate, (self.x + 20, self.y + 20)) self.mask = pygame.mask.from_surface(self.rotate, 180) Защитный ход (сам): self.x -= int(self.x_vel) self.y -= int(self.y_vel) pygame.draw.circle(ОКНО, (0,0,0), (self.x, self.y), 5) Def Collision(self, obj): вернуть столкновение (я, объект) класс Player(pygame.sprite.Sprite): def __init__(self, x, y, health = 100): self.x = x self.y = y self.img = PLAYER_IMG self.health = здоровье self.max_health = здоровье self.mask = pygame.mask.from_surface(self.img) self.bullet_hold = [] self.angle = 0 self.vel = 5 self.max_bullet = 1 def draw(сам, окно): # для расчета угла между мышью и игроком mouse_x, mouse_y = pygame.mouse.get_pos() # self.angle, чтобы игрок начал смотреть вверх угол = math.grades(math.atan2(mouse_y - self.y, mouse_x - self.x)) - self.angle # все для вращения игрока по # -угол предназначен для обеспечения направления вращения # если "-" нет, то он будет инвертирован self.rotate = pygame.transform.rotate(self.img, -angle) # это чтобы заставить игрока вращаться вокруг созданного прямоугольника self.rect = self.rotate.get_rect(center = (self.x + self.get_width()/2, self.y + self.get_height()/2)) window.blit(self.rotate, self.rect.topleft) # 180 - заставить игрока повернуться на 180 лицом к мыши # также убедитесь, что игрок, вращающийся назад, не облажается self.mask = pygame.mask.from_surface(self.rotate, 180) для пули в self.bullet_hold[:]: пуля.draw(окно) self.healthbar(окно) def healthbar(self,window): #теряю здоровье pygame.draw.rect(окно, (0,0,0), (self.x, self.y + self.img.get_height() + 10, self.img.get_width(), 10)) # полное здоровье и оставшееся здоровье pygame.draw.rect(window, (255,0,0), (self.x, self.y + self.img.get_height() + 10, self.img.get_width() * (self.health / self. max_health), 10)) # создаем пулю защита стрелять (сам): если len(self.bullet_hold) < self.max_bullet: пуля = Пуля(self.x, self.y, *pygame.mouse.get_pos(), self.angle) self.bullet_hold.append(пуля) # движение пули защита move_bullet (сам): для пули в self.bullet_hold: пуля.переместить() если пуля.y > ВЫСОТА или пуля.y < 0 или пуля.х > ШИРИНА или пуля.х < 0: self.bullet_hold.remove(пуля) Защитный ход (сам): ключи = pygame.key.get_pressed() если ключи[pygame.K_a] и self.x — self.vel + 15 > 0: self.x -= self.vel ifkeys[pygame.K_d] и self.x + self.vel + self.get_width() - 15 < ШИРИНА: self.x += self.vel если ключи[pygame.K_w] и self.y — self.vel + 10 > 0: self.y -= self.vel ifkeys[pygame.K_s] и self.y + self.vel + self.get_height() - 10 < ВЫСОТА: self.y += self.vel если ключи[pygame.K_SPACE]: self.shoot() защита get_width (сам): вернуть self.img.get_width() защита get_height (сам): вернуть self.img.get_height() Класс Зомби: def __init__(self, x, y, health = 20): self.x = x self.y = y self.img = ЗОМБИ1 self.mask = pygame.mask.from_surface(self.img) self.health = здоровье def move_at_player(self, player_x, player_y, vel): # atan2 дает угол между двумя точками # это определение направления # зомби игроку # используйте atan2, потому что он принимает 2 параметра (x,y) # и возвращаем касательную (предпочтительнее atan2) # обычный atan принимает только один параметр и возвращает результат # арктан отношения y/x угол = math.atan2(player_y - self.y, player_x - self.x) # cos задает горизонтальное направление self.x += int(vel * math.cos(угол)) # грех дает вертикальное направление self.y += int(vel * math.sin(угол)) def move(self, player_x, player_y, vel): self.move_at_player(player_x, player_y, vel) def draw(сам, окно): Rotat_image = pygame.transform.rotate(self.img, 0) window.blit(self.img, (self.x, self.y)) self.mask = pygame.mask.from_surface(rotated_image, 0) Def Collision(self, obj): вернуть столкновение (я, объект) защита основной(): ФПС = 60 часы = pygame.time.Clock() round_font = pygame.font.SysFont("comicsans", 50) text_font = pygame.font.SysFont("comicsans", 25) запустить = Истина зомби = [] зомби_скорость = 2 round_count = 5 round_num = 0 Убийств = 0 num_zombie = 5 игрок = Игрок(ШИРИНА/2 – 25, ВЫСОТА/2) защита draw_window(): ОКНО.blit(БГ, (0,0)) kills_label = text_font.render(f"Убийства: {Убийства}", 1, (255 255 255)) ОКНО.blit(kills_label, (10,10)) для зомби в зомби: зомби.draw(ОКНО) player.draw(ОКНО) pygame.display.update() во время запуска: часы.тик(FPS) draw_window() если len(зомби) == 0: round_num += 1 num_zombie = 5 * round_num для меня в диапазоне (num_zombie): сторона = случайный.выбор(["слева", "справа", "сверху", "снизу"]) если сторона == "слева": x = случайный.randrange(-100, -50) y = random.randrange(0, ВЫСОТА) сторона элиф == "право": x = случайный.randrange(ШИРИНА + 50, ШИРИНА + 100) y = random.randrange(0, ВЫСОТА) сторона элиф == "верх": x = случайный.randrange(0, ШИРИНА) y = случайный.randrange(-100, -50) сторона элиф == "низ": x = случайный.randrange(0, ШИРИНА) y = random.randrange(ВЫСОТА + 50, ВЫСОТА + 100) зомби = Зомби(x, y) зомби.append(зомби) для события в pygame.event.get(): если event.type == pygame.QUIT: покидать() player.move() # должно быть это, чтобы иметь возможность перемещать пулю # иначе пуля застрянет player.move_bullet() для зомби в зомби: зомби.move(player.x, player.y, зомби_скорость) если столкнутся (игрок, зомби): player.health -= 10 зомби.remove(зомби) для пули в player.bullet_hold: для зомби в зомби: если пуля.столкновение(зомби): player.bullet_hold.remove(пуля) зомби.здоровье -= 3 если зомби.здоровье

Вернуться в «Python»