По какой-то причине, когда я сталкиваюсь с плиткой справа или слева, я телепортируюсь на верхнюю часть плитки. как я могу это исправить?

#python #pygame

Вопрос:

Это мой код столкновения. я сделал ошибку temp_rect, потому что после столкновения с землей он начал телепортироваться. это работает нормально, но когда я сталкиваюсь с плиткой слева/справа, она телепортируется наверх

 def collision_test(rect,tiles):
    hit_list=[]
    for tile in tiles:
        if rect.colliderect(tile):
            hit_list.append(tile)
    return hit_list
def collision_move(rect,movement,tiles):
    collision_types={"Top":False,"Bottom":False,"Left":False,"Right":False}
    rect_temp=pygame.Rect(rect.x,rect.y,atom.width,atom.height-1)
    rect_temp.x =movement[0]
    hit_list=collision_test(rect_temp,tiles)
    for tile in hit_list:
        if movement[0]>0:
            rect.right=tile.left
            collision_types["Right"]=True
        elif movement[0]<0:
            rect.left=tile.right
            collision_types["Left"]=True
    rect_temp.y =movement[1]
    hit_list=collision_test(rect_temp,tiles)
    for tile in hit_list:
        if movement[1]>0:
            rect.bottom=tile.top
            collision_types["Bottom"]=True
        elif movement[1]<0:
            rect.top=tile.bottom
            collision_types["Top"]=True
    return rect,collision_types
 

Комментарии:

1. Что такое movement ?

2. @user16038533 он ускоряется 2 на 2, пока не достигнет 6 в зависимости от направления, и когда он перестает двигаться, он снижается на 2 на 2 в зависимости от направления, пока не достигнет 0

Ответ №1:

Сначала вы проверяете столкновение вдоль оси x. При обнаружении столкновения положение прямоугольника корректируется. Поэтому вам нужно снова установить rect_temp значение a после обработки столкновений по оси x и перед обработкой столкновений по оси y:

 def collision_move(rect,movement,tiles):
    collision_types={"Top":False,"Bottom":False,"Left":False,"Right":False}
    
    rect_temp=pygame.Rect(rect.x,rect.y,atom.width,atom.height-1)
    rect_temp.x =movement[0]
    
    hit_list=collision_test(rect_temp,tiles)
    for tile in hit_list:
        if movement[0]>0:
            rect.right=tile.left
            collision_types["Right"]=True
        elif movement[0]<0:
            rect.left=tile.right
            collision_types["Left"]=True
    
    rect_temp=pygame.Rect(rect.x,rect.y,atom.width,atom.height-1) # <- this is missing
    rect_temp.y =movement[1]
   
    hit_list=collision_test(rect_temp,tiles)
    for tile in hit_list:
        if movement[1]>0:
            rect.bottom=tile.top
            collision_types["Bottom"]=True
        elif movement[1]<0:
            rect.top=tile.bottom
            collision_types["Top"]=True
    return rect,collision_types