我已经关闭了碰撞检测。现在,我需要找到移动玩家的位置,这样他就不会剪裁任何块。一旦我有了碰撞检测,我想将玩家移动到最近的空地。有没有办法轻松做到这一点?我知道我需要找到重叠的矩形,但我不知道该怎么做。如果您对这篇文章有任何信息,请!
问问题
244 次
2 回答
1
一种非常常见的方法是尝试将玩家移动到一个位置,然后查看他是否真的与任何东西发生碰撞。如果他不是,请移到那里,否则,请尝试另一个位置。在伪代码中:
temp_pos = player.pos + (-1, -1) #move downleft one block
if player.pos != enemy.pos: #if the position is not occupied
player.pos = temp_pos # move the player there.
else:
#move player to another location and try again
不过,基本上,我会有一个列表来关闭播放器周围的所有空间(或可用方向),然后循环遍历它,而不是手动对所有方向进行硬编码。
于 2012-08-17T16:22:36.803 回答
0
我想要的是它的碰撞矩形。此代码中的 P3。然后,我可以找出最接近碰撞的一侧并相应地移动玩家。
def collide(self,p1, p2):
p3=pygame.Rect()
if p1.colliderect(p2):
negpos=[0,0]
dx=p1.x-p2.x
dy=p1.y-p2.y
if dx==abs(dx): negpos[0]=-1
else: negpos[0]=1
if dy==abs(dy): negpos[1]=-1
else: negpos[1]=1
if negpos==[-1,-1]:
#topleft, bottomright
p3tlx=p2.x
p3tly=p2.y
p3brx=p1.x+p1.w
p3bry=p1.y+p1.h
elif negpos==[-1,1]:
# topright, bottomleft
p3blx=p2.x
p3bly=p2.x+p2.h
p3trx=p1.x+p1.w
p3try=p1.y
elif negpos==[1,1]:
# topleft, bottomright
p3tlx=p1.x
p3tly=pl.y
p3brx=p2.x+p2.w
p3bry=p2.y+p2.h
elif negpos==[1,-1]:
#topright, bottomleft
p3trx=p2.x+p2.w
p3try=p2.y
p3blx=p1.x
p3bly=p1.y-p1.h
if p3trx:
p3 = pygame.Rect(p3blx,p3try,abs(p3trx-p3blx),abs(p3try-p3bly))
else:
p3 = pygame.Rect(p3tlx,p3tly,abs(p3tlx-p3brx),abs(p3tly-p3bry))
于 2012-08-17T17:57:06.333 回答