방법1

[06]벽돌 모양 만들기 & 벽돌회전

by WhiteAT posted Oct 15, 2007
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

위로 아래로 댓글로 가기 인쇄 첨부 목록
?
  • 냥냥 2009.04.02 09:24 SECRET

    "비밀글입니다."

  • WhiteAT 2009.04.03 07:04 글쓴이

    냥냥 님에게 달린 댓글

    m_iNowBlockY 라는 변수는 벽돌이 위에서 아래로 내려오는 칸수를 말합니다.^^

    즉, 벽돌이 바닥(m_iNowBlockY 가 20인 위치)에 오면 다시 맨위(m_iNowBlockY=0)이 되는 위치부터
    다시 시작하게 되는 겁니다.~~

    조금이라도 이해가 안되시면 다시 글 올려 주세요 ^^.
  • ㅇㅇㅇ 2010.06.28 14:47

    int g_NowBlockInfo[4][4]={

    {0,1,0,0}, {0,1,0,0}, {0,1,1,0},{0,1,0,0}

    };

    이부분 어떻게해야 할수잇나요?

    저렇게 중괄호로 초기화하려면 선언이랑 정의랑 동시에할때만 된다든데...

    헤더파일에서 선언하고 cpp파일에서 저렇게 초기화하려니까안되네여ㅠㅠ

     

  • ㅇㅇㅇ 2010.06.28 14:52

    ㅇㅇㅇ 님에게 달린 댓글

    으 소스코드볼생각을못햇네여 ㅋㅋ

    전역변수로하면되는군여 ㅠ,ㅠ;;;

  • WhiteAT 2010.06.28 18:03 글쓴이

    ㅇㅇㅇ 님에게 달린 댓글

    ^^ 궁금한거 있으시면 바로 글 올려 주세요.~~

  • 냐옹 2010.07.23 14:31 Files첨부 (1)

    C:\Documents and Settings\USER\바탕 화면\WATTetris\WATTetrisView.cpp(235) : fatal error C1071: unexpected end of file found in comment

     

    에러이유가 머죠??

    제가 작성한 코드 올려드립니다

  • WhiteAT 2010.07.23 16:11 글쓴이

    냐옹 님에게 달린 댓글

    올려 주신 파일만으로는 확인할수가 없네요 ㅡㅡ;

     

    중괄호 { , } 의 갯수를 확인해 보세요.~~

    프로그램의 끝을 찾지 못해 발생한 에러입니다..

     

  • 심플e 2010.10.07 17:21

    pDC.FillSolidRect((m_iNowBlockX+tempX)*m_iOneBlockSize, (m_iNowBlockY+tempY)*m_iOneBlockSize,

                                                                                            m_iOneBlockSize, m_iOneBlockSize, RGB(250,250,250));

     

    ==========================================================================================

     

     (m_iNowBlockX+tempX)*m_iOneBlockSize

    이 부분에서 왜 * 를 해주는건가요? 곱해주면  (m_iNowBlockX+tempX) 커질수록 점점 수가 늘어나지 않나요?

    답변 부탁드립니다^^;

  • WhiteAT 2010.10.08 07:13 글쓴이

    4장의 키보드로 벽돌 움직이기를 먼저 보셔야 할거 같습니다.^^

    http://whiteat.com/zbxe/5936

     

    4장 코드에 아래처럼 되어 있는데, 50을 곱해줍니다.

     pDC.FillSolidRect(m_iNowBlockX*50, m_iNowBlockY*50, 50,50, RGB(250,250,250));

    참고로 50은 벽돌 하나의 가로,세로 사이즈 입니다. 

     

      그리고 파라미터 형태를 확인해보세요~~

    x,y가 윈도우 좌표라서 block칸이 한개 늘어 날때마다 좌표를 늘려야 합니다.^^

     void FillSolidRect(int x, int y, int cx, int cy, COLORREF clr);

     

    다시 천천히 보시면 이해 되실겁니다.^^

  • 심플e 2010.10.30 12:12

    선생님 질문있는데요~

    BOOL CTetrisView::MoveUp()
    {
     m_iNowBlockDir = (++m_iNowBlockDir)%4;
     Invalidate();
     return TRUE;
    }

     

    코딩부분에서요~

    (++m_iNowBlockDir)%4

    가 무엇을 의미하는건가요? m_iNowBlociDir에 1씩 더해주고 4로 나누어주라는뜻으로 이해가 가는데요;;

    어떤원리로 해서 up 버튼을 누르면(저명령어가 실행되어서) 모양이 바뀌는건가요?? 답변 부탁드립니다!^^

  • WhiteAT 2010.10.30 14:53 글쓴이

    심플e 님에게 달린 댓글

    선생님이라고 하시면 부담스러워요 ^^

     

    m_iNowBlociDir에 1씩 더해주고 4로 나누어주라는뜻이 맞습니다.~~

    즉 m_iNowBlociDir 이 0, 1, 2, 3, 0, 1, 2, 3 ..... UP 누를때마다 반복적으로 변하고,

    m_iNowBlociDir 는 벽돌모양을 나타내는 변수입니다.

     

    지금은 기억이 안나지만 ;;;

    0 은 기본 모양

    1 은 90도 반시계방향 회전한 모양

    2 은 180도 반시계방향 회전한 모양

    3 은 180도 반시계방향 회전한 모양

     

    일겁니다.~~

  • 심플e 2010.10.31 18:54

    WhiteAT 님에게 달린 댓글

    답변 감사합니다! 근데요 %4가 왜이렇게 이해가 안가는지 모르겠어요 ㅠ(프로그램상 어느위치로 가서 처리가 되는지..)

    우선 아래와 같이 배열이 있습니다.

    iNowBlociDir = 0 으로 초기치를 주었구요 iNowBlociDir 가 배열 [4][4][4] 첫번째를 말하는거잖아요..

    int g_NowBlockInfo[*][4][4]= 요부분..

    iNowBlociDir ++ 를 해주면 1인데 그걸 다시 4로 나누면 0.25가 되면..

    0->0.25->0.5->0.75->1

      {0,1,0,0},
      {0,1,0,0},
      {0,1,1,0},
      {0,1,0,0}

    에서

      {0,0,0,0},
      {0,1,0,0},
      {1,1,1,1},
      {0,0,0,0}

    으로 넘어가는 것인가요??

    왜 이리 이해가 안가는지 모르겠어요 ㅠㅠ

    죄송하지만 조금만 더 설명 부탁드릴게요~~ ^^;;

    //////////////////////////////////////////////////////////// 

    int g_NowBlockInfo[4][4][4]={

     {
      {0,1,0,0},
      {0,1,0,0},
      {0,1,1,0},
      {0,1,0,0}
     },

     {
      {0,0,0,0},
      {0,1,0,0},
      {1,1,1,1},
      {0,0,0,0}
     },

     {
      {0,0,1,0},
      {0,0,1,0},
      {0,1,1,0},
      {0,0,1,0}
     },

     {
      {1,1,1,1},
      {0,0,1,0},
      {0,0,0,0},
      {0,0,0,0}
     }
    };

    ///////////////////////////////////////

  • WhiteAT 2010.10.31 21:46 글쓴이

    int 의 나누기와 % 연산자를 간단하게 설명해 드릴게요~~

     

    int 로 나누기를 하면 소수점이 나오지 않습니다.

    1/4  = 0.25 인데, 1보다 작기에 0 입니다.

    2/4  = 0.50 인데, 1보다 작기에 0 입니다.

    3/4  = 0.75 인데, 1보다 작기에 0 입니다.

    4/4  = 1.00 이라                           1 입니다.

    5/4  = 1.25 인데, 2보다 작기에 1 입니다.

    즉 소수점 이하는 버리게 됩니다.

     

     

    그리고 % 는 나머지 연산자인데 나머지값이 입력됩니다.

    1%4  일때 몫은 0 이고 나머지는 1 입니다.

    2%4  일때 몫은 0 이고 나머지는 2 입니다.

    3%4  일때 몫은 0 이고 나머지는 3 입니다.

    4%4  일때 몫은 1 이고 나머지는 0 입니다.

    5%4  일때 몫은 1 이고 나머지는 1 입니다.

    즉 %4 연산을 하면 0, 1, 2, 3, 0, 1, 2,3,.... 이 반복되는 겁니다.^^

     

     

  • 심플e 2010.11.01 20:44

    WhiteAT 님에게 달린 댓글

    아... 이런이런!! 제가 가장 기본적인것을 놓치고 있었네요.. 죄송합니다

    이런것까지 질문드리면 안되는데 ㅠㅠ

    너무 친절한 설명 감사합니다 ㅠㅠ

     

  • WhiteAT 2010.11.02 10:10 글쓴이

    심플e 님에게 달린 댓글

    조금이라도 이상한거 있으시면 물어 보세요^^

     

    혼자서 낑낑(?)하다보면 확실히 배우긴 하지만  하나 배우는데 너무 오랜 시간이 걸리게 됩니다.

    요즘은 많이 배워서 얼마나 잘 활용하는지가 중요하기 때문에 신속히 많은 정보를 얻는게 좋습니다.~~

  • GodOfEmperor 2011.05.27 02:51

    for문에서 중간에 (1 == g_NowBlockInfo[m_iNowBlockDir][tempY][tempX])이 부분이 이해가 안가요 ㅠ.ㅠ

    :괄호안 첫번째에 숫자 1이 뭔지.. 그리고 그 외의 부분도 궁금합니다.

    제가 초보라 힘드네요 부탁드려요 ㅠ.ㅠ

  • WhiteAT 2011.05.27 07:44 글쓴이

    GodOfEmperor 님에게 달린 댓글

    먼저 벽돌의 구조 4x4 배열로 생각하셔야 합니다.~~

     

    1 이면 벽돌이 있는 겁니다.^^, 0이면 벽돌이 없는 거구요

    (그냥 0, 1을 구분해 주는 정도입니다.)

    추후에 숫자 2,3,4,5 등을 추가하여 폭탄 등 아이템을 만들수 도 있을 겁니다.^^

     

     

    그래서 1이면 벽돌이 있으니 다른 벽돌이 있는 곳으로 이동할수가 없고

    0 이면 벽돌이 없는 것이니 아무곳으로 이동할 수 있겠죠.

     

     

  • 소마 2011.11.02 04:43

    int g_NowBlockInfo[7][4][4][4]라는 변수명과 배열선언을 보았을때

    변수의 뜻은 현재블록의 정보라는 뜻인거고,[7][4][4][4]라는 배열 선언은

    [7]은 총 블럭의 갯수 첫번째 [4]는 블록의 회전수 두번째 [4]는 블럭의 가로 모양

    세번째[4] 블럭의 세로 모양인가요...///

  • WhiteAT 2011.11.02 11:42 글쓴이

    소마 님에게 달린 댓글

    배열은 뒤에부터 보는게 편합니다.^^

     

    뒤의[4][4]는 4x4 배열의 벽돌이며,

    두번째 [4]는 회전하는 모양이 4가지 이며,

    [7]은 전체 벽돌 종류가 7가지라는 의미입니다.^^

  • 소마 2011.11.02 17:25

    선생님 블록 모양을 만드는데 배열을 사용하는 이유가 위에서도 언급하셨듯이

    아무래도 편의성 때문이겠죠///

    만약 FormView에서 또 다른 방법으로 블록모양을 만드는 방법도 있나요///

  • WhiteAT 2011.11.02 17:52 글쓴이

    소마 님에게 달린 댓글

    다른 방법이 있으면 그걸로 하시면 됩니다.^^

    혹시 다른 방법 있으면 알려 주세요~~

     

    그냥 변수를 7 x 4 x 4 x 4 개, 즉 12544개를 만들어서 하셔도 됩니다.^^

    (이건 농담;;)

     

  • 소마 2011.11.03 03:39

    우와 마지말에서 완전 소름 돋았어요....

    배열쓰는 이유를 알겠어요ㅋㅋㅋ

  • 소마 2011.11.08 02:04

    선생님 변수의 뜻에서 부터 알아갈려구요..ㅋ 4장에서 변수명 선언을 보고나서 변수들이 이해가 가네요..

    여기서 변수면 m_iNowBlockDir이 블럭회전의 변수인거는 대충 감이오는데 Dir이 무슨 뜻이죠/////

    그리고 g_NowBlockInfo 앞에 g는 무슨 뜻이에요///

  • WhiteAT 2011.11.08 10:00 글쓴이

    소마 님에게 달린 댓글

    Direction 방향이라는 의미로 사용하였습니다.~

     

    g_AAA 는 Global 변수를 의미하며, 프로그램 전체 영역에서 사용할 수 있다는 것을 뜻합니다.

    m_AAA 는 Member 변수이며, 클래스 내에서만 사용가능하다는 것을 뜻합니다.

     

    프로그램 규모가 커지게 되면...... 전역변수인지 로컬변수인지 구별해서 사용할 필요가 있게 됩니다.

     

     

    이렇게 접두어를 붙여 사용하는 것을 '헝가리안 표기법'이라고 하고

    한때 MS 에서도 거의 법(?)처럼 여겨져 오던 방식인데....

     

    요즘은 윈도우 프로그램 쪽의 라이브러리가 클래스화가 잘 되어 있어서 별로 사용되지 않고 있습니다.

    (즉, 대부분 필요한 함수가 라이브러리로 다 되어 있어서 전역 변수가 많이 사용되지 않습니다..)

     

    지금은 헝가리안 표기법이 전역 변수를 많이 사용하는 펌웨어 쪽에서

    주로 사용됩니다.^^

     

  • 코더 2015.12.02 03:31

    블럭의 기본 요소가 사각형(Rect)이 아닌 육각형(Hexa)로 구성하려고 합니다.

    CClient클래스에 육각형을 그려주는 멤버함수는 없는 것 같아 구현하고자 하는데

    어떤 방법이 있나요 선생님. 제생각 에는 FillSolidRect함수를 공부해서 육각형으로 구현하려고했는데

    상세 정보는 어디서 알아야 할지 모르겠습니다.

    bmp로 그려 주는 방법도 생각했는데 이땐 어떻게 처리해야하는지 궁금합니다!

  • WhiteAT 2015.12.02 17:16 글쓴이

    코더 님에게 달린 댓글

    안녕하세요.

    FillSolidRect 는 사각형 그리는 메소드(함수) 입니다.


    Polygon() 을 사용하시면 다각형을 그릴 수 있습니다.

    육각형을 그리시려면 가운데 점에 따른 각 6개의 포인트 값은 직접 계산해 주셔야 합니다.^^

    https://msdn.microsoft.com/ko-kr/library/hhkhd4xz.aspx 참조하세요.


    bmp 는 그 모양에 적당히 입혀 주면 될거 같습니다.


    파이팅!!

  • 코더 2015.12.03 02:43

    WhiteAT 님에게 달린 댓글

    와.. 아직도 계시네요 ㅠㅠ 답변 감사합니다!! 한번 해보겠습니다!


  • 코더 2015.12.03 02:59

    Polygon() 메소드를 이용해 육각형을 만드는 방법을 알았습니다!

    그런데 일반 테트리스는 FIllSolidRect 메소드 경우 매개 변수로

    FillSolidRect(m_iNowBlockX*m_iOneBlockSize, m_iNowBlockY*m_iOneBlockSize, m_iOneBlockSize, m_iOneBlockSize, RGB(250,250,0)) 식으로 쓰여 키보드로 제어 할 수 있게 되는데 

    polygon()메소드를 통해 그려진 육각형 제어는 어떤식으로 하나요!? (최종 목표는 헥사 테트리스입니다!)

  • 코더 2015.12.03 23:58

    코더 님에게 달린 댓글

    즉 채우는 도형을 사각형이 아닌 육각형으로 하고 싶습니다.

  • WhiteAT 2015.12.04 10:25 글쓴이

    코더 님에게 달린 댓글

    안녕하세요~


    육각형 모양의 게임이 있어 링크 걸어 드립니다. 

    6개의 점을 sin(), cos() 함수로 구하며, 그림으로 잘 나와 있습니다.



     private void CalculateVertices()
        {
            h = Hexagonal.Math.CalculateH(side);
            r = Hexagonal.Math.CalculateR(side); 
            switch (orientation)
            {       
                case Hexagonal.HexOrientation.Flat:
                    // x,y coordinates are top left point
    
                    points = new System.Drawing.PointF[6];
                    points[0] = new PointF(x, y);
                    points[1] = new PointF(x + side, y);
                    points[2] = new PointF(x + side + h, y + r);
                    points[3] = new PointF(x + side, y + r + r);
                    points[4] = new PointF(x, y + r + r);
                    points[5] = new PointF(x - h, y + r );
                    break;
                case Hexagonal.HexOrientation.Pointy:
                    //x,y coordinates are top center point
    
                    points = new System.Drawing.PointF[6];
                    points[0] = new PointF(x, y);
                    points[1] = new PointF(x + r, y + h);
                    points[2] = new PointF(x + r, y + side + h);
                    points[3] = new PointF(x, y + side + h + h);
                    points[4] = new PointF(x - r, y + side + h);
                    points[5] = new PointF(x - r, y + h);
                    break;
                default:
                    throw new Exception("No HexOrientation defined for Hex object.");
            }
        }

    참고하세요.~

    http://www.codeproject.com/Articles/14948/Hexagonal-grid-for-games-and-other-projects-Part