如何为平台游戏中的sprite添加屏幕边缘隐形碰撞边界
横版平台游戏屏幕边缘碰撞实现方案
你可以在原有 tile 碰撞检测逻辑之后新增屏幕边界钳制代码,无需额外创建隐形碰撞体,实现逻辑更简洁性能也更高,具体实现如下:
前置假设
你项目中已定义好全局常量:
SCREEN_WIDTH:游戏窗口宽度SCREEN_HEIGHT:游戏窗口高度
修改后完整碰撞检测代码
# 检测tile碰撞 self.in_air = True for tile in world.tile_list: # x轴碰撞检测 if tile[1].colliderect(self.rect.x + dx, self.rect.y, self.width, self.height): dx = 0 # y轴碰撞检测 if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.width, self.height): # 玩家向上跳碰到tile底部 if self.vel_y < 0: dy = tile[1].bottom - self.rect.top self.vel_y = 0 # 玩家下落碰到tile顶部 elif self.vel_y >= 0: dy = tile[1].top - self.rect.bottom self.vel_y = 0 self.in_air = False # 新增:屏幕边缘碰撞检测 # x轴边界限制 if self.rect.x + dx < 0: # 碰到左边界 dx = -self.rect.x elif self.rect.x + dx + self.width > SCREEN_WIDTH: # 碰到右边界 dx = SCREEN_WIDTH - self.rect.right # y轴边界限制(如果不需要上下边界可以删掉对应部分) if self.rect.y + dy < 0: # 碰到顶部边界 dy = -self.rect.y self.vel_y = 0 elif self.rect.y + dy + self.height > SCREEN_HEIGHT: # 碰到底部边界,如果你的游戏有掉落出屏幕即死亡的逻辑,可以删掉这段换成死亡判定 dy = SCREEN_HEIGHT - self.rect.bottom self.vel_y = 0 self.in_air = False
补充优化建议
- 原有tile的x轴碰撞检测可以补充方向判定,避免玩家卡进tile时左右方向都锁死:如果dx>0说明是向右走碰到tile左边缘,就把玩家位置对齐到tile左边缘减玩家宽度;如果dx<0说明向左走碰到tile右边缘,对齐到tile右边缘即可,比直接把dx置0的效果更顺滑。
- 如果你的游戏支持镜头跟随玩家移动,只需要把边界判定的常量换成当前镜头视口的坐标范围即可。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

