PacMan 개발 - 적과 대입

5031 단어
GDI 그래픽 장치 인터페이스는 Windows API가 개발자에게 창 프로그램을 처리할 수 있도록 제공하는 함수 인터페이스입니다.
드로잉 핸들 HDC:
HDC hdc=GetDC(HWND hWnd);
선 그리기
MoveToEx(HDC hdc,int x,int y,LPPOINT preP);

이렇게 하면 우리는 적과 입이 큰 이미지를 그릴 수 있다.
세 가지 적을 그리기:
void Enermy::Draw(HDC& hdc)//    
{
	HPEN pen = ::CreatePen(0, 0, color);
	HPEN oldPen = (HPEN)SelectObject(hdc, pen);
	Arc(hdc, point.x - DISTANCE, point.y + DISTANCE,
		point.x + DISTANCE, point.y + DISTANCE,
		point.x + DISTANCE, point.y,
		point.x - DISTANCE, point.y);//     
	int const LEGLENTH = (DISTANCE) / (LEGCOUNTS);
	//            
	if (frame % 2 == 0)
	{
		MoveToEx(hdc, point.x - DISTANCE, point.y, NULL);
		LineTo(hdc, point.x - DISTANCE, point.y + DISTANCE - LEGLENTH);
		MoveToEx(hdc, point.x + DISTANCE, point.y, NULL);
		LineTo(hdc, point.x + DISTANCE, point.y + DISTANCE - LEGLENTH);
		for (int i = 0; i < LEGCOUNTS; i++)
		{
			Arc(hdc, point.x - DISTANCE + i * 2 * LEGLENTH, point.y + DISTANCE - 2 * LEGLENTH,
				point.x - DISTANCE + (i + 1)*2 * LEGLENTH, point.y + DISTANCE,
				point.x - DISTANCE + i * 2 * LEGLENTH, point.y+DISTANCE-LEGLENTH,
				point.x - DISTANCE + (i + 1) * 2 * LEGLENTH, point.y + DISTANCE - LEGLENTH
				);
		}
	}
	else
	{
		MoveToEx(hdc, point.x - DISTANCE, point.y, NULL);
		LineTo(hdc, point.x - DISTANCE, point.y + DISTANCE);
		MoveToEx(hdc, point.x + DISTANCE, point.y, NULL);
		LineTo(hdc, point.x + DISTANCE, point.y + DISTANCE);
		//        
		MoveToEx(hdc, point.x - DISTANCE, point.y+DISTANCE, NULL);
		LineTo(hdc, point.x - DISTANCE+LEGLENTH, point.y + DISTANCE - LEGLENTH);
		for (int i = 0; i < LEGCOUNTS - 1; i++)
		{
			Arc(hdc, point.x - DISTANCE + (1 + i * 2) * LEGLENTH, point.y + DISTANCE - 2 * LEGLENTH,
				point.x - DISTANCE + (3 + i * 2) * LEGLENTH, point.y + DISTANCE,
				point.x - DISTANCE + (1 + i * 2) * LEGLENTH, point.y + DISTANCE - LEGLENTH,
				point.x - DISTANCE + (3 + i * 2) * LEGLENTH, point.y + DISTANCE - LEGLENTH
				);
		}
		MoveToEx(hdc, point.x + DISTANCE, point.y + DISTANCE, NULL);
		LineTo(hdc, point.x + DISTANCE - LEGLENTH, point.y + DISTANCE - LEGLENTH);
	}
	//        
	int R = DISTANCE / 5;
	switch (tw)
	{
	case UP:
		Ellipse(hdc, point.x - 2 * R, point.y - 2 * R, point.x, point.y);
		Ellipse(hdc, point.x, point.y - 2 * R, point.x + 2 * R, point.y);
		break;
	case DOWN:
		Ellipse(hdc, point.x - 2 * R, point.y, point.x, point.y + 2 * R);
		Ellipse(hdc, point.x, point.y, point.x + 2 * R, point.y + 2 * R);
		break;
	case LEFT:
		Ellipse(hdc, point.x - 3 * R, point.y - R, point.x - R, point.y + R);
		Ellipse(hdc, point.x - R, point.y - R, point.x + R, point.y + R);
		break;
	case RIGHT:
		Ellipse(hdc, point.x - R, point.y - R, point.x + R, point.y + R);
		Ellipse(hdc, point.x + R, point.y - R, point.x + 3 * R, point.y + R);
		break;
	}
	frame++;//       
	SelectObject(hdc, oldPen);
	DeleteObject(pen);
	return;
}

큰 입 그리기
void PacMan::Draw(HDC& memDC)
{
	if (tw == OVER)
	{

	}
	else if (frame % 2 == 0)// 4   2   
	{
		int x1 = 0, x2 = 0, y1 = 0, y2 = 0;
		int offsetX = DISTANCE / 2 + D_OFFSET;
		int offsetY = DISTANCE / 2 + D_OFFSET;
		switch (tw)
		{
		case UP:
			x1 = point.x - offsetX;
			x2 = point.x + offsetX;
			y2 = y1 = point.y - offsetY;
			break;
		case DOWN:
			x1 = point.x + offsetX;
			x2 = point.x - offsetX;
			y2 = y1 = point.y + offsetY;
			break;
		case LEFT:
			x1 = x2 = point.x - offsetX;
			y1 = point.y + offsetY;
			y1 = point.y - offsetY;
			break;
		case RIGHT:
			x1 = x2 = point.x + offsetX;
			y1 = point.y - offsetY;
			y1 = point.y + offsetY;
			break;
		}
		Arc(memDC, point.x - DISTANCE, point.y - DISTANCE, point.x + DISTANCE, point.y + DISTANCE, x1, y1, x2, y2);
		MoveToEx(memDC, x1,y1,NULL);
		LineTo(memDC, point.x, point.y);
		LineTo(memDC, x2,y2);
	}
	else if (frame % 3 == 0)
	{
		Ellipse(memDC, point.x - DISTANCE, point.y - DISTANCE, point.x + DISTANCE, point.y + DISTANCE);
	}
	else
	{
		int x1 = 0, x2 = 0, y1 = 0, y2 = 0;
		switch (tw)
		{
		case UP:
			x1 = point.x - DISTANCE;
			x2 = point.x + DISTANCE;
			y2 = y1 = point.y;
			break;
		case DOWN:
			x1 = point.x + DISTANCE;
			x2 = point.x - DISTANCE;
			y2 = y1 = point.y;
			break;
		case LEFT:
			x2 = x1 = point.x;
			y1 = point.y + DISTANCE;
			y2 = point.y - DISTANCE;
			break;
		case RIGHT:
			x2 = x1 = point.x;
			y1 = point.y - DISTANCE;
			y2 = point.y + DISTANCE;
			break;
		}
		Arc(memDC, point.x - DISTANCE, point.y - DISTANCE, point.x + DISTANCE, point.y + DISTANCE, x1, y1, x2, y2);
		MoveToEx(memDC, x1, y1, NULL);
		LineTo(memDC, point.x, point.y);
		LineTo(memDC, x2, y2);
	}
	frame++;//     
}

세 종류의 적이 있기 때문에 우리는 그들에게 색깔을 부여하여 식별할 수 있다.
//      
RedOne(int x, int y) :Enermy(x, y)
{
	color = RGB(255, 0, 0);
}
BlueOne(int x, int y) : RedOne(x, y)
{
	color = RGB(0, 0, 255);
}
YellowOne(int x, int y) : RedOne(x, y)
{
	color = RGB(200, 200, 100);
}


@ Mayuko

좋은 웹페이지 즐겨찾기