C++ 我的方形提特里米诺旋转异常,但我的其他提特里米诺旋转良好?

C++ 我的方形提特里米诺旋转异常,但我的其他提特里米诺旋转良好?,c++,rotation,sfml,tetris,C++,Rotation,Sfml,Tetris,所以在我的俄罗斯方块游戏中,我在轮换。我发现了一种算法,它适用于除方形外的所有部件(具有讽刺意味的是,它是唯一一种甚至不需要旋转的部件)。我知道我可以检查这件作品是否是正方形,如果不是,就旋转它,但这很便宜。下面是代码: pieceShape.setTexture(imgr.GetImage("square.png")); for(int i = 0; i < 4; i++){ sf::RectangleShape rect;

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

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;
pieceShape.setTexture(imgr.GetImage(“square.png”);
对于(int i=0;i<4;i++){
sf::矩形形状矩形;
如果(i<2)
rect.setPosition(pieceShape.getPosition().x,i*10);
其他的
rect.setPosition(pieceShape.getPosition().x+10,(i-2)*10);
rect.setSize(sf::Vector2f(10,10));
rect.setFillColor(sf::Color::Blue);
工件矩形。推回(矩形);
}
原始计数=10;
在这里,我创建了组成一个正方形的所有四个块。10是每个框的宽度(每平方米4个框),以像素为单位。对于所有其他部分,我将原始计数设置为5,因此原点落在创建的第一个框的中间。originCount在右/左旋转功能中发挥作用:

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);
    }
}
void GamePiece::RotateRight(){
int newx,newy;
sf::Vector2f原点(分段矩形[0].getPosition().x+originCount,分段矩形[0].getPosition().y+originCount);
对于(int i=0;i<4;i++){
newx=(pieceRectangles\ui).getPosition().y+origin.x-origin.y);
newy=(origin.x+origin.y-pieceRectangles_i).getPosition().x-10);
分段矩形[i]。设置位置(newx,newy);
}
}

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

你计算的原点不正确。第一次旋转后,
分段矩形的坐标将是
(0,10)
,因此下次
原点将被计算为
(10,20)
,这不是您想要的。

为什么旋转正方形?当我旋转方块时,我从未注意到任何与俄罗斯方块相关的游戏有任何变化。当你把它旋转90度时,它会看起来不一样吗?不会,但我是一个坚持传统的人。我宁愿使用一种无异常的方法来旋转(或不旋转)我的所有工件,而不是在活动工件为正方形时添加一个丑陋的异常来旋转。在正常旋转90度的情况下,x坐标变为负y坐标,y坐标变为x坐标。因此,首先转换到原点位于工件原点的坐标系,math_x=工件[i].x()-originoffset。然后旋转_math_y=-math_x。然后newy=旋转的数学y+原点偏移。另一个也是如此。@jburn7遵循约定的更好方法是将
RotateRight
设置为虚拟,并在
Square
类中重写它,使其不做任何操作。