当前位置: 首页 > 知识库问答 >
问题:

C#碰撞,如何使玩家在布尔值说他不能正确移动时不移动

滑弘扬
2023-03-14

这是我目前正在开发的一个游戏,我在工作和移动时遇到了碰撞,但当我在墙的两侧(从墙列表中)碰撞时,它会停止移动我的玩家,但如果我一直按住键,玩家将完全移动

这是移动和碰撞的代码:

    bool left = false;
    bool up = false;
    bool right = false;
    bool down = false;

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        #region Movement
        if (e.KeyCode == Keys.D && !right)
        {
            right = true;
        }

        if (e.KeyCode == Keys.A && !left)
        {
            left = true;
        }

        if (e.KeyCode == Keys.W)
        {
            up = true;
        }

        if (e.KeyCode == Keys.S)
        {
            down = true;
        }
        #endregion
    }

    public void Collision()
    {
        for (int x = 0; x < walls.Count; x++)
        {
            if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && right)
            {
                right = false;
            }

            if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && left)
            {
                left = false;
            }

            if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && up)
            {
                up = false;
            }

            if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && down)
            {
                down = false;
            }
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.D)
        {
            right = false;
        }

        if (e.KeyCode == Keys.A)
        {
            left = false;
        }

        if (e.KeyCode == Keys.W)
        {
            up = false;
        }

        if (e.KeyCode == Keys.S)
        {
            down = false;
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        #region True
        if (right)
        {
            Point loc = player.obj.Location;
            loc.X = loc.X + 4;
            player.obj.Location = loc;
        }

        if (left)
        {
            Point loc = player.obj.Location;
            loc.X = loc.X - 4;
            player.obj.Location = loc;
        }

        if (up)
        {
            Point loc = player.obj.Location;
            loc.Y = loc.Y - 4;
            player.obj.Location = loc;
        }

        if (down)
        {
            Point loc = player.obj.Location;
            loc.Y = loc.Y + 4;
            player.obj.Location = loc;
        }
        #endregion

        #region  NotTrue
        if (!right)
        {
            Point loc = player.obj.Location;
            loc.X = loc.X + 0;
            player.obj.Location = loc;
        }

        if (!left)
        {
            Point loc = player.obj.Location;
            loc.X = loc.X - 0;
            player.obj.Location = loc;
        }

        if (!up)
        {
            Point loc = player.obj.Location;
            loc.Y = loc.Y - 0;
            player.obj.Location = loc;
        }

        if (!down)
        {
            Point loc = player.obj.Location;
            loc.Y = loc.Y + 0;
            player.obj.Location = loc;
        }
        #endregion

        Collision();
    }
}
}

提醒:一切正常,但我的玩家在与物体碰撞并停止几秒钟后,将继续穿过墙壁。

共有1个答案

姜彬郁
2023-03-14

您将需要另一个布尔值,例如cantMoveRight来防止玩家在撞墙时向右移动,例如:

if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && right)
{
    right = false;
    cantMoveRight = true;
    cantMoveLeft = false; //Assuming when they cant move right they must move left, perhaps check this in situations when the player can only move forward or backward
}

if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && left)
{
    left = false;
    cantMoveRight = false;
    cantMoveLeft = true;
}

然后在 KeyUp 事件中检查:

if (e.KeyCode == Keys.D && !cantMoveRight)
{
    right = false;
}

if (e.KeyCode == Keys.A && !cantMoveLeft)
{
    left = false;
}

这样,当<code>timer1_Tick</code>事件被触发/触发时,玩家不会穿过墙壁。

 类似资料:
  • 刚开始使用pygame,当你按住箭头键时,试图让一个简单的点在屏幕上移动。目前,它只在你按键时移动,但你必须重复按键。 此外,我很感激你对我目前的代码有任何建议,可以改进或改变,使之更有效。

  • 我有一个游戏,我希望当玩家触摸婴儿时,游戏能增加一分。我知道如何加分数,但我不知道如何让系统理解它们之间的冲突。 这是我的代码的主要部分: 感谢您的所有帮助。(如果您需要更多代码,请告诉我)

  • 问题内容: 我正在开发一种游戏,其中用户必须击打高速球。为了击球,我使用旋转关节将一个矩形物体与演员连接在一起,并使它的马达以指定速度(马达速度)旋转。现在一切都非常完美,但是当球的速度很高时,它绕过了矩形车身。使用碰撞列表器,我发现发生了碰撞,但是碰撞后球没有被反射。因为只有在球高速运转时才会发生这种情况,所以要碰撞的物体的密度是bcoz。还是它的旋转关节马达?我在这里想念什么吗? 这是两个主体

  • 我在libgdx中使用tiled。我正在做一个自上而下的rpg,类似于《最终幻想1》、《2》等等。 我使用setX(getX()速度)。x*delta);和setY(getY()速度)。y*delta);在地图上移动玩家。我怎样才能让玩家一块一块地移动呢。我该如何检查玩家在哪个磁贴中?谁能帮帮我吗。谢谢你。 我发现: } 来自:libGDX:如何实现基于平滑瓷砖/网格的游戏角色移动? 但是我似乎可

  • 我正在做一个类似生存的游戏,我有两种类型的碰撞,一种是玩家的敌人,另一种是敌人身上的子弹。我也有一个健康栏,由于某些原因,在picbox被移除后,健康仍然下降,就像敌人与玩家互动一样。 这是子弹碰撞代码的一个块(所有8个方向的所有代码都是相同的) 这是敌方与玩家碰撞的暗号

  • 我在我的游戏中使用了基于网格的碰撞检测,除了一件事外,其他一切都在运行,当玩家在瓷砖上向左移动时,他从瓷砖中跌落。之所以会发生这种情况,是因为当向左然后向右移动时,网格点更新得更快,因为玩家的网格位置基于坐标移动。例如:如果玩家在100,他将不会更新,直到他达到150,单元格范围是100-150(单元格大小是50),但如果你向左移动,你将在99,其中包括在50-100单元格区域。这里有一张图片可以