졸업작품발표 200431105김영준

Download Report

Transcript 졸업작품발표 200431105김영준

졸업 작품 발표
사막의 여우 : 롬멜
2004311005
컴퓨터과학과
김영준
작품 개요
 1 > 게임명 : El Alamein Battle
 2 > 장르 : 슈팅
 3 > 플랫폼 : PC
 4 > 개발 환경 : VS2008, C++, API
작품 배경 및 소개
<배경>
2차대전 전투중 하나인 엘 알라메인 전투가 배경
사막의 여우라 불리는 롬멜과 연합군의 몽고메리가 붙은 전투
<소개>
조작 : 키보드, 마우스
목적 : 아군 기지가 당하지 않게 방어
모작 : 탱크2012
리소스 출처 : WoW, 스타크래프트, 코만도스2, 1945 III, 기타검색자료
작품 설명
•화면 가운데 본진이 있음
•본진을 방어하는 것이 목표
•사방에서 적군이 출현
•적의 탄은 본진에 피해를 주지 않음
•적이 본진에 도착하여 점령을 시도
•본진의 체력이 다 하면 Game Over
•적을 방어 하다 보면 보스 출현
•보스와는 1:1 대결이며 횡 방식의 전투
사용 기술
 상태 패턴 (스테이지, 메인/타이틀 전환)
 싱글턴 패턴(키/이미지/충돌 매니저)
 STL::List(적/탄막/아이템 관리)
 맵 스크롤 (보스모드시 화면스크롤, 모래바람 처리)
 알파블렌딩 (모래바람 처리)
일정표
날짜
4.9
~4.16
작업 내용 리소스
게임에 들
어갈 여러
가지 이미
지및사
운드 구하
는 작업
4.17
~4.23
4.24
~4.30
5.1
~5.7
5.7
~5.14
5.15
~발표
윈도우
API 기반
프레임 워
크 구축
및 이미지
매니저 구
축
UI클래스
와
스테이지
매니저
사운드 매
니저등
각종 매니
저 구축
아군 캐릭
터 클레스
및 아이템
클레스 구
축
적군 캐릭 마무리 및
터 클래스 버그확인
및 적 패 후 수정
턴 설정
void CStageManager::Setup()
{
m_bChange = false;
m_pStage = new cMainGame;
m_pStage = new cGameStart;
SelesctStage = 0;
CImgMgr::GetInstance()->Setup();
작품의 작동 원리
switch( m_StateStage )
{
case STAGE_TITLE:
m_pStage = new cGameStart;
break;
case STAGE_MAIN:
m_pStage = new cMainGame;
break;
case STAGE_HELP:
m_pStage = new cHelp;
break;
case STAGE_GAMEOVER:
m_pStage = new cGameOver;
break;
case STAGE_INTRO:
m_pStage = new cIntro;
break;
m_StateStage = STAGE_TITLE;
if( m_pStage )
m_pStage->Setup();
}
cSatgeManager.cpp
상태패턴을 이용 스테이지 매니저를
구축하여 게임을 시작하면 나올
타이틀 페이지를 설정
}
스위치문 사용
구동시 나오는 cGameStart 및
게임화면, 도움말,종료화면,인트로
등을
작품의 작동 원리
void cGameStart::KeyInput(void)
{
if (GetAsyncKeyState(VK_SPACE) & 0x8000)
{
//인트로 페이지 이동
if(pt_pos.y == 500)
{
GetStageManager()->ChangeStage(5);
}
//도움말 페이지 이동
else if (pt_pos.y == 560)
{
GetStageManager()->ChangeStage(2);
}
else
{
PostQuitMessage(0);
}
}
if (CKeyMgr::GetInstance()->OnceKeyDown(VK_DOWN))
{
if (pt_pos.y <= 600)
{
pt_pos.y +=60;
}
}
if (CKeyMgr::GetInstance()->OnceKeyDown(VK_UP))
{
if (pt_pos.y >= 510)
{
pt_pos.y -=60;
}
}
}
•탱크의 위치에 따라 스테이지 전환
cMainGame.cpp
void cMainGame::Setup(void)
{
srand((unsigned int)time(0));
SetTimer(g_hWnd, 1, 20, NULL);
cPlayer.Init();
cEnemyMgr.Init();
//초기화
};
void cMainGame::Render()
{
CImgMgr::GetInstance()
->m_Map.Render(CImgMgr::GetInstance()->
m_Back.GetMemDC(), 0, 0, true);
cEnemyMgr.Render();
작품의 작동 원리
void cMainGame::Release(void)
{
cPlayer.Release();
cEnemyMgr.Release();
CImgMgr::GetInstance()->Release();
KillTimer(g_hWnd, 1);
///< 삭제
}
void cMainGame::Update(void)
{
cPlayer.Update();
cEnemyMgr.Update();
cPlayer.Render();
///< 그리기
CImgMgr::GetInstance()->RenderEnd();
Collision();
///< 타이머
}
}
•아군 및 적군의 정보 초기화
•백 버퍼에 맵을 랜더
•적과 플레이어 랜더
•계속해서 적과 플레이어의 정보 받아 갱신과 삭제
작품 작동 원리
•cEnemyMgr.cpp
•적의종류에 따른 출현 빈도 설정
int result = rand()%3;
if( result == 2 )
•랜덤한 위치에서의 적 출현위한 rand함수
{
ENEMY = ENEMY_18WAY;
}
Else
{
ENEMY = ENEMY_NORMAL;
}
if( nElapsed % 10 == 0 )
{
ENEMY = ENEMY_WHIRL;
}
switch( rand()%4 )
{
case 0 :CreateEnemy(ENEMY, 10, rand()%730+10);
break;
case 1 :CreateEnemy(ENEMY, 1010, rand()%730+10);
break;
case 2 :CreateEnemy(ENEMY, rand()%1000+10, 10);
break;
case 3 :CreateEnemy(ENEMY, rand()%1000+10, 710);
break;
}
게임 화면 및 아이템 설명
•배경은 사막
•사막특유의 모래 바람효과 구현
•회전이미지 사용해 포신이 돌아감
•특수탄 선택시 칼라 이미지
•비선택된 특수탄은 흑백처리
•적 처치시 일정 확률로 특수탄 충전
아이템 드랍
게임 화면 및 아이템 설명
 특수 아이템은 총 6종류
 마우스 우클릭으로 발사가 가능
 1번 레일건-> 빠른 연사속도로 적에게 피해를 줌
 2번 유도미사일-> 가장 가까운적을 추적하여 피해를 줌
 3번 지뢰-> 플레이어 위치에 지뢰를 매설하여 위로 지나가는 적에게 피해를 줌
 4번 EMP탄 -> 모든 필드의 적 전차와 적의 탄을 일정시간 멈추함
 5번 네이팜탄 -> 일정 범위안의 적에게 큰 피해를 주며 탄을 상쇄
 6번 폭격-> 아군 에게 폭격을 요청하여 모든 필드의 적에게 큰 데미지와 탄을 상쇄
개발 하면서의 버그 리포팅
EMP 지속시간 중 적들이 죽지 않고 마이너스 피가 되는 현상
-> 조건문 수정으로 해결
EMP 사용시 보스가 사라지는 현상
-> 보스 데이터 초기화 재설정으로 해결
유도탄이 2, 3사분면 사이에서 먼 방향으로 돌아가는 현상
-> 더욱 많은 조건문 활용으로 해결
간혹 이미지들이 서로 뒤엉켜 꼬이는 현상
-> 전체 컴파일 실행으로 해결
공중폭격 비행기가 기지 이미지에 가려지는 현상
-> 렌더 순서 변경으로 해결
회전 이미지가 과도한 렉을 부르는 현상
-> SetTimer를 타임 매니저와 PeekMessage로 바꾸어 완화