C++ 2D游戏中的碰撞问题:防止玩家进入瓷砖

3

我尝试了几天,在网上搜索了数小时,但无济于事。我在处理碰撞时遇到了问题,我可以检测到碰撞,但我的问题是防止玩家进入这个方格。我已经尽我所能尝试过所有的方法。我使用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;
        }
    }

这个可以,我的文本播放器与瓷砖碰撞后会变成红色,但我无法弄清如何防止玩家进入该瓷砖。我尝试禁用移动,但结果是玩家仍然进入了碰撞,并且控件被禁用,导致玩家完全卡住。
我的当前移动非常基础。
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;
        }
    }
}

Any help greatly appreciated.


2
如果移动导致碰撞,将玩家的位置恢复到碰撞前的位置。或者,如果移动会导致碰撞,则不要移动玩家。 - hyde
这个问题更适合于游戏开发(点)堆栈交换。 - Grey
只是出于好奇,你是如何绘制地图的?使用什么操作系统? - Fiddling Bits
那个 for 循环没有意义;你开始检查每个瓷砖,然后在检查第一个瓷砖后中止。我不明白它怎么能工作,除非 tiles[0] 恰好与所询问的瓷砖颜色相同。而且你的“当前移动”似乎没有涉及更改 x - Beta
1个回答

3

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

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


谢谢你提供的代码,它给了我需要的答案。虽然代码本身对我来说不起作用,但提前检查玩家是否会发生碰撞正是我正在寻找的。我将检查碰撞与移动结合起来,现在它完美地工作了。谢谢! - Mystic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接