Pygame横版平台游戏单矩形批量检测多矩形碰撞的实现方法
核心错误原因
pygame.Rect.colliderect()方法仅支持接收单个矩形对象作为参数,你直接传入存储了多个Rect的ground_rect列表,不符合API的参数要求,因此触发类型错误。同时pygame.draw.rect()方法也仅支持绘制单个矩形,直接传入列表同样会报错。
修正方案
你用列表存储所有平台矩形的思路是完全正确的,只需要调整碰撞检测和绘制的逻辑,遍历列表中的每个矩形进行操作即可。后续新增平台仅需要往ground_rect列表追加元素即可,不需要额外修改逻辑,完全适配多平台场景。
修改后的核心代码段
仅需要替换原代码中碰撞检测和绘制的相关部分即可:
# !!Collision!! for i in range(10): # 遍历所有平台逐个检测碰撞 for platform in ground_rect: if player_rect.colliderect(platform): player_y -= 1 player_y_velocity = 0.5 coyote = 4 player_rect = pygame.Rect(player_x, player_y, 32, 32) # Draw stuff (pic is a function I made to shorten the blit) pic(player_img, player_x, player_y) # 遍历绘制所有平台 for platform in ground_rect: pygame.draw.rect(screen, (64, 0, 0), platform)
更简洁的碰撞检测写法
Pygame内置了collidelist()方法,可以直接传入矩形列表,返回第一个和玩家碰撞的平台索引,没有碰撞则返回-1,代码更简洁:
# !!Collision!! for i in range(10): collision_idx = player_rect.collidelist(ground_rect) if collision_idx != -1: player_y -= 1 player_y_velocity = 0.5 coyote = 4 player_rect = pygame.Rect(player_x, player_y, 32, 32)
内容的提问来源于stack exchange,提问作者Plide
相关产品推荐
相关产品推荐

