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

Tilemap碰撞sfml c平台

衡修洁
2023-03-14

我的2D平台游戏有问题。由于我刚刚开始使用c,因此我在瓷砖碰撞方面遇到了麻烦。我能够阻止玩家进入图块,并且能够远离它,但不知何故,他不能沿着图块移动。

此功能用于检查新位置是否位于实心瓷砖内:

空地图::drawColMap(播放器

for (int i = 0; i < _player.tiles.size(); i++)
{
    if (colMap[_player.tiles[i].y][_player.tiles[i].x] == 1) //solid tile = 1
    {
        _player.willCollide = true;
        break;
    }
    else {
        _player.willCollide = false;
    }
}

}

以下是移动播放器的代码:

void Player::update() {

sf::Vector2f newPosition;  
sf::Vector2f oldPosition;

oldPosition.x = playerImage.getPosition().x; // store the current position
oldPosition.y = playerImage.getPosition().y;

newPosition.x = playerImage.getPosition().x; // store the new position
newPosition.y = playerImage.getPosition().y;

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
    source.y = Left; //sprite stuff
    moving = true;
    newPosition.x -= 2;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{

    source.y = Right;
    moving = true;
    newPosition.x += 2;
}


if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{

    source.y = Up;
    moving = true;
    newPosition.y -= 2;

}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{

    source.y = Down;
    moving = true;
    newPosition.y += 2;
}

if (!(sf::Keyboard::isKeyPressed(sf::Keyboard::Left) || sf::Keyboard::isKeyPressed(sf::Keyboard::Right) || sf::Keyboard::isKeyPressed(sf::Keyboard::Up) || sf::Keyboard::isKeyPressed(sf::Keyboard::Down)))
{
    moving = false;
}

//create corners to check collision

bottom = newPosition.y + 32; //tile size is 32 px
left = newPosition.x;
right = newPosition.x + 32;
top = newPosition.y;

sf::Vector2i topLeft(sf::Vector2i((int)left / 32, (int)top / 32)); // get the corners of the new position
sf::Vector2i topRight(sf::Vector2i((int)right / 32, (int)top / 32));
sf::Vector2i bottomLeft(sf::Vector2i((int)left / 32, (int)bottom / 32));
sf::Vector2i bottomRight(sf::Vector2i((int)right / 32, (int)bottom / 32));

tiles.clear();

tiles.push_back(topLeft);
if (std::find(tiles.begin(), tiles.end(), topRight) == tiles.end()) tiles.push_back(topRight);  //check the corners
if (std::find(tiles.begin(), tiles.end(), bottomLeft) == tiles.end()) tiles.push_back(bottomLeft);
if (std::find(tiles.begin(), tiles.end(), bottomRight) == tiles.end()) tiles.push_back(bottomRight);

//if no collision set the position to the new position
if (!willCollide)                
    playerImage.setPosition(newPosition);
else
    playerImage.setPosition(oldPosition);  //if collision then set the position to the previous position

}

感谢任何帮助!

//编辑1

我试着记录碰撞,它显示即使我不按任何键,玩家仍然在碰撞区域。但是我如何阻止玩家进入呢?我找不到问题。

//编辑2

我想我发现了另一个问题。碰撞检查可能应该在移动玩家之前和移动新位置之后运行。

共有1个答案

沃盛
2023-03-14

玩家碰撞后,更改位置,将其在远离碰撞区域(适当方向)的方向上移动1个像素。如果角未正确移出碰撞区域,则可能仍在碰撞边界内。

 类似资料:
  • 这是我的碰撞/移动代码 这是PixelPerfectTest函数(不是我的) 编辑:这就是我如何让它工作,以防将来有人需要帮助

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

  • 我正在开发一款平台游戏,我想做一些基本的平台碰撞,遗憾的是我还是做不到。玩家的移动是这样计算的: 所有变量都是具有< code>x和< code>y值的向量。这和预期的一样,问题是有冲突。我的规则是: 当降落在平台上时停止坠落。 从平台运行时开始下降。 在跳跃过程中击中平台时停止向上移动。 撞墙时停止向一侧移动,但能够向相反方向移动。 检查底部是否与平台碰撞非常简单,但棘手的部分是检测哪一侧与平台

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

  • 你是否看到过车祸?是否跟什么物体相撞过?就像车的相撞一样,刚体对象也可以互相碰撞,当它们互相接触的时候,就认为发生了碰撞。当碰撞发生时,会触发一系列事件,它可以被完全忽略。 碰撞筛选 碰撞筛选允许你启用或者阻止形状之间碰撞的发生,引擎支持使用类型,组位掩码来进行碰撞筛选。 Cocos2d-x 有 32 个支持的碰撞类型,对于每个形状都可以指定其所属的类型。还可以指定有哪些类型可以与这个形状进行碰撞

  • 我计划一个独立游戏项目已经有一段时间了。我会为你总结一下,这样我就可以直接回答这个问题。 它是通过Visual Studio完全使用最新版本的XNA完成的。希望将其放在360和PC上,但目前我只是在真正寻找面向PC的解决方案。 这是一个2D侧向滚动射击游戏(想想大都会风格,甚至是Terraria)。它最终将包括一个游戏中的地图编辑器,地图是基于图块的(16x16)。会有向上和向下滚动。我希望在开发