微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在pygame中的精灵周围保持恒定的矩形?

如何解决如何在pygame中的精灵周围保持恒定的矩形?

对于一个计算机科学项目,我正在 pygame 中制作游戏。

我现在正在处理与马里奥精灵和那个方块的碰撞。然而,pygame 碰撞的工作原理是基于我所知道的两个矩形碰撞。您可以轻松地在块周围放置一个矩形,但马里奥精灵则完全不同。当您意识到要切换图像向左或向右、跳跃或诸如此类时,情况会变得更加复杂。

我试过在谷歌上查找这个问题,但没有一个答案奏效。我的 CSP 老师也说他不熟悉 pygame,很遗憾也帮不上忙。

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,(40,40))
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()
  if keys[pygame.K_LEFT] and vel < playerX:
    playerX = playerX - vel
    mario = pygame.transform.scale(playerimgflipped,50))

  if keys[pygame.K_RIGHT]:
    playerX+=vel
    mario = pygame.transform.scale(playerimg,50))

  if not(isJump):
    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))
    else:
      isJump = False
      jumpCount = 11
      if(playerY == 490):
        mario = pygame.transform.scale(playerimg,50))
  screen.blit(blockone,(blockoneX,blockoneY))
  screen.blit(mario,(playerX,playerY))
  pygame.display.update()

解决方法

然而 pygame 碰撞是基于两个矩形碰撞的

是的,但您不需要在精灵周围添加矩形。

使用pygame.Rect对象和colliderect()检测2个对象或2个图像的边界矩形之间的碰撞:

rect1 = pygame.Rect(x1,y1,w1,h1)
rect2 = pygame.Rect(x2,y2,w2,h2)
if rect1.colliderect(rect2):
    # [...]

如果您需要图像(pygame.Surface 个对象),则可以通过 get_rect() 获取边界矩形,其中 Surface 的位置必须由关键字参数,因为返回的矩形总是从 (0,0) 开始:

mario_rect = mario.get_rect(topleft = (playerX,playerY))
blockone_rect = blockone.get_rect(topleft = (blockoneX,blockoneY))
if mario_rect.colliderect(blockone_rect):
    print("hit")

另见:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。