c++ - 我的方形 tetrimonos 一直奇怪地旋转,但我的其他 tetrimonos 旋转正常?

标签 c++ rotation sfml tetris

所以在我的俄罗斯方 block 游戏中,我正在研究旋转。我发现了一种算法,它适用于除了正方形以外的每一 block (具有讽刺意味的是,这是唯一一个甚至不需要旋转的算法)。我知道我可以检查一下这件作品是否不是正方形,如果不是则旋转它,但这很便宜。所以这是代码:

pieceShape.setTexture(imgr.GetImage("square.png"));
        for(int i = 0; i < 4; i++){
            sf::RectangleShape rect;
            if(i < 2)
                rect.setPosition(pieceShape.getPosition().x, i * 10);
            else
                rect.setPosition(pieceShape.getPosition().x + 10, (i - 2) * 10);
            rect.setSize(sf::Vector2f(10, 10));
            rect.setFillColor(sf::Color::Blue);
            pieceRectangles_.push_back(rect);
        }
        originCount = 10;

在这里,我正在创建构成一个正方形的所有四个 block 。 10 是每个框的宽度(每平方 4 个框),以像素为单位。对于所有其他部分,我将 originCount 设置为 5,以便原点落在创建的第一个框的中间。 originCount 在 RotateRight/Left 函数中发挥作用:

void GamePiece::RotateRight(){
    int newx, newy;
    sf::Vector2f origin(pieceRectangles_[0].getPosition().x + originCount, pieceRectangles_[0].getPosition().y + originCount);
    for(int i = 0; i < 4; i++){
        newx = (pieceRectangles_[i].getPosition().y + origin.x - origin.y);
        newy = (origin.x + origin.y - pieceRectangles_[i].getPosition().x - 10);
        pieceRectangles_[i].setPosition(newx, newy);
    }
}

理论上,原点现在已设置为正方形 Sprite 的中间,盒子应该围绕该点旋转(即看起来甚至不动)。但是第一次点击时框向左移动 10 个像素,第二次点击时可能向上移动 2 个像素,等等。我显然遗漏了什么,但是什么?

最佳答案

您错误地计算了 origin。第一次旋转后 pieceRectangles_[0] 的坐标将为 (0, 10),因此下一次 origin 将计算为 (10, 20),这不是您想要的。

关于c++ - 我的方形 tetrimonos 一直奇怪地旋转,但我的其他 tetrimonos 旋转正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26131120/

相关文章:

c++ - 使用c++查找文件

c++ - cmake:如何告诉库在哪里可以找到依赖项

c++ - 加速一个长的 python 代码,该代码被证明仅由于单个 block 而变慢

c++ - 组件之间如何有效通信?

c++ - 共享对象中的符号名称与 .cpp 文件中的函数不同

android - Canvas 旋转时获取边界

C++/OpenGL - 旋转矩形

swift - 在 Swift 中制作动画之前如何对 UILabel 应用变换?

c++ - 在 C++ 中消除 std::isalpha() 的歧义

c++ - 在头文件中声明 vector 时出错