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