테트리스 게임에서 나는 회전 작업을하고 있습니다. 나는 사각형 조각 (역설적으로도 회전 할 필요조차없는 유일한 조각) 이외의 모든 조각에 대해 작동하는 알고리즘을 발견했습니다. 조각이 사각형이 아닌지 확인한 다음 회전하지 않는지 확인하기 만하면됩니다.하지만 그건 싼 것입니다. 코드는 다음과 같습니다.내 사각형 tetrimino 이상하게 회전 유지하지만, 내 다른 tetrimonos 괜찮아요?
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;
여기에 사각형 피스를 구성하는 4 개의 블록이 모두 생성됩니다. 10은 각 상자의 너비 (픽셀 당 4 상자)입니다. 다른 모든 조각의 경우 originCount를 5로 설정하여 원본이 생성 된 첫 번째 상자의 중간에 오도록 만듭니다. originCount는 RotateRight/왼쪽 기능에 활동하기 시작 :
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에서 2 픽셀 정도 올라갈 수 있습니다. 분명히 뭔가 빠졌지 만 뭐라 구요?
왜 회전합니까? 나는 사각형을 회전 시켰을 때 테트리스 관련 게임에서 어떤 변화도 발견하지 못했습니다. 90도 회전하면 모양이 달라 집니까? –
아니요,하지만 저는 국제 대회를 위해 싸우는 사람입니다. 차라리 한 조각을 회전시킬 때 추한 예외를 추가하는 대신 모든 조각을 회전 시키거나 회전시킬 수있는 예외가없는 한 가지 방법을 사용하고 싶습니다. – jburn7
오른쪽으로 90도 회전하면 x 좌표는 - y가되고 y 좌표는 x가됩니다. 먼저 조각 원점에서 원점을 가진 좌표계로 변환합니다. math_x = piece [i] .x() - originoffset. rotate_math_y = -math_x입니다. newy = rotating_math_y + origin_offset입니다. 다른 한쪽도 마찬가지입니다. –