所以在我的俄罗斯方块游戏中,我正在研究轮换。我找到了一种适用于除正方形以外的每一块的算法(具有讽刺意味的是,唯一一个甚至不需要旋转的算法)。我知道我可以检查这块是否不是正方形,如果不是,则旋转它,但这很便宜。所以这里是代码:
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,因此原点位于创建的第一个框的中间。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);
}
}
理论上,原点现在已设置在正方形精灵的中间,并且盒子应该围绕该点旋转(即看起来甚至没有移动)。但是框在第一次单击时向左射击 10 个像素,在单击第二次时可能会上升 2 个像素,等等。我显然错过了一些东西,但是什么?