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 に答える