Горизонтальное столкновение не работает должным образом [дубликат]Python

Программы на Python
Гость
Горизонтальное столкновение не работает должным образом [дубликат]

Сообщение Гость »


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

#Импортированы необходимые библиотеки импортировать ОС импортировать случайный импорт математики импортировать pygame из каталога импорта ОС из os.path импортировать isfile, присоединиться #Инициализирует необходимые функции pygame pygame.init() pygame.display.set_caption("Геймплей") БГ_ЦВЕТ = (255, 255, 255) ширина, высота = 1920, 1080 ФПС = 60 #Скорость перемещения спрайта PLAYER_VEL = 10 окно = pygame.display.set_mode((ширина, высота)) #Function задает, как будет выглядеть блок (в данном случае платформа). защита load_block (размер): ЦВЕТ = (0, 0, 0) поверхность = pygame.Surface((размер, размер), pygame.SRCALPHA, 32) rect = pygame.Rect(96, 0, размер, размер) поверхность.fill(ЦВЕТ, прямоугольник) вернуть pygame.transform.scale2x(поверхность) #рисуем объект и игрока в окне def draw(игрок, объекты, победа, offset_x): win.fill(BG_COLOR) # Очистить окно # Нарисуйте спрайт игрока в его текущей позиции, учитывая смещение win.blit(player.sprite, (player.rect.x - offset_x, player.rect.y)) # Нарисуйте каждый объект в списке объектов, регулируя их положение… # …относительно смещения. для объекта в объектах: obj.draw(выигрыш, offset_x) pygame.display.update() #function занимается столкновениями с платформами и потолком. defвертикальный_collision (игрок, объекты, dy): столкновение_объектов = [] для obj в объектах: # спрайт всех возможных объектов может столкнуться if pygame.sprite.collide_rect(player, obj): # Проверка коллизий если dy > 0: player.rect.bottom = obj.rect.top player.landed() else: #################ЭТО ВЫЗЫВАЕТ КРОВАВУЮ ПРОБЛЕМУ player.rect.top = obj.rect.bottom player.hit_head() collided_objects.append(obj) вернуть столкновенные_объекты #обрабатывает горизонтальные столкновения Def Collide(игрок,объекты,dx): player.move(dx,0) #проверяет, движется ли спрайт вправо player.update() #вызывает обновление для обновления прямоугольника столкновение_объекта = Нет для объекта в объектах: если pygame.sprite.collide_mask(player,obj): столкнувшийся_объект = объект перерыв player.move(-dx,0) player.update() вернуть столкновенный_объект #класс создан для разработки шаблона того, как будет выглядеть спрайт и как он будет работать класс Player(pygame.sprite.Sprite): #устанавливает цвет спрайта ЦВЕТ = (0, 0, 0) #устанавливает скорость падения спрайта ГРАВИТАЦИЯ = 1 #инициализирует def __init__(self, x, y, ширина, высота): супер().__init__() self.sprite = pygame.Surface((ширина, высота)) self.sprite.fill(self.COLOUR) self.rect = self.sprite.get_rect(topleft=(x, y)) self.x_vel = 0 self.y_vel = 0 self.direction = "right" # Установить начальное направление self.animation_count = 0 self.fall_count = 0 self.jump_count = 0 #объявляет счетчик прыжков. Защитный прыжок (сам): self.y_vel = -self.GRAVITY*8 #При прыжке спрайт подпрыгнет в воздух. self.animation_count=0 self.jump_count += 1 если self.jump_count==1: self.count=0 #Как только спрайт подпрыгнет, гравитация исчезнет. #then повторно применяет гравитацию, когда спрайт падает/приземляется. #движение def move(self, dx, dy): self.rect.x += dx self.rect.y += dy #движение влево защита move_left(self, vel): self.x_vel = -vel self.direction = "left" # Обновить направление self.animation_count = 0 #движение в правильном направлении защита move_right(self, vel): self.x_vel = уровень self.direction = "right" # Обновить направление self.animation_count = 0 #сохраняет движение в цикле цикл def (сам, fps): self.y_vel += min(1, (self.fall_count / fps) * self.GRAVITY) self.move(self.x_vel, self.y_vel) self.fall_count += 1 #функция, позволяющая определить, приземлился ли спрайт на платформу защита приземлилась (сам): self.fall_count=0 self.y_vel=0 self.jump_count=0 #функция, позволяющая определить, столкнулся ли спрайт с потолком защита hit_head (сам): self.count=0 self.y_vel*=-1 защита update_sprite (сам): sprite_sheet = "бездействующий" #jump анимация, напишу позже если self.y_vel != 0: если self.jump_count == 1: sprite_sheet = "прыжок" элиф self.jump_count==2: sprite_sheet = "двойной_прыжок" элиф self.y_vel> self.GRAVITY*2: sprite_sheet = "падение" элиф self.x_vel != 0: sprite_sheet = "запустить" если self.x_vel != 0: sprite_sheet = "запустить" sprite_sheet_name = sprite_sheet + "_" + self.direction спрайты = self.SPRITES[sprite_sheet_name] sprite_index = (self.animation_count // self. ANIMATION_DELAY) % len(спрайты) self.sprite = спрайты[sprite_index] self.animation_count += 1 self.update() обновление защиты (сам): self.rect = self.sprite.get_rect(topleft=(self.rect.x, self.rect.y)) self.mask = pygame.mask.from_surface(self.sprite) Объект класса (pygame.sprite.Sprite): def __init__(self, x, y, ширина, высота, имя = нет): супер().__init__() self.rect = pygame.Rect(x, y, ширина, высота) self.image = pygame.Surface((ширина, высота)) self.image.fill(self.COLOUR) self.width = ширина self.height = высота self.name = имя def draw(self, win, offset_x): win.blit(self.image, (self.rect.x - offset_x, self.rect.y)) Блок класса (Объект): ЦВЕТ = (0, 0, 0) def __init__(self, x, y, size): super().__init__(x, y, размер, размер) блок = load_block (размер) self.image.blit(блок, (0, 0)) self.mask = pygame.mask.from_surface(self.image) #Function адресует любые клавиши, нажатые для перемещения спрайта def move(игрок, объекты): ключи = pygame.key.get_pressed() player.x_vel = 0 #обработка горизонтального столкновения collide_left = столкновение(игрок,объекты,-PLAYER_VEL) collide_right = столкновение(игрок,объекты,PLAYER_VEL) #только позволяет спрайту двигаться, если рядом с ним нет блока если ключи[pygame.K_d] и не столкновение_право: player.move_right(PLAYER_VEL) если ключи[pygame.K_a] и не столкновение_слефт: player.move_left(PLAYER_VEL) Ключ #up здесь удален, это объясняется далее в коде. #вызывает функцию вертикального столкновения вертикальное_столкновение(игрок,объекты,player.y_vel) защита геймплея (окно): часы = pygame.time.Clock() размер_блока = 96 player = Игрок (400, 800, 25, 50) блоки = [Блок (0, высота - размер_блока, размер_блока)] #заполняет нижнюю часть экрана платформами. пол = [Блок (i * размер_блока, высота - размер_блока, размер_блока) для i в диапазоне (-width // размер_блока, ширина * 2 // размер_блока)] #используется для отслеживания того, насколько игрок переместился по горизонтали относительно окна. смещение_х = 0 #когда спрайт достигает x количества пикселей в любом направлении, игра начинает прокручиваться. прокрутка_области_ширины = 200 #создание блока над платформой объекты = [*этаж, Блок(0,высота - размер_блока*4, размер_блока)] запустить = Истина во время запуска: часы.тик(FPS) # Обработка событий для события в pygame.event.get(): если event.type == pygame.QUIT: запустить = Ложь перерыв если event.type == pygame.KEYDOWN: если event.key == pygame.K_w и player.jump_count < 2: игрок.прыжок() # Обновить игрока и объекты player.loop(FPS) переместить (игрок, объекты) # Проверьте, достиг ли игрок области прокрутки, и соответствующим образом обновите смещение if ((player.rect.right - offset_x >= width -scroll_area_width) и player.x_vel > 0) \ или ((player.rect.left - offset_x в self.image, но я не уверен, соответствует ли это моей проблеме.

Буду очень признателен за любую помощь, и для контекста это игра-платформер, которую я пытаюсь написать и которая является частью школьной курсовой работы, которую мне предстоит выполнить.

Заранее спасибо.

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