You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现红方块与黑方块的碰撞检测并防止重叠?

解决红色方块与黑色方块重叠的问题

你原来的思路是等碰撞发生后再反向调整速度,但这种事后补救的方式很容易导致重叠或抖动,根本原因是先移动再检测碰撞,已经造成了位置重叠。正确的做法是先预判移动后的位置,确认不会碰撞再执行移动,从根源避免重叠。

修改方案

  1. 移除栈、碰撞标记、反向速度这些无效逻辑,简化代码
  2. 重构移动逻辑:先计算目标位置,检查是否会碰撞,无碰撞才移动
  3. 可选:添加精准贴合处理,允许方块在非碰撞方向继续移动

修改后的核心代码

替换原来的moveTimeEvent和Collision方法,新增精准碰撞处理方法:

private void moveTimeEvent(object sender, EventArgs e)
{
    // 计算各个方向的目标位置
    int targetLeft = pbRed.Left;
    int targetTop = pbRed.Top;

    if (moveLeft) targetLeft -= speed;
    if (moveRight) targetLeft += speed;
    if (moveUp) targetTop -= speed;
    if (moveDown) targetTop += speed;

    // 保持在屏幕边界内(原有的边界限制)
    targetLeft = Math.Max(7, Math.Min(targetLeft, 750));
    targetTop = Math.Max(7, Math.Min(targetTop, 400));

    // 创建移动后的红色方块边界
    Rectangle targetBounds = new Rectangle(targetLeft, targetTop, pbRed.Width, pbRed.Height);

    // 检查是否与黑色方块碰撞
    if (!targetBounds.IntersectsWith(pbBlack.Bounds))
    {
        // 无碰撞,直接移动到目标位置
        pbRed.Left = targetLeft;
        pbRed.Top = targetTop;
    }
    else
    {
        // 精准处理:允许非碰撞方向继续移动(比如贴墙时还能上下移动)
        HandlePrecisionCollision(targetLeft, targetTop);
    }
}

private void HandlePrecisionCollision(int targetLeft, int targetTop)
{
    // 单独检查X方向是否可移动
    Rectangle tempXBounds = new Rectangle(targetLeft, pbRed.Top, pbRed.Width, pbRed.Height);
    if (!tempXBounds.IntersectsWith(pbBlack.Bounds))
    {
        pbRed.Left = targetLeft;
    }

    // 单独检查Y方向是否可移动
    Rectangle tempYBounds = new Rectangle(pbRed.Left, targetTop, pbRed.Width, pbRed.Height);
    if (!tempYBounds.IntersectsWith(pbBlack.Bounds))
    {
        pbRed.Top = targetTop;
    }
}

额外清理

可以删掉这些无用的变量和方法:

  • bool collision、Keys currentInput、Keys lastInput、Stack pressedKeys
  • 原来的Collision()方法

这样修改后,红色方块会提前判断移动路径,完全不会和黑色方块重叠,同时保留了贴墙时其他方向的移动能力,操作更流畅。

内容的提问来源于stack exchange,提问作者Tiny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:20:38