0

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

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 个像素,等等。我显然错过了一些东西,但是什么?

4

1 回答 1

1

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

于 2014-09-30T23:07:50.960 回答