80 likes | 195 Views
Goliat Defence. 정보통신 공학부 12031289 이숭현. ◎ 게임 설명 1. 좌우 방향키를 이용하여 골리앗을 움직이게 하고 스페이스 바 로 미사일을 쏜다 2. 전체 레벨은 3 단계로 구성되어 있으며 1,2 레벨은 비슷 한 방식으로 진행되어 지고 레벨 3 은 제한 시간안에 미션을 완수 해야 한다 .
E N D
Goliat Defence 정보통신 공학부 12031289 이숭현
◎게임 설명 1.좌우 방향키를 이용하여 골리앗을 움직이게 하고 스페이스 바 로 미사일을 쏜다 2.전체 레벨은 3단계로 구성되어 있으며 1,2 레벨은 비슷 한 방식으로 진행되어 지고 레벨 3은 제한 시간안에 미션을 완수 해야 한다. 3. 미사일은 한 화면에 2개만 발사 되며 우측에서 출발한 목표물이 좌측끝으로 도달하면 life가 감소하고 목표물을 적중시키면 점수가 오르고 3000점 돌파 시 레벨2 7000점 돌파 시 레벨 3 으로 올라 갈수 있다.
Level1의 화면 Level2 의 화면 Level3 의 화면
◈ 알고리즘 1.미사일 발사(제일 어려웠던 부분) - Cpoint 형 GunPoint(미사일 위치)를 만들고 미사일을 그리는 함수 ,지우는 함수를 만든다(미사일에 해당하는 타이머에 적당히 구현) GunDelete(CDC *pDC, CPoint point) Gun(CDC *pDC, CPoint point) - 목표물이 맞았을 상황을 고려하여 첫 번째 미사일이 맞았을 때와 두 번째 미사일이 맞았을 때를 고려하여 프로그래밍함 for(int i=0;i<GunCount;i++) {if(i==0) {…………..} if(i!=0){…………………}} - 먼저 쏜 미사일이 적중안하고 다음으로 쏜 미사일이 적중하였을 경우 두 미사일간 y 좌표값 의 차이를 나중에 쏜 미사일에 더해주어서 먼저발사 미사일을 없애고 나중에 발사된 미사일도 대체함 GapSize=aGunPoint[i].y-aGunPoint[i-1].y; aGunPoint[i].y=aGunPoint[i].y-GapSize; aGunPoint[i].x=aGunPoint[i-1].x; GunPoint[i-1].y=0; - 미사일의 타이머에 목표 유닛의 좌표와 미사일의 좌표와의 비교를 통하여 적중시 할 일을 정해줌 if(aGunPoint[i].x>=ArcanPoint.x+1 && aGunPoint[i].x<=ArcanPoint.x+65 && aGunPoint[i].y>=ArcanPoint.y && aGunPoint[i].y<=ArcanPoint.y+79 ) {………….}
▣유닛의 구현 • 게임의 특성상 여러가지 유닛이 나와야 하기때문에 비트맵을 이용해서 프로 그래밍 함(팬과 브러쉬로는 한계를 느낌) • 우선 실제 스타크래프트 게임에서 직접 게임도중 게임화면을 켑쳐하여 포토샵으로 해당 유닛을 오린후 bmp화일로 만들어서 프로그램에 삽입 (삽입후 각자 유닛의 비트맵 ID를 만들어줌) - 각각의 유닛마다 Draw함수와 위치를 나타내는 Cpoint형 변수를 만듬 void CGameView::DrawArcan(CDC *pDC, CPoint point)//아칸 그리는 함수 {CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap bitmap; bitmap.LoadBitmap(IDB_Arcan); CBitmap *pOldBitmap=(CBitmap *)MemDC.SelectObject(&bitmap); pDC->BitBlt(point.x,point.y,66,80,&MemDC,0,0,SRCCOPY);//각각 유닛의 크기에 따라 좌표를 설정한다 MemDC.SelectObject(pOldBitmap);} • 각유닛에 해당하는 타이머에 유닛마다 구현된 Draw 함수를 넣어줌 • 항상 화면에 있어야 하는 골리앗은 키보드 이벤트가 발생할때 마다 OnDraw 함수에서 새로 그려줌
- 유닛이 랜덤하게 움직이게 하기위하여 랜덤 함수를 사용하였고 위아래로 움직일 범위도 설정해줌 =>타이머에 구현된부분 ArcanPoint.x=ArcanPoint.x-2*(rand()%6);//움직임의 변화를 주기위해서 랜덤함수를 사용 ArcanPoint.y=ArcanPoint.y-3*(rand()%4);//나머지 유닛도 마찬가지 형식 이용 ArcanPoint.y=ArcanPoint.y+3*(rand()%3);//각유닛마다 적당한 움직임 범위 적용 if(ArcanPoint.y<=40)//상하로 움직일 범위를 지정 {ArcanPoint.y=40;} if(ArcanPoint.y>=300) {ArcanPoint.y=300;} if(ArcanPoint.x<0) //유닛이 좌측끝에 도착하면 처음 좌표를 다시 정해줌 { ArcanPoint.x=800; ArcanPoint.y=50; Life--;} - 레벨 3에서는 레벨 1,2와는 다르게 적중하는 개수를 알아야 하므로 ComHit 라는 변수를 설정하여 에너지 바를 그려줌 void CGameView::DrawEnerge(CDC *pDC)//에너지 게이지를 나타내는 함수 { CBrush brush, *pOldBrush; brush.CreateSolidBrush(RGB(0,255,0)); pOldBrush=(CBrush *)pDC->SelectObject(&brush); pDC->Rectangle(600,20,600+(5*ComHit),40); pDC->SelectObject(pOldBrush);} -ComHit를 30으로 초기화 하고 한번 적중할때 마다 ComHit를 한개씩 줄여주고 0이 되면 게임전체가 끝남
◈레밸설정 • OnDraw 함수에 각레벨에 해당할때 할일을 정해줌 다음 레벨에서 필요한 타이머를 만들어주고 전레벨에서 썻던 필요없는 타이머는 없앰 각각의 레벨마다 필요한 변수를 초기화 시킴 if(3000<=GameScore && Level==1)//3000점이 넘었을때 레벨이 올라갈때 {Level++; KillTimer(1); KillTimer(2); ArcanPoint=CPoint(800,50);//좌표가 총과 겹칠수 있으므로 처음 위치로 보낸다 OverloadPoint=CPoint(800,300); ShuttlePoint=CPoint(800,180); Invalidate();//레벨1이 끝나면서 화면을 깨끗이 함 MessageBox("★★대단해요~~~ Level1 Clear ★★"); MessageBox("Level 2 준비 되셨으면 확인을 눌러주세요"); SetTimer(3,40,NULL);//레벨1이 끝나면서 레벨2 유닛의 타이머와 포인트를 지정해줌 AviterPoint=CPoint(800,80);//유닛들의 처음 위치도 지정 DivauerPoint=CPoint(800,180); CorsairPoint=CPoint(800,350);} if(7000<=GameScore && Level==2)//레벨 2가 끝나고 3으로 넘어가는 순간일때 {……..} if(Level==1)………. • Life가 0이 되거나 레벨 3에서 시간을 초과 했을경우 이를 알리는 메시지 박스를 띄우고 OngameStart();함수(시작버튼을 눌렀을때함수)를 불러 처음부터 다시 하도록 함
◈구현하지 못한점 • 각 줄마다 출현하는 유닛을 렌덤으로 설정하려고 했으나 유닛의 이미지를 맘대로 바꿀 수가 없었고 각 유닛마다 초기화의 위치가 정해져 있어서 렌덤 출현은 구현하지 못함 • 미사일의 개수를 3개로 하려고 했으나 3개로 하면 첫 번째가 적중 했을때 두 번째가 적중 했을 때 세 번째가 적중 했을 때 첫째 적중 후 둘째 적중 했을 때 등등…여러 변수가 생겨서 코드가 너무 복잡해 지고 여러 친구들에게 테스트한 결과 2개의 미사일이 적당하다는 판단(3개 이상이 나갈 경우 게임이 너무 쉬워짐)을 하여서 미사일은 한 화면에 2개 로 고정함