MonoGame开发:如何实现矩形的动态放大与缩小效果
MonoGame打地鼠游戏碰撞判定异常修复方案
问题根因
你当前的碰撞逻辑使用了地鼠完整纹理对应的固定尺寸矩形作为判定区域,和地鼠探出/缩回的动画进度完全解绑,即使地鼠只探出洞口一小段,判定区域还是覆盖了完整的地鼠高度范围,因此点击洞口下方未显示的区域也会被判定为击中。
修复步骤
- 首先给地鼠实体新增
ShowProgress浮点型字段,取值范围为0~1:0代表完全缩回地洞,1代表完全探出。探出动画执行时每帧递增该值,缩回动画执行时每帧递减该值。 - 将地鼠的碰撞矩形、绘制矩形均和
ShowProgress绑定,参考代码如下:
// 预设值:地洞横坐标、洞口顶部纵坐标、地鼠完整尺寸 const int HoleX = 200; const int HoleTopY = 300; const int MoleFullWidth = 80; const int MoleFullHeight = 80; // 实时计算当前地鼠探出的高度 int currentShowHeight = (int)(MoleFullHeight * ShowProgress); // 碰撞矩形仅包含已探出洞口的可见区域 Rectangle CurrentHitRect = new Rectangle( x: HoleX, y: HoleTopY - currentShowHeight, width: MoleFullWidth, height: currentShowHeight ); // 绘制时裁切纹理底部未探出的部分,保证显示和碰撞区域一致 Rectangle DrawSourceRect = new Rectangle( x: 0, y: MoleFullHeight - currentShowHeight, width: MoleFullWidth, height: currentShowHeight );
- 点击判定逻辑修改为:仅判断玩家点击坐标是否落在当前帧的
CurrentHitRect范围内即可。如果需要优化体验,可以额外加规则:仅当ShowProgress >= 0.2时才开启击中判定,避免地鼠刚冒头就被打中的异常情况。 - 缩回动画阶段建议保持碰撞矩形和进度同步,或直接关闭击中判定,避免地鼠已经缩回大半还能被击中。
内容的提问来源于stack exchange,提问作者Oskar Rosenbäck
相关产品推荐
相关产品推荐

