Pygame自定义colis碰撞检测函数失效问题求助
你的Pygame碰撞函数失效的核心原因及修复方案
核心问题:参数传递的本质导致修改无效
你封装的colis函数里修改的x和y是函数内部的局部变量,和主循环里的全局x、y完全是两个独立的变量。
Python中整数属于不可变类型,当你把全局的x、y传给函数时,函数拿到的只是它们的数值副本,修改副本的值不会影响原变量。这就是为什么直接把碰撞逻辑写在主循环里能生效——那时候修改的是全局的x、y,而封装成函数后,修改的只是函数内部的临时变量。
两种修复方案
方案1:让函数返回修改后的坐标
修改colis函数,在末尾返回更新后的x和y,主循环调用时接收返回值:
def colis(x,y,player_width,player_height,width,height,xx,yy): # 原有碰撞判断逻辑保持不变 if x + player_width > xx: if x < xx + width - 20: if y + player_height > yy + 10: if y < yy + height - 10: x = xx - player_width if x < xx + width: if x > xx: if y + player_height > yy + 10: if y < yy + height - 10: x = xx + width if y < yy + height: if y > yy + 20: if x + player_width > xx: if x < xx + width: y = yy + height if y + player_height > yy: if y < yy + height - 20: if x + player_width > xx: if x < xx + width: y = yy - player_height return x, y # 返回修改后的坐标
主循环中调用时替换原有代码:
x, y = colis(x,y,50,50,100,100,200,200)
方案2:用可变类型包装坐标
把x、y放到列表或字典这类可变容器里,函数修改容器内的元素会直接影响外部:
# 初始化时用列表存储坐标 pos = [0, 0] # pos[0]对应x,pos[1]对应y xx, yy = 200, 200
修改colis函数:
def colis(pos, player_width, player_height, width, height, xx, yy): x, y = pos # 原有碰撞判断逻辑保持不变 if x + player_width > xx: if x < xx + width - 20: if y + player_height > yy + 10: if y < yy + height - 10: x = xx - player_width # ... 其他碰撞判断代码 ... # 将修改后的值写回列表 pos[0] = x pos[1] = y
主循环中调用并使用坐标:
colis(pos,50,50,100,100,200,200) x, y = pos # 从列表中取出最新坐标
额外代码问题提示
你的代码还有几个会导致运行报错的问题,需要补充:
- 缺少
clock初始化:主循环前需添加clock = pg.time.Clock() - 未初始化全局变量:需添加
x, y = 0, 0、w = a = s = d = 0、speed = 1等初始化代码 - 退出逻辑错误:
pg.QUIT应改为pg.quit(),并添加break或exit()终止循环
内容的提问来源于stack exchange,提问作者FundLikVis
相关产品推荐
相关产品推荐

