Так что в моей игре в тетрис я работаю над ротацией. Я нашел алгоритм, который работает для каждого куска, кроме квадратного (по иронии судьбы, единственный, который даже не нужно вращать). Я знаю, что могу просто проверить, не является ли кусок квадратом, а затем повернуть его, если это не так, но это просто дешево. Итак, вот код:
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 пикселя и т. Д. Я явно что-то упустил, но что?
Вы рассчитываете origin
неправильно. После первого поворота координаты pieceRectangles_[0]
будет (0, 10)
так что в следующий раз origin
будет рассчитываться как (10, 20)
что не то, что вы хотите.