衝突検出を停止しています。ここで、プレーヤーがブロックをクリッピングしないように、プレーヤーを移動する場所を見つける必要があります。衝突が検出されたら、プレーヤーを最も近いオープン スペースに移動したいと考えています。これを簡単に行う方法はありますか?重なり合う四角形を見つける必要があることはわかっていますが、その方法がわかりません。この記事について何か情報があればお願いします!
質問する
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 に答える