我想知道如何在 pygame 中进行碰撞检测。我的游戏不使用精灵,它只传送 2 个图像。我该如何检查它们是否发生碰撞?我知道有 sprite.collide,但它不使用精灵。有没有办法通过比较每个图像的 x 和 y 值来检查碰撞?
def fish(x,y): gameDisplay.blit(fishImg,(x,y)) def enemy(enemyX,enemyY): gameDisplay.blit(enemyImg,(enemyX,enemyY)) def main(): x = displayWidth/2 y = displayHeight/2 enemyX = random.randint(0,displayWidth) enemyY = random.randint(0,displayHeight) xChange = 0 yChange = 0 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: xChange = -5 elif event.key == pygame.K_d: xChange = 5 elif event.key == pygame.K_w: yChange = -5 elif event.key == pygame.K_s: yChange = 5 if event.type == pygame.KEYUP: if event.key == pygame.K_a or event.key == pygame.K_d: xChange = 0 elif event.key == pygame.K_w or event.key == pygame.K_s: yChange = 0 x += xChange y += yChange gameDisplay.fill(red) fish(x,y) enemy(enemyX,enemyY) if pygame.display.update() clock.tick(30) main() pygame.quit() quit()
在 Pygame 中进行碰撞检测时,即使没有使用精灵,您依然可以通过比较两个图像的矩形边界来检测它们是否发生了碰撞。Pygame 提供了 Rect 类来帮助进行矩形碰撞检测,可以用来包围图像并检查它们之间的重叠。
Rect
(x, y)
pygame.Rect
colliderect
import pygame import random # 初始化 Pygame pygame.init() # 设置屏幕尺寸 displayWidth = 800 displayHeight = 600 gameDisplay = pygame.display.set_mode((displayWidth, displayHeight)) pygame.display.set_caption('Collision Detection Game') # 颜色定义 red = (255, 0, 0) green = (0, 255, 0) # 加载图像 fishImg = pygame.image.load('fish.png') # 假设你有一个鱼的图像 enemyImg = pygame.image.load('enemy.png') # 假设你有一个敌人的图像 # 获取图像的矩形区域 fish_rect = fishImg.get_rect() enemy_rect = enemyImg.get_rect() # 游戏时钟 clock = pygame.time.Clock() # 绘制鱼 def fish(x, y): fish_rect.topleft = (x, y) # 更新鱼的位置 gameDisplay.blit(fishImg, (x, y)) # 绘制敌人 def enemy(enemyX, enemyY): enemy_rect.topleft = (enemyX, enemyY) # 更新敌人位置 gameDisplay.blit(enemyImg, (enemyX, enemyY)) # 主循环 def main(): x = displayWidth / 2 y = displayHeight / 2 enemyX = random.randint(0, displayWidth - enemy_rect.width) enemyY = random.randint(0, displayHeight - enemy_rect.height) xChange = 0 yChange = 0 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_a: xChange = -5 elif event.key == pygame.K_d: xChange = 5 elif event.key == pygame.K_w: yChange = -5 elif event.key == pygame.K_s: yChange = 5 if event.type == pygame.KEYUP: if event.key == pygame.K_a or event.key == pygame.K_d: xChange = 0 elif event.key == pygame.K_w or event.key == pygame.K_s: yChange = 0 # 更新位置 x += xChange y += yChange # 填充背景 gameDisplay.fill(red) # 绘制鱼和敌人 fish(x, y) enemy(enemyX, enemyY) # 碰撞检测 if fish_rect.colliderect(enemy_rect): # 检查鱼和敌人是否碰撞 print("碰撞发生!") break # 如果碰撞发生,退出循环 pygame.display.update() # 更新屏幕 clock.tick(30) # 控制游戏帧率 # 启动游戏 main() pygame.quit() quit()
fish_rect = fishImg.get_rect() 和 enemy_rect = enemyImg.get_rect():这两行代码创建了 fishImg 和 enemyImg 图像的 Rect 对象。Rect 对象是一个矩形区域,包含了图像的位置和大小。get_rect() 方法会返回一个矩形,您可以将其用于碰撞检测。
fish_rect = fishImg.get_rect()
enemy_rect = enemyImg.get_rect()
fishImg
enemyImg
get_rect()
fish_rect.colliderect(enemy_rect):这是碰撞检测的核心。colliderect 方法检查两个矩形是否发生重叠,如果有交集,返回 True,否则返回 False。
fish_rect.colliderect(enemy_rect)
True
False
fish_rect.topleft = (x, y) 和 enemy_rect.topleft = (enemyX, enemyY):这些代码更新了鱼和敌人图像的位置,将矩形的 topleft 坐标设置为新的 (x, y) 值。
fish_rect.topleft = (x, y)
enemy_rect.topleft = (enemyX, enemyY)
topleft
pygame.display.update():每次更新屏幕,确保显示更新后的图像。
pygame.display.update()
游戏退出条件: 在碰撞发生时,使用 break 退出游戏循环,并打印 碰撞发生!。
break
碰撞发生!
这样,您就能够通过比较图像的矩形区域来检查是否发生了碰撞,而不需要使用精灵。