出于某种原因,当我从右侧或左侧碰撞瓷砖时,我会被传送到瓷砖的顶部。我怎样才能解决这个问题?
For some reason when i collide the tile from right or left i get teleported to the top of the tile. how can i fix this?
这是我的碰撞代码。我做了一个 temp_rect 因为在与地面相撞后它开始四处传送。它工作正常,但是当我与 left/right 的瓷砖相撞时,它会传送到顶部
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
首先测试沿 x 轴的碰撞。如果检测到碰撞,则会更正矩形的位置。因此,您必须再次设置 rect_temp
,在沿 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
这是我的碰撞代码。我做了一个 temp_rect 因为在与地面相撞后它开始四处传送。它工作正常,但是当我与 left/right 的瓷砖相撞时,它会传送到顶部
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
首先测试沿 x 轴的碰撞。如果检测到碰撞,则会更正矩形的位置。因此,您必须再次设置 rect_temp
,在沿 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