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

碰撞c 2D游戏,防止玩家进入瓷砖

钦德佑
2023-03-14

我已经尝试了好几天,花了几个小时在网上搜索,但无济于事。我在碰撞时遇到问题,我可以检测到碰撞,但我的问题是阻止玩家进入图块。我已经尝试了所有我能想到的。我正在检测我的瓷砖贴图的冲突,使用1表示实体,0表示被动

for(int i = 0; i < tiles.size(); i++)
    {
        if(colMap[tiles[i].y][tiles[i].x] == 1)
        {
            myrect.setFillColor(sf::Color::Red);
            collide = true;
            break;
        }
        else
        {
            collide = false;
            break;
        }
    }

这工作正常,我的文本播放器变成红色,一旦与瓷砖碰撞,但我不知道如何防止玩家进入那个瓷砖开始,我目前的设置我试图禁用移动,但所有发生的是玩家进入碰撞设置为true和控件禁用,导致玩家完全卡住。

我目前的动作是非常基本的

if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
    if(walking == false)
    {
        //colCheck();
        if(!collide)
        {
        nextspot = x - tilesize;
        move[LEFT] = true;
        walking = true;
        }else
        {
            std::cout << "Collsion!" << std::endl;
        }
    }
}

任何帮助都非常感谢。

共有1个答案

仲浩旷
2023-03-14

您需要始终记录您的玩家在一个回合之前的位置:

static int prevY, prevX;

for(int i = 0; i < tiles.size(); i++)
{
    if(colMap[tiles[i].y][tiles[i].x] == 1)
    {
        myrect.setFillColor(sf::Color::Red);
        collide = true;

        /* Return Player To Where He's Been */
        colMap[prevY][prevX] = 1;

        break;
    }
    else
    {
        collide = false;
        break;
    }
}

另一种方法是在移动之前向前看:

for(int i = 0; i < tiles.size(); i++)
{
    /* Look Ahead (Depends On Which Way He's Trying To Go)*/
    if(colMap[tiles[i].y + newY][tiles[i].x + newX] == 1)
    {
        myrect.setFillColor(sf::Color::Red);
        willCollide = true;
        break;
    }
    else
    {
        willCollide = false;
        break;
    }
}

newYnewX 可以是 -101。如果 newYnewX != 0,则另一个必须为 0

 类似资料:
  • 我正在做一个平台游戏,玩家有一把剑。我希望玩家只能在他下面有地面的时候攻击(所以他不能在空中攻击)。所以我实现了这段代码: 但是.. 每次返回零。虽然如果我将添加到测试玩家是否在地面的部分,它仍然存在!(虽然接地仍然等于零) 以下是完整的代码: 有人能帮忙吗?:)

  • 我正在开发一个平台,我有一个32x32的精灵和32x32的磁贴。我还使用了一个图块引擎,它在数组的帮助下生成地图。我使用一个< code>RectangleHelper.cs来修复与瓷砖和播放器的碰撞,到目前为止,它可以与瓷砖的顶部碰撞,也可以与瓷砖的左侧碰撞。 在第一张图中,我展示了“在顶部”碰撞工作正常。没有错误什么的。 在图2中,我展示了“碰撞左侧”,这也很棒。 但是在图3中,你可以看到这个

  • 我正在做一个2d平板游戏。到目前为止,我已经做了一些事情。我正在使用libgdx的矩形进行基本的碰撞检测,所以考虑到我现在只有草块,我用Java制作了一个单块世界(文件读取器还没有准备好),问题是我的检测只在第一次工作,换句话说,如果我产生碰撞到一个块,它会检测到碰撞并这样做。虽然如果我在没有碰撞的情况下,让我的球员在方块顶部出现,球员将永远摔倒。 这是代码=

  • 我有一个球,我可以在由大小相等的瓷砖组成的地图上移动。玩家应该不能在较暗且有黑色边框的瓷砖上行走。我有一个多维的瓷砖阵列,我用它来检查哪些瓷砖是实心的。 我希望玩家在水平和垂直移动时,可以靠墙滑动。问题是,如果他那样做,他就会固执己见。我设法使它在每个轴上都能完美工作,但是分开的。下面是我的水平碰撞检查代码: level.isBlocked() 方法检查数组的索引是否被实心磁贴占用。i 和 j 变

  • 在get_hit=pyGame.sprite的第82行,我检查sprite碰撞的移动时,它会给出错误提示:“:File”c:\Users\pc\VS_PYTHON_PY\pyGame.PY“。”。spritecollide(Player,敌方,True)文件“C:\python py\lib\site packages\pygame\sprite.py”,第1682行,位于spritecrolli

  • 我已经和LWJGL一起开发这个游戏几个星期了。自从我增加了跳跃的能力后,向上的碰撞给我带来了很多问题。 这个游戏是一个基于2D瓷砖的侧翻游戏。总的来说,除了玩家跳跃时,碰撞几乎是完美的。起初我想“哦,也许我只需要改变跳跃机制”,但后来我意识到只有当玩家通过某个x坐标时才会发生这种情况。 现在,对于实际问题本身:如果玩家在传递某个x坐标时跳转,他们将通过平铺,并测试顶部碰撞返回false。 这是整个