P5.js使用scale缩放图片后左侧顶部碰撞检测异常求解决方案
问题原因
你遇到的左侧、顶部碰撞偏移问题核心是碰撞检测逻辑不符合图片实际渲染的矩形范围,具体问题如下:
- 你的图片渲染逻辑是:先
translate(实例.x, 实例.y),缩放后从坐标(0,0)开始绘制图片,所以实际渲染出的图片矩形边界为:- 左边界:实例x坐标
- 右边界:实例x坐标 + 原始图片宽度 * 缩放系数
- 上边界:实例y坐标
- 下边界:实例y坐标 + 原始图片高度 * 缩放系数
- 你当前使用的
collidesImg函数把玩家判定成了单个坐标点,而非一个有宽高的矩形:只有当玩家的左上角坐标(即x/y属性)进入砖块判定范围才会触发碰撞,因此只有玩家左侧、顶部碰到砖块右侧、底部时判定正常,玩家右侧、底部碰到砖块左侧、顶部时不会触发判定。
修复方案
把collidesImg函数替换为标准轴对齐矩形碰撞(AABB)逻辑即可,修改后的代码如下:
collidesImg(brickX, brickY, brickW, brickH, brickS) { // 计算玩家碰撞盒四个边界 const playerLeft = this.x const playerRight = this.x + playerImg.width * this.s const playerTop = this.y const playerBottom = this.y + playerImg.height * this.s // 计算砖块碰撞盒四个边界 const brickLeft = brickX const brickRight = brickX + brickW * brickS const brickTop = brickY const brickBottom = brickY + brickH * brickS // 核心碰撞逻辑:两个矩形在x、y轴均存在重叠即判定碰撞 return playerRight > brickLeft && playerLeft < brickRight && playerBottom > brickTop && playerTop < brickBottom }
修改后碰撞判定会和你写的调试框完全对齐,不会再出现边缘偏移问题。
内容的提问来源于stack exchange,提问作者Scollier
相关产品推荐
相关产品推荐

