GameMaker Studio角色角落碰撞异常问题求助
问题分析与修复方案
1. 位运算仅支持2的幂次Tile尺寸
你的代码中使用~(TILE_SIZE-1)的位运算对齐tile坐标,这个操作仅在TILE_SIZE是2的整数次幂(如16、32、64)时有效。如果你的TILE_SIZE设置为非2的幂(比如10、20),对齐逻辑会直接出错,导致角色位置偏移。
修复:
- 确认
TILE_SIZE的值为2的幂,比如改为16; - 若必须使用非2的幂的tile尺寸,替换位运算为整数除法:
将(bbox_right & ~(TILE_SIZE-1))替换为floor(bbox_right / TILE_SIZE) * TILE_SIZE,(bbox_left + TILE_SIZE) & ~(TILE_SIZE-1)替换为ceil(bbox_left / TILE_SIZE) * TILE_SIZE。
2. 左侧/顶部碰撞的坐标对齐逻辑不严谨
你左侧碰撞代码中使用(bbox_left + TILE_SIZE) & ~(TILE_SIZE-1),虽然正数场景下和教程写法结果一致,但负数坐标场景会出现计算偏差。规范写法应先对齐到当前tile起始坐标,再加tile尺寸得到tile边界。
修复左侧碰撞的x赋值代码:
x = ((bbox_left & ~(TILE_SIZE-1)) + TILE_SIZE) - bboxLeftPortion;
修复顶部碰撞的y赋值代码:
y = ((bbox_top & ~(TILE_SIZE-1)) + TILE_SIZE) - bboxTopPortion;
3. bbox偏移量变量定义错误
如果bboxLeftPortion、bboxTopPortion等变量的定义和教程相反(比如教程中是x - bbox_left,你定义成bbox_left - x),会导致坐标计算反向偏移。
验证:
- 确保
bboxLeftPortion = x - bbox_left(角色原点到bbox左边界的距离,正数); - 同理,
bboxRightPortion = bbox_right - x,bboxTopPortion = y - bbox_top,bboxBottomPortion = bbox_bottom - y。
4. 碰撞图层与Tile属性验证
确认collisionMap是正确的碰撞图层,且参与碰撞的tile索引不为0(代码中通过_pixel1 != 0 || _pixel2 != 0判断碰撞)。
内容的提问来源于stack exchange,提问作者Francesco Riva Reyes
相关产品推荐
相关产品推荐

