C++ 顶点数组平铺贴图冲突

C++ 顶点数组平铺贴图冲突,c++,collision-detection,sfml,C++,Collision Detection,Sfml,我正在使用16x16像素的小平铺贴图。播放器在1像素空间中移动,这意味着播放器在多个分片中的某些点。我目前的方法只找到一个磁贴,但它相当不准确,并且你不能在你不能通过的磁贴的16px范围内通过 碰撞功能: void collision(direction dir) { m_Position = m_Sprite.getPosition(); long x = m_Position.x; long y = m_Position.y; long current =

我正在使用16x16像素的小平铺贴图。播放器在1像素空间中移动,这意味着播放器在多个分片中的某些点。我目前的方法只找到一个磁贴,但它相当不准确,并且你不能在你不能通过的磁贴的16px范围内通过

碰撞功能:

void collision(direction dir)
{
    m_Position = m_Sprite.getPosition();
    long x = m_Position.x;
    long y = m_Position.y;

    long current = ((x - (x % TextureSize)) / TextureSize) + (((((y - (y % TextureSize))) / TextureSize) * LevelWidth));


    switch (dir)
    {
    case up:
        if (activelevel[current - LevelWidth] != 0)
            this->move(down);
        break;
    case down:
        if (activelevel[current + LevelWidth] != 0)
            this->move(up);
        break;
    case left:
        if (activelevel[current + 1 ] != 0)
            this->move(right);
        break;
    case right:
        if (activelevel[current - 1] != 0)
            this->move(left);
        break;
    }

}
void move(direction dir)
{


    switch (dir)
    {
    case up:
        m_Sprite.move(0,-1 * speed);
        break;
    case right:
        m_Sprite.move(1 * speed, 0);
        break;
    case down:
        m_Sprite.move(0, 1 * speed);
        break;  
    case left:
        m_Sprite.move(-1 * speed, 0);
        break;  
    default:
        break;  
    }


    if (animated == true && dir != not)
        animate(dir);

    collision(dir);

}
运动功能:

void collision(direction dir)
{
    m_Position = m_Sprite.getPosition();
    long x = m_Position.x;
    long y = m_Position.y;

    long current = ((x - (x % TextureSize)) / TextureSize) + (((((y - (y % TextureSize))) / TextureSize) * LevelWidth));


    switch (dir)
    {
    case up:
        if (activelevel[current - LevelWidth] != 0)
            this->move(down);
        break;
    case down:
        if (activelevel[current + LevelWidth] != 0)
            this->move(up);
        break;
    case left:
        if (activelevel[current + 1 ] != 0)
            this->move(right);
        break;
    case right:
        if (activelevel[current - 1] != 0)
            this->move(left);
        break;
    }

}
void move(direction dir)
{


    switch (dir)
    {
    case up:
        m_Sprite.move(0,-1 * speed);
        break;
    case right:
        m_Sprite.move(1 * speed, 0);
        break;
    case down:
        m_Sprite.move(0, 1 * speed);
        break;  
    case left:
        m_Sprite.move(-1 * speed, 0);
        break;  
    default:
        break;  
    }


    if (animated == true && dir != not)
        animate(dir);

    collision(dir);

}
有没有人有办法做到这一点?它们不需要与上述内容相关


谢谢。

问题是@DGomez编辑的,真不敢相信我错过了。你只需要测试一下你的移动是否会将你置于当前矩形之外。也就是说:1。你自己的尺码不重要吗?或者你是在移动一个像素?2.如果有可能朝那个方向移动,最好更改
碰撞
返回,并在实际移动之前进行测试。16*16 Sprite,抱歉,我忽略了这一点。我的问题更多的是,如果玩家在两个方格内。这是否意味着我需要测试前面的两个方块?