Pygame精灵碰撞后反向输入移动功能实现问询
Pygame精灵碰撞后反向输入移动功能实现问询
嘿,我太懂这种卡壳的感觉了——之前做双人对战小游戏时,也纠结过碰撞后怎么让精灵能顺利分开,而不是僵在原地动不了。给你拆解下实现思路,应该能帮到你:
首先,你现在的代码只判断了「有没有碰撞」,但要实现「反向输入允许移动」,核心是得先搞清楚两个精灵碰撞时的相对方向——也就是玩家1是从上下左右哪个方向撞上玩家2的,这样才能判断当前输入是不是「远离碰撞对象」的方向。
第一步:计算碰撞的相对方向
Pygame的colliderect只能告诉你碰没碰,要拿方向的话,我们可以通过两个精灵矩形的中心坐标差来判断:
keys1 = pygame.key.get_pressed() player1_rect = player1.rect player2_rect = player2.rect collided = player1_rect.colliderect(player2_rect) if not collided: player1.update(keys1) else: # 计算两个精灵的中心偏移量 dx = player1_rect.centerx - player2_rect.centerx dy = player1_rect.centery - player2_rect.centery # 判断是水平碰撞还是垂直碰撞为主(看哪个方向偏移更大) is_horizontal_collision = abs(dx) > abs(dy)
第二步:根据方向判断是否允许移动
拿到碰撞方向后,就可以针对玩家1的输入做判断:只有当输入方向是「远离碰撞对象」的时候,才允许执行移动逻辑。
比如水平碰撞的情况:
- 如果玩家1在玩家2的左侧(
dx < 0),那玩家1按左键是远离对方,允许移动;按右键会继续挤进去,要禁止。 - 如果玩家1在玩家2的右侧(
dx > 0),那玩家1按右键是远离,允许移动;按左键要禁止。
垂直碰撞的逻辑同理,把代码补全后是这样:
# 接上面的else代码块 if is_horizontal_collision: if dx < 0: # 玩家1在左侧,允许向左移动(远离) if keys1[pygame.K_LEFT]: player1.update(keys1) else: # 玩家1在右侧,允许向右移动(远离) if keys1[pygame.K_RIGHT]: player1.update(keys1) else: if dy < 0: # 玩家1在上方,允许向上移动(远离) if keys1[pygame.K_UP]: player1.update(keys1) else: # 玩家1在下方,允许向下移动(远离) if keys1[pygame.K_DOWN]: player1.update(keys1)
额外优化:避免精灵重叠卡死
有时候碰撞后两个精灵会卡在重叠状态,这时候可以先把它们的位置修正到「刚好接触不重叠」的状态,再处理移动,体验会好很多:
# 在判断collided为True后,先加这段修正代码 overlap_x = min(player1_rect.right, player2_rect.right) - max(player1_rect.left, player2_rect.left) overlap_y = min(player1_rect.bottom, player2_rect.bottom) - max(player1_rect.top, player2_rect.top) if overlap_x < overlap_y: # 水平方向重叠更小,按水平方向修正 if dx < 0: player1_rect.right = player2_rect.left else: player1_rect.left = player2_rect.right else: # 垂直方向重叠更小,按垂直方向修正 if dy < 0: player1_rect.bottom = player2_rect.top else: player1_rect.top = player2_rect.bottom
这样调整后,碰撞后的精灵不会卡在一起,按反向键也能顺利分开啦。
备注:内容来源于stack exchange,提问作者primeCEOstack
相关产品推荐
相关产品推荐

