问题描述
对于一个计算机科学项目,我正在 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")
另见: