Visual Studio 2017으로 개발환경 변경, Windows SDK Version 10.0.17763.0
OpenGL 3.2, GLSL 1.5 적용
피격 효과 등 기능 보완
프로젝트 구성
MyGame/windows/ : 프로그램의 시작점인 winMain 함수를 가진 main.cpp와 main.h, glew.c 가 있습니다. MyGame/game/ : 게임 로직을 구현한 코드가 위치한 폴더입니다. MyGame/lib/ : 게임 개발에 사용된 소스 코드가 위치한 폴더입니다. MyGame/assets/ : 게임에 사용된 리소스들이 위치한 폴더입니다.
git에서 lib 폴더의 소스파일과 assets 폴더의 리소스들은 업로드하지 않았습니다.
2. 게임 기능
1) 인트로
# 게임 실행 시 인트로 화면이 나타나고, 화면을 클릭하여 메뉴로 진입합니다.
(Fig. 1) 인트로에서 클릭 후 메뉴로 진입
// MyGame/game/Intro.cppstaticbool once = true;
...
voidkeyIntro(iKeyState stat, iPoint point)
{
// 화면을 클릭시에 딸깍 소리와 함께 로딩 과정을 거처 메뉴 전환된다.if(once && stat == iKeyStateBegan)
{
once = false;
audioPlay(snd_introClick);
setLoading(gs_menu, freeIntro, loadMenu);
}
}
키 입력이 없으면 감속하고, 키 입력이 있으면 가속하는 움직임을 가집니다. (Fig. 6)
플레이어가 화면 밖으로 나가지 않도록 mapBound를 벗어나면 이동 방향과 위치를 조정합니다.
키보드 space를 누르고 있는 동안에 attack() 함수가 호출되어 플레이어 앞에서 발사체가 생성됩니다.
플레이어나 적은 피격시 기존 이미지위에 다시 투명도가 적용된 이미지를 덧 그려서 깜빡이는 효과를 만듭니다. (Fig. 7)
# 게임 중 Esc 버튼을 클릭하면 일시정지 메뉴가 나타나고, 다시 Esc를 누르거나 돌아가기를 클릭하여 게임으로 게임을 재개합니다. (Fig. 9)
(Fig. 8)일시정지 메뉴
// iStd.h
...
// 버튼 상태를 4가지 상태로 정의
#defineiButtonStateNum4typedefenum _iButtonState {
iButtonStateIdle = 0,
iButtonStateClick,
iButtonStateHover,
iButtonStateDisabled,
} iButtonState;
...
// MyGame/game/Proc.cpp
...
#definenum_pop_pause_btn3// 일시정지 메뉴를 그리기 전에 호출되는 함수voidmethodPopPausePaintBefore(void* parm, iPoint point, float scale, float alpha, float dt)
{
int btnImgIdx;
for(int btnIdx = 0 ; btnIdx < num_pop_pause_btn ; btnIdx++)
{
// 팝업에서 마우스가 올려지지 않은 이미지는 iButtonStateIdle 값에 해당
btnImgIdx = (popPause->selected == btnIdx) ? iButtonStateHover : iButtonStateIdle;
imgPauseBtn[btnIdx]->setTexAtIndex(popPause->selected == btnIdx);
}
}
voidmethodPopPauseClose(void* parm)
{
// 버튼을 눌러 닫힐 때 처리switch( closePopPauseOpen )
{
...
case close_pause_open_settings:
{
// 게임 중 Setting을 호출 시 커서를 활성화 하도록 한다.updateCursorVisible(true);
showPopSetting(true);
break;
}
case close_pause_open_menu:
{
// 게임에서 메뉴로 전환한다.setLoading(gs_menu, freeProc, loadMenu);
break;
}
default: break;
}
}
#definenum_pop_pause_btn3
#defineclose_pause_open_game0
#defineclose_pause_open_settings1
#defineclose_pause_open_menu2int closePopPauseOpen;
boolkeyPopPause(iKeyState stat, iPoint point)
{
// 팝업이 열리는 도중에 마우스 이벤트 발생을 막고, 다른 마우스 이벤트 처리를 위해 false를 반환한다.if( popPause->stat != iPopupStatProc )
returnfalse;
switch( stat )
{
case iKeyStateBegan:
{
if(popPause->selected == -1)
break;
// 팝업이 닫힐 때 동작을 처리하도록 선택된 버튼 정보를 저장합니다.
closePopPauseOpen = popPause->selected;
showPopPause(false);
break;
}
case iKeyStateMoved:
{
// 팝업에 마우스 커서가 올라간 버튼 정보를 저장한다.int btnIdx, prevBtnIdx = -1;
for(btnIdx = 0 ; btnIdx < num_pop_pause_btn ; btnIdx++)
{
if(containPoint(point, imgPauseBtn[btnIdx]->touchRect(popPause->closePoint)))
{
prevBtnIdx = btnIdx;
break;
}
}
popPause->selected = prevBtnIdx;
break;
}
...
}
returntrue;
}
voidshowPopPause(bool show)
{
// 일시정지 메뉴를 활성화에 따라서 커서도 활성/비활성 상태로 만든다.
popPause->show(show);
updateCursorVisible(show);
}
게임 실행 중에 키보드 esc를 눌러서 일시 정지 메뉴를 활성화 합니다.
게임이 실행되는 동안에는 마우스 커서가 그려지지 않습니다. 그래서 버튼을 선택해서 처리해야하는
팝업 화면이 활성화되면 마우스 커서를 나타나도록 하고, 닫힐 때 마우스를 비활성화 하도록 하였습니다.
# 물고기와 부딪히면 플레이어의 체력이 1 감소합니다.
# 체력이(좌상단 하트) 0이되면 게임이 끝나고, 다시 플레이하거나 메뉴로 돌아갈 수 있습니다. (Fig. 9)
(Fig. 9)게임 오버 후 종료 모습
// Proc.cppboolkeyPopResult(iKeyState stat, iPoint point)
{
...
switch (stat)
{
case iKeyStateBegan:
{
if (popResult->selected == 0)
setLoading(gs_menu, freeProc, loadMenu); // 나가기 버튼을 선택시 메뉴로 전환elsesetLoading(gs_proc, freeProc, loadProc); // 한 번 더 버튼을 선택시 게임을 다시 로딩break;
}
...
}
returntrue;
}
나가기 버튼과 한 번 더 버튼을 클릭 시 메뉴를 로딩하거나 다시 게임을 로딩합니다.
About
Busan Content Academy에서 2D 네이티브 개인 프로젝트로 제작한 슈팅 게임입니다.