現在、私はこのスクリプトをよりうまく実装する方法を理解しようと30分ほどかかりました。私はいくつかの方法を試みましたが、うまく機能しませんでした。 スクリプトを実行しているときに、プレーヤーはちょっと違和感を覚えます。プレーヤーは、接触したときにのみブロック内を移動することができます。壁のpygame衝突検出
x = 64*3
y = 0
xvel = 0
yvel = 0
grounded = True
playerRect = pygame.Rect ((x, y, 64, 64))
collidelist = []
level = ["#=======##=========================",
"#=======#==========================",
"#==###############=========###=====",
"#===============#####==============",
"#==================================",
"###################################"]
def makelevel (level):
x = y = 0
def checkline (line, x, y):
for character in line:
if character == "#":
block = pygame.draw.rect (screen, (50, 50, 255), (x * 64, y * 64, 64, 64))
collidelist.append (block)
x += 1
for line in level:
checkline (line, x, y)
y += 1
def move (xvel, yvel):
global x
global y
global playerRect
global collideList
x += xvel
y += yvel
for block in collidelist:
if playerRect.colliderect(block):
x += -xvel * 2
y += -yvel * 2
break
makelevel (level)
while True:
screen.fill ([0, 0, 0])
makelevel (level)
playerRect = pygame.Rect ((x, y, 64, 64))
pygame.draw.rect (screen, (255, 255, 255), playerRect)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
exit()
pressed = pygame.key.get_pressed()
if pressed [pygame.K_RIGHT]:
move (5, 0)
if pressed [pygame.K_LEFT]:
move (-5, 0)
if pressed [pygame.K_UP]:
move (0, -5)
if pressed [pygame.K_DOWN]:
move (0, 5)
pygame.display.update()
青いブロックは壁であると思われます。壁の衝突を検出して処理する最も簡単な方法は、最初にx軸に沿ってrectを移動させ、壁のrectと衝突しているかどうかを確認し、 'playerRect.right'を' block.left'に設定します。方向。次に、y軸で同じことを行い、衝突した場合は 'playerRect.bottom'を' block.top'に設定します。それは、あなたが 'collidelist'を二度反復しなければならないことを意味します。 – skrx
私はそれがうまくいかず、あるいは多分何かが間違ってしまったのではないかと心配しています。 –
多分私は何か間違ったことをしましたか? 'X + =ブロックのxvel collidelistで: playerRect.colliderect(ブロック)場合: playerDirection場合== "右": playerRect.left: playerRect.right = block.left playerDirection == "左" であればcollidelistに= block.right Yブロックの+ = yvel : playerRect.colliderect(ブロック)場合: playerDirection == "UP" の場合: playerRect.top = block.bottom playerDirectionが== "DOWN" の場合: playerRect.bottom = block.top' –