1

我已经关闭了碰撞检测。现在,我需要找到移动玩家的位置,这样他就不会剪裁任何块。一旦我有了碰撞检测,我想将玩家移动到最近的空地。有没有办法轻松做到这一点?我知道我需要找到重叠的矩形,但我不知道该怎么做。如果您对这篇文章有任何信息,请!

4

2 回答 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 回答