메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

MFC테트리스 만들기
조회 수 20,551 추천 수 0 댓글 18
?

단축키

Prev이전 문서

Next다음 문서

위로 아래로 댓글로 가기 인쇄 첨부 목록
?

단축키

Prev이전 문서

Next다음 문서

위로 아래로 댓글로 가기 인쇄 첨부 목록
?
  • 심플e 2010.11.14 01:49

    안녕하세요! 8장되니깐 갑자기 하드코어로 돌변했네요.. 질문글이 없는거 보니깐 저만 그런가요? ㅠ

    질문좀 드릴께요~~

    1. iSize가 iOneBlockSize 인것 같은데요 초기화는 안해준것 같은데 어디서 해주셨나요?? 그냥 1인가요?

    2. pDC->FillSolidRect((x)*iSize, (y)*iSize,     iSize, iSize, crRGB); 에서 crRGB란 무슨말인가요?@_@

    수고하시구요! 답변 기다리겠습니다 ^^

  • WhiteAT 2010.11.14 10:46 글쓴이

    1.

    iOneBlockSize 는  아래처럼 생성자에서 초기화 해 줍니다.^^

     

     

    CWATTetrisView::CWATTetrisView()
     : CFormView(CWATTetrisView::IDD)
    {
     //{{AFX_DATA_INIT(CWATTetrisView)
      // NOTE: the ClassWizard will add member initialization here
     //}}AFX_DATA_INIT
     // TODO: add construction code here
     m_iNowBlockShape = 0;
     m_iNowBlockDir = 0;
     m_iNowBlockX = 5;
     m_iNowBlockY = 0;
     m_iOneBlockSize = 25;

     

    해당 변수가 사용된 위치를 검색해 보는 방법을 알려 드릴께요^^

    버전마다 약간씩 다를수도 있으나 거의 비슷할 것입니다.

     

    파일(여기서는 WATTetrisView.cpp)을 열고 Ctrl + F (컨트롤 F) 를 누르면 검색창이 하나 뜹니다.

    거기에 m_iOneBlockSize 를 입력한후 [찾기]버튼을 누르면 m_iOneBlockSize 가 사용된 위치를 하나하나씩 찾을수 있습니다.~~

     

     

    2.

    벽돌색입니다.~~

        DrawOneBlock(BOARD_Y_POS + m_iNowBlockY+tempY,BOARD_X_POS + m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(250,050,250));
    처럼 호출되는데, 마지막 인자 RGB(250,050,250) 를 받습니다.

     RGB(250,050,250)는 그림처럼 분홍색 비슷한 색이라 벽돌이 분홍색 비슷하게 출력됩니다.~~

     

    즉, 벽돌색을 바꾸시려면 아래처럼 벽돌색 위치에 RGB 값을 넣어 주시면 됩니다.~~

    DrawOneBlock(BOARD_Y_POS + m_iNowBlockY+tempY,BOARD_X_POS + m_iNowBlockX+tempX,m_iOneBlockSize,&pDC, 벽돌색));

     

     

    참고로, RGB 란 Red, Green, Blue 의 줄임말로 색상을 나타내는 가장 기본적인 방법입니다..

     

     

     

    제 자료를 열심히 봐주시니 고맙습니다.~~

    파이팅 !!

     

  • 심플e 2010.11.14 16:13

    제가 감사하죠! 답변도 상세하게 잘써주시고 항상 감사히 생각하고 있습니다!

    아직은 초보 프로그래머여서요~~^^; 함수 찾는 방법 알려주셔서 감사드립니다^^

    저 근데요~ 약간 궁금증이 안풀리는게요 iSize = iOneBlockSize 라는 선언을 해준곳이 없는데 어떻게 i Size가 iOneBlockSize로 인식을 하는것인가요? 함수 선언도 없는거 같은데 소스를 계속 봐도 안보여서요^^;;

  • 심플e 2010.11.14 16:17

    심플e 님에게 달린 댓글

    수정이 안되서 리플로 달아요~

    iOneBlockSize 이 아니라 m_iOneBlociSize 로 정정할게요~

  • WhiteAT 2010.11.14 18:12 글쓴이

    심플e 님에게 달린 댓글

    함수에 대해서 조금 설명 드릴께요.~~

    아래와 같은 함수가 있을 때를 예로 들겠습니다.~~

    void CWATTetrisView::DrawOneBlock(int y,int x,int iSize,CClientDC *pDC, COLORREF  crRGB) {

                      pDC->FillSolidRect((x)*iSize, (y)*iSize,     iSize, iSize, crRGB);

                      pDC->Draw3dRect((x)*iSize, (y)*iSize,     iSize, iSize, RGB(255,255,255),  RGB(255,255,255));

    }

     
     
    DrawOneBlock(100, 200,m_iOneBlockSize,&pDC,RGB(250,050,250));   이렇게 호출을 했을 때에는
    100 은 y 에
    200 은 x 에
    m_iOneBlockSize 는 iSize 에
    RGB(250,50,250) 은 crRGB 에 입력됩니다.~~
     
  • 소마 2011.11.02 04:28

    선생님 보드 크기를 정의 내릴때요 class에서 ~view 에서

    class CtetrisssssssssssView : public CFormView
    {

    }

    이 안 어느 곳에서나 #define BOARD_X_SIZE 15
    #define BOARD_Y_SIZE 25

    #define BOARD_X_POS  25
    #define BOARD_Y_POS  2

    이렇게 정의 내리면 되는거죠

    그리고 BOARD_X_POS는 무슨 기능을 하는 변수인거죠

  • WhiteAT 2011.11.02 11:26 글쓴이

    소마 님에게 달린 댓글

    화면에 출력할 보드(게임판)의 X 위치입니다.~~

     

  • 소마 2011.11.02 04:50

    선생님 소스를 보면 int g_BoardInfo[BOARD_Y_SIZE+1][BOARD_X_SIZE+2];

    이런 소스가 있던데 이 소스의 의미가 도대체 무엇인지 잘 모르겠어서 숫자도 바꾸어보고

    해봤는데 막 보드의 벽이 2줄이 되고 그러길래 도대체 이 소스에서의 숫자의 의미는 뭐죠///

  • WhiteAT 2011.11.02 11:29 글쓴이

    소마 님에게 달린 댓글

    게임판의 변수 입니다.

     

    만약 1이면 벽돌이 있는 거구,

    0이면 벽돌이 없는거구요.^^

     

    http://whiteat.com/zbxe/43113 

    의 댓글 보시면 조금 이해가 되실겁니다.~~

  • 소마 2011.11.02 17:38

    선생님 죄송해요... 제가 아직 이해가 안되서 다시 글을 올리네요 ㅠ.ㅠ

    보드를 초기화하고 보드를 그리는 함수에 대해서 좀더 자세하게 설명해주시면

    안될까요....//

    int g_BoardInfo[BOARD_Y_SIZE+1][BOARD_X_SIZE+2];

    그리구 요기 변수와 배열 선언에서 +1과 +2의 의미를 아직도 잘 모르겠습니다...

    죄송합니다..ㅜ.ㅜ

     
  • WhiteAT 2011.11.02 17:49 글쓴이

    소마 님에게 달린 댓글

    보드 초기화 함수는 좌측벽, 우측벽, 하단 벽에 1을 넣어 주는 겁니다.^^

    '1' 로 해야 벽돌(게임 벽돌이던, 게임판에 있던 벽돌이던 모두..)이 있다는 것을 인식하게 되지요..

     

    BOARD_Y_SIZE   는 게임할때의 보드 높이입니다.

    BOARD_X_SIZE 는 게임 할때의 보드 너비이고요..

     

    보드의 하단부에 벽돌을 막아야 해서 Y +1 을 해준것이고,

    좌, 우로 벽돌을 막아야 해서 X +2 를 해준겁니다. ^^

     

    갑자기 글씨체가 기울림으로 바뀌더니 복구가 안되네요;;

  • 소마 2011.11.02 17:57

    아웅 볼수만 있으면 됬죠 ㅠ.ㅠ 감사합니다 선생님 ....

  • 소마 2011.11.09 05:02

    void CWATTetrisView::DrawOneBlock(int y,int x,int iSize,CClientDC *pDCCOLORREF  crRGB

    DrawOneBlock 함수를 추가 시키고 (괄호안에다가 적어준 것들은 함수의 변수선언과 보드그리는데 필요한 도구들 부르는거고)

      pDC->FillSolidRect((x)*iSize, (y)*iSize    iSizeiSizecrRGB);에서 ( )안에 있는 내용들은 가득찬 사각형을 그리는데

    x와 y는 크기는 i_OneBlockSize 인데 뒤에  iSizeiSizecrRGB ?이것은 뭘 의미하는거죠//

  • 소마 2011.11.09 05:28

    CanMove함수에대해서 제 생각을 말해볼게요 선생님...

           for (int iTempBlockY = 0;iTempBlockY<4;iTempBlockY++)

                      {

                                       for (int iTempBlockX = 0;iTempBlockX<4;iTempBlockX++)

                                       {

    이 의미에 대해서는 잘 모르겠습니다.(변수의미와 여러가지에대해 알려주세요ㅜ.ㅜ) 그래서 그 다음부터 말해볼게요..

    일단.. 관계 연산자 != 와 논리 연산자가 들어가네요...

    if( 0!=보드 &&  0!=벽돌)

    만약  보드의 값을  0과 비교해서 다른값이 나오면 != 때문에 참이니까 보드의 벽이 1이니깐 보드벽은 참 내부는 거짓

              벽돌을 0과 비교해서 다른값이 나오면 != 때문에 벽돌이있다는 뜻이니깐  1이있는곳에 따라  벽돌모양이 나오겠죠.

               그래서 보드 와  벽돌을 && 을 하면 보드의 값이0 벽돌의 값이1일 땐은 &&이 거짓이라서 return True 여서

       계속 if문 반복하다가

       보드의 벽 즉 1의 값과 만나면 값이 참이 되니깐 return false가 되서 밖으로 못나간다고 해야하죠//

    선생님이 부족하다 싶은것좀 설명해주세요 ㅠ.ㅠ

  • 소마 2011.11.09 09:05

    Draw3dRect 어떤 특징을 가진 사각형을 그리는 거죠///

  • WhiteAT 2011.11.09 10:06 글쓴이

    소마 님에게 달린 댓글

    본문에 있는 거처럼(?) 3차원 비슷하게 벽돌이 표현되는 메소드입니다.

  • 소마 2011.11.09 09:56

    선생님 좌로,우로,회전,체크를 할때요 좌로 체크는 m_iNowBlockX-1이고, 우로 체크는 m_iNowBlockX+1,

    회전체크일때는 ?m_iNowBlockDir+1 이고 아래로 가는 키는 m_iNowBlockY+1, ?m_iNowBlockDir+1 이던데

    이건 왜 이렇게 지정한거죠////

  • WhiteAT 2011.11.09 10:09 글쓴이

    소마 님에게 달린 댓글

    이 부분은 변수의 의미를 생각하시면 금방 이해 되실거 같은데요..

    좌측으로 움직이면 벽돌은 m_iNowBlockX-1 이 됩니다.

     

    미리 좌측으로 이동했을 때 겹치는게 있는지 검사한후 겹치는게 있으면 이동하지 않으려는 부분입니다.

    다른 변수도 마찬가지구요.~~

     

    댓글이 여러군데 있어 답변하기가 약간 힙듭니다.^^

    http://whiteat.com/zbxe/WhiteAT_QnA 에 남겨 주시면 감사하겠습니다.~~