2009년 01월 23일
공튀기기 프로젝트
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 자료 | 트랙백











