我的方形四边目一直在奇怪地旋转,但我的其他四边目旋转得很好



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

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;

在这里,我正在创建组成一个正方形的所有四个块。10是以像素为单位的每个框的宽度(每平方4个框)。对于所有其他片段,我将originCount设置为5,因此原点位于创建的第一个长方体的中间。originalCount在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);
    }
}

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

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

相关内容