#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