你如何在 pygame 平台游戏中进行碰撞物理?

问题描述

我正在 pygame 中为学校项目开发平台游戏。 这是指向我的 repl.it链接以供参考。

就碰撞而言,我们只是在每次 mario 接触块时在控制台中打印“hit”。继续前进,我不知道我应该如何进行碰撞或物理将如何工作。任何形式的帮助将不胜感激。

import pygame
pygame.init()

#set the background
screen = pygame.display.set_mode((1600,800))
clock = pygame.time.Clock()
FPS = 45
vel = 3.5
BLACK = (0,0)
back = pygame.image.load('background.png')
background = pygame.transform.scale(back,(800,600))
playerimg = pygame.image.load('mariosprite.png').convert_alpha()
#playerimgflipped = pygame.image.load('normalmarioflipped.png')
#playerimgjump = pygame.image.load('finishedjumpingmario.png')
blockonelol = pygame.image.load('oneblock.png')

blockoneX = 100
blockoneY = 415
blockone = pygame.transform.scale(blockonelol,(36,36))
mario = pygame.transform.scale(playerimg,(35,50))
playerX = 10
playerY = 490

isJump = False
jumpCount = 11
run = True
while run:
  clock.tick(FPS)
  screen.fill(BLACK)
  screen.blit(background,(0,0))
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      run = False
  keys = pygame.key.get_pressed()
  mario_rect = mario.get_rect(topleft = (playerX,playerY))
  blockone_rect = blockone.get_rect(topleft = (blockoneX,blockoneY))
  condition = mario_rect.colliderect(blockone_rect)
  if keys[pygame.K_LEFT] and vel < playerX:
    playerX = playerX - vel
    #mario = pygame.transform.scale(playerimgflipped,50))


  if mario_rect.bottom+10 <=blockone_rect.top:
    print('standing')
  if keys[pygame.K_RIGHT] and condition == False:
    playerX+=vel
    mario = pygame.transform.scale(playerimg,50))

  if not(isJump) and condition == False:
    if keys[pygame.K_UP]:
      isJump = True
      if(playerY == 490):
        mario = pygame.transform.scale(playerimg,50))
  else:
    #mario = pygame.transform.scale(playerimgjump,(45,55))
    if jumpCount >= -11:
      goingdown = 1
      if jumpCount < 0:
        goingdown = -1
      playerY -= (jumpCount ** 2) * 0.25 * goingdown
      jumpCount = jumpCount - 1
      if(playerY == 490):
        mario = pygame.transform.scale(playerimg,50))
    elif condition == True:
      jumpCount = 0
    else:
      isJump = False
      jumpCount = 11
      if(playerY == 490):
        mario = pygame.transform.scale(playerimg,50))
  
  if mario_rect.colliderect(blockone_rect):
    print("hit")
  screen.blit(blockone,(blockoneX,blockoneY))
  screen.blit(mario,(playerX,playerY))
  pygame.display.update()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)