2014-09-30 8 views
0

테트리스 게임에서 나는 회전 작업을하고 있습니다. 나는 사각형 조각 (역설적으로도 회전 할 필요조차없는 유일한 조각) 이외의 모든 조각에 대해 작동하는 알고리즘을 발견했습니다. 조각이 사각형이 아닌지 확인한 다음 회전하지 않는지 확인하기 만하면됩니다.하지만 그건 싼 것입니다. 코드는 다음과 같습니다.내 사각형 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 픽셀 정도 올라갈 수 있습니다. 분명히 뭔가 빠졌지 만 뭐라 구요?

+0

왜 회전합니까? 나는 사각형을 회전 시켰을 때 테트리스 관련 게임에서 어떤 변화도 발견하지 못했습니다. 90도 회전하면 모양이 달라 집니까? –

+0

아니요,하지만 저는 국제 대회를 위해 싸우는 사람입니다. 차라리 한 조각을 회전시킬 때 추한 예외를 추가하는 대신 모든 조각을 회전 시키거나 회전시킬 수있는 예외가없는 한 가지 방법을 사용하고 싶습니다. – jburn7

+1

오른쪽으로 90도 회전하면 x 좌표는 - y가되고 y 좌표는 x가됩니다. 먼저 조각 원점에서 원점을 가진 좌표계로 변환합니다. math_x = piece [i] .x() - originoffset. rotate_math_y = -math_x입니다. newy = rotating_math_y + origin_offset입니다. 다른 한쪽도 마찬가지입니다. –

답변

1

origin을 잘못 계산했습니다. 첫 번째 회전 후 pieceRectangles_[0]의 좌표는 (0, 10)이되므로 origin은 다음과 같이 계산됩니다. (10, 20)은 원하는 것이 아닙니다.