공튀기기 프로젝트

1. 윈도우창 안에서 8개의 공이 움직이게 되고, 공끼리 또는 벽에 공이 부딪히면
노락색 -> 파란색 -> 빨간색순으로 공의 색이 변하게 되며, 오른쪽 구석의
블랙홀공간에 공이 들어가게 되면 공의 움직임은 멈춘다.

아래의 소스는 핵심 부분만 올려놓았다.



void CBounceView::OnInitialUpdate()
{
 CView::OnInitialUpdate();
 
 // 0.05초마다 WM_TIMER 메시지가 발생하도록 설정
 SetTimer(0, 5, NULL);
}

void CBounceView::OnDestroy()
{
 CView::OnDestroy();
 
 // 타이머를 꺼줌
 KillTimer(0);
}

void CBounceView::OnTimer(UINT nIDEvent)
{
 CClientDC dc(this);

 //공 출력
 for(int i=0; i<Ball; i++)
 {
  if((x_mx[i] >= x1) && (x_my[i] >= y1))
  {
   nCX[i]=0;
   nCY[i]=0;
   Con[i]=0, Len[i]=0, Ken[i]=0;
  }
  alstkddlkr(i);
 }
 
 //원의 두개의 좌표가 같아지면 CntCo함수를 호출
 //버블 정렬의 응용
 for(i=0; i<Ball; i++)
 {
  for(int j=i+1; j<Ball; j++)
  {
   if( ((x_mx[i]) == (x_mx[j])) && ((x_my[i]) == (x_my[j])) )
   {
    MessageBox("충돌");
    CntCo(i,j);
   }
  }
 }
 ChCo();
 CView::OnTimer(nIDEvent);
}

void CBounceView::alstkddlkr(int i)
{
 CPen pen,*OldPen;
 CClientDC dc(this);
 CBounceDoc *pDoc = GetDocument();
 
 CRect rect;       // 클라이언트 영역의 크기
 GetClientRect(&rect);    // 클라이언트 영역의 크기를 얻음
 
 pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
 OldPen=(CPen*)dc.SelectObject(&pen);
 // 이전 공을 지우기 위해 흰색 브러시를 선택
 dc.SelectStockObject(WHITE_BRUSH);
 dc.Ellipse(nX[i]-R, nY[i]-R, nX[i]+R, nY[i]+R); // 원 그리기
 
 // x 좌표 변경
 if(nX[i] < R)
 {
  nCX[i] = (STEP_1+i);
  CntCo(i,0,1); //벽에 팅기기 때문에 i값만 바까줌 j 값은 0 m은 1
 }
 else if(nX[i] > rect.Width()-R)
 {
  nCX[i] = -(STEP_1+i);
  CntCo(i,0,1); //벽에 팅기기 때문에 i값만 바까줌 j 값은 0 m은 1
 }
 nX[i] += nCX[i];
 
 //y 좌표 변경
 if(nY[i] < R)
 {
  nCY[i] = (STEP_1+i);
  CntCo(i,0,1); //벽에 팅기기 때문에 i값만 바까줌 j 값은 0 m은 1
 }
 else if(nY[i] > rect.Height()-R)
 {
  nCY[i] = -(STEP_1+i);
  CntCo(i,0,1); //벽에 팅기기 때문에 i값만 바까줌 j 값은 0 m은 1
 }
 nY[i] += nCY[i];
 
 // 새로 공을 그리기 위해 빨간색 브러시 생성
 CBrush brush, *pOldBrush;
 brush.CreateSolidBrush(RGB(Con[i], Len[i], Ken[i]));
 
 // DC에 빨간색 브러시 선택
 pOldBrush = (CBrush *)dc.SelectObject(&brush);
 dc.Ellipse(nX[i]-R, nY[i]-R, nX[i]+R, nY[i]+R); // 원 그리기
 x_mx[i] = nX[i];   //좌표값 저장
 x_my[i] = nY[i];   //좌표값 저장
 dc.SelectObject(pOldBrush);   // DC 복원

 CBrush brush1, *pOldBrush1;
 brush1.CreateSolidBrush(RGB(0, 0, 0));
 pOldBrush1 = (CBrush*) dc.SelectObject (&brush1);
 dc.Rectangle(x1, y1, x2, y2); // 블랙홀 그리기
}

void CBounceView::ChCo()
{
 for(int i=0; i<Ball; i++)
 {
  //Q[i] 값이 2이면 노란색 0이면 파란색 1이면 빨간색
  switch(Q[i])
  {
  case 0 : Con[i]=255, Len[i]=255, Ken[i]=0;
   break;

  case 1 : Con[i]=0, Len[i]=0, Ken[i]=255;
   break;

  case 2 : Con[i]=255, Len[i]=0, Ken[i]=0;
   break;
  }
 }
}

by 유니콘 | 2009/01/23 14:36 | MFC 자료 | 트랙백

※ 로그인 사용자만 덧글을 남길 수 있습니다.

◀ 이전 페이지          다음 페이지 ▶