【问题标题】:Collision c++ 2d game, preventing player from entering tileCollision c++ 2d游戏,防止玩家进入瓷砖
【发布时间】:2014-01-13 16:46:10
【问题描述】:

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

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;
        }
    }
}

非常感谢任何帮助。

【问题讨论】:

  • 如果移动导致碰撞,将玩家位置恢复到碰撞前的位置。或者,如果移动会导致碰撞,请不要移动玩家。
  • 这会更适合游戏开发 (dot) Stack Exchange。
  • 只是出于好奇,您是如何绘制地图的?什么操作系统?
  • for 循环没有意义;您开始检查每个图块,然后在检查第一个图块后中止。我看不出它是如何工作的,除非tiles[0] 恰好与所讨论的瓷砖具有相同的颜色。而且您的“当前运动”似乎不涉及更改x

标签: c++ collision sfml


【解决方案1】:

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

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

【讨论】:

  • 感谢代码,您给了我所需的答案,代码本身对我不起作用,但提前检查播放器是否会发生碰撞正是我想要的。我将检查碰撞与运动结合起来,效果很好。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多