티스토리 뷰

https://github.com/JunHwaPark/SFMLFortress

깃허브 원격저장소를 삭제했습니다. 코드가 어디갔는지 모르겠습니다.. 컴퓨터 바꾸면서 유실된 듯..

 

 

프로젝트 2때와 달리 중력을 define으로 정의했습니다. 또한, 실행 시 바로 srand를 이용하여 난수를 발생시키고, 보통의 파워로 진행할지, 아니면 1.5배 강한 파워로 진행하는 파워모드를 진행할지 선택하도록 했습니다. , 소문자 N, P가 아닌 다른 입력을 받으면 3초 후 프로그램이 종료됩니다. (추가기능)

 

 

 

 

 

 

 

 

 

 

 

실행 직후 텍스쳐 및 변수 초기화 과정입니다.

 

 

 

 

 

 

 

 

 

 

 

 

게임 제어에 사용된 변수들입니다. 역시 마찬가지로 실행 초반에 초기화가 이루어집니다.

 

 

 

 

 

 

 

 

반복문에 들어간 후, 제일 먼저 하는 일은 프로젝트 2에서와 마찬가지로 카운트를 시작하는 일입니다. 이는 컴퓨터 사양에 따라 프로그램 실행 속도의 차이가 크게 나지 않도록 하기 위한 장치이며, 그 기능을 충분히 수행하고 있다고 생각합니다.

아래에 보이는 조건문은 스페이스바를 눌렀을 때에 관한 조건문입니다. 파워 게이지가 끝까지 올라갈 때 까지 내버려두거나, 아니면 딜레이(가장 최근에 스페이스바를 누른 후 지난 시간)5가 넘은(대략 0.2) 상태이면서, 공이 공중에 떠있는지 판단하는 불-변수가 false일 때 조건문 안으로 진입합니다. 프로젝트 2때와는 달리 turn4로 나눈 나머지를 01, 23으로 사용하지 않고, 변수를 몇 개 더 추가하여 2로 나눈 나머지를 사용하도록 했습니다. 스페이스바를 눌렀을 때 spaceOnfalse이면서 ball_airfalse라면(파워 게이지를 올리기 위해 스페이스바를 누른 것이라면) spaceOntrue로 변경하여 파워 게이지를 상승시킵니다.(아래 코드 참조)

또한 스페이스바를 눌렀을 때 파워 게이지가 올라가고 있고, 게이지를 그만 올리고 이 정도의 파워에서 미사일을 쏘고 싶다는 생각으로 스페이스바를 누른 것이라면(위 상황에 부합되지 않는 상황들) max_powerpower값을 대입시키고, power와 그 외 변수들을 다시 초기화시킵니다.

다음으로는 상하좌우 방향키입니다. 상하좌우 방향키를 누르는 것과 (캡처화면에는 보이지 않지만)QW로 포탄을 변경하는 것은 일단 파워 게이지가 올라가고 있지 않고, 공이 공중에 떠있지 (날아가고 있지) 않을 때라는 큰 조건문으로 묶여있습니다. 턴에 따라 1p2p의 탱크의 위치가 변하고, 바라보고 있는 방향을 결정하는 변수도 변경될 수 있습니다.

키보드의 상하버튼을 누르면 angle을 조절할 목적으로 생성된 불-변수가 true 혹은 false가 됩니다.

QW를 누르면 역시 불-변수가 변경됩니다.

 

 

그 이후에는 바람을 일으키게 되는데, 턴이 증가했을 때, 단 한번만 난수를 1500으로 나눈 값을 750으로 뺍니다. 그렇게 하면 그 변수는 (-750) ~ 750 사이의 값을 가지게 되는데, 이 값을 이용하여 바람 게이지를 나타내고, 실제로 바람을 일으킵니다. 또 아래에 있는 reverse라는 함수는 탱크들이 바라볼 방향에 따라 알맞게 바라보게 해주고, 상하 버튼을 누르고 있을 때 위에서 변경된 변수값에 따라 angle을 조절해줍니다.

 

 

이제 본격적인 미사일 혹은 포탄의 움직임을 구현합니다. 먼저 1p. 즉 탱크의 포탄은 회전이 필요하지 않고, 그저 움직이기만 하면 되기 때문에, 프로젝트 2때와 비슷하게 구현했습니다. delay값에 중력과 바람을 곱하여 x축과 y축으로의 움직임에 영향을 주도록 설계했습니다. 선택한 공이 일탄 포탄인지 혹은 빨간 포탄인지, 그리고 어떤 방향을 바라보고 있는지에 따라 각기 다른 값을 설정해줘야 했습니다.

이제 미사일탱크의 차례입니다. 미사일은 자신이 가고 있는 방향을 바라보며 회전을 해야 하기 때문에 x축으로 가는 힘과 y축으로 가는 힘을 아크탄젠트를 이용하여 각도를 재고, 라디안을 60도법으로 변환을 합니다. 좌상향, 좌하향, 우상향, 우하향 등 4가지 방향에 따라 각도가 갑자기 음수에서 양수로 변경되거나 양수에서 음수로 변경될 수 있기 때문에, 위와 값이 90에서 뺄지, 270에서 뺄지 경우를 나눴습니다. 위 캡처화면은 2p가 우측을 바라보고 있을 때만을 설정한 것이고, 좌측을 바라보는 로직도 아래에 있지만, x축의 이동, 그리고 로테이션에 대한 뺄셈 정도의 차이가 있을 뿐이라서 굳이 넣지는 않겠습니다.

 

 

 

 

위 화면은 유도미사일 이동 로직의 일부분입니다. 정확히는 유도미사일을 쐈을 때 일반 미사일과 똑같이 날아가다가, 최고높이에 도달했을 때(y축으로 이동하는 힘의 크기가 양수가 되었을 때)부터 적용되는 로직입니다. 유도미사일이 영문으로 guided --- 이기 때문에, 변수 이름을 Guide로 하였고, 최고높이에 도달했을 때 미사일과 1pxy축의 거리의 차를 계산한 후, 1p에게 날아갑니다. 물론 각도도 진행하는 방향에 따라 변경됩니다. 이것 또한 바라보는 방향에 따라 또 다른 로직이 있지만, 대부분 비슷하고, 프로젝트 파일도 첨부가 되니 따로 캡처화면을 첨부하지는 않겠습니다.

 

 

 

일반적으로 4개의 포탄 및 미사일들은 화면 밖에 위치하고 있다가, 파워가 정해지면 날아갑니다. 그래서 미사일들의 y축 위치가 600이 넘어가면 (0.0, 600.0)으로 위치를 고정한 후, 4개의 y축 위치 값의 합이 2400을 기준으로 변경이 되는 것을 기준을 잡아 턴을 넘깁니다. (예를 들어, 포를 쏠 때는 3개의 y축 합은 1800이지만, 한 개의 위치가 600보다 작기 때문에 2400이 보다 작았지만, 2400보다 작다가 2400과 같거나 크게 되면 포탄이 땅에 떨어졌다고 인식을 하여 턴을 증가시키고, 포탄이 더 이상 공중에 있지 않다는 의미로ball_air_space변수를 다시 false로 변경시킵니다.

 

 

 

 

 

 

 

start는 게임을 시작하자마자 갑자기 공이 튀어나가거나 하는 것을 방지하기 위한 불-변수이고, 위에서 스페이스바를 눌러서 spaceOntrue로 만든다면 power가 한 루프마다 0.01씩 증가합니다. 또 맵과 상태창, 탱크와 미사일 선택 화살표, 바람게이지 등 기본적인 내용물들을 draw합니다.

또 턴에 따라 우측 하단에 보이는 선택할 수 있는 포탄이나 미사일의 변경을 해주고, HP게이지도 턴에 따라 현재 체력에 비례하여 scale을 조절해줍니다. 선택한 포탄이나 미사일이 무엇인지 저장해놓는 불-변수에 따라 화살표의 위치가 변경되고, 선택된 것만 쐈을 때 화면에 draw됩니다. 쏘아올린 포탄이나 미사일이 y축으로 380 아래로 내려갔을 때에는 draw하지 않습니다. (포탄이 바닥에 닿았을 때 없어지도록)

 

 

 

 

턴에 따라 선택한 포탄이 바닥에 닿았을 때, 그 위치에 폭발 이펙트가 나타나고, 어느정도 중심 부분까지는 그 데미지를 그대로 입고, 그 밖은 거리에 따라 차등한 데미지를 입도록 했습니다. 포탄에 따라 이펙트의 크기를 조정을 했고, 데미지를 준 이후에는 display를 한 후에 2초간 아무런 행동도 하지 못하도록 했습니다. 그 후에 포탄을 y축으로 250만큼 움직여 위에서 본 로직에 따라 (0.0, 600.0)으로 이동이 될 것입니다. 다른 3개의 포탄에 따른 로직도 숫자만 다를 뿐, 크게 다른 점은 없습니다.

 

 

 

마지막으로, 각 플레이어의 HP0보다 작아지면 승리했다는 표시와 함께 무한루프에 빠져 아무런 행동도 하지 못하는 로직입니다. 그 아래는 프로젝트 2에서와 마찬가지로 4000마이크로초를 기다렸다가 다시 루프를 돌리는 로직입니다.

 

 

 

 

 

이렇게 제 (대학 과제였던) '

Fortress Game using by C++ with SFML'이 끝났습니다.

마음같아서는 온라인 실시간 대전기능을 넣고 싶었지만... 아직 아는 것도 부족하고 능력이 부족하여.. 나중에 공부를 더 한 후에 기능을 추가할 계획을 가지고 있습니다.

방장이 호스트를 잡고 호스트가 서버 역할을 하는.. 뭐 그렇게 안되나..? 으아.. 아직 아는게 없어서..

 

 

1차 프로젝트 때에는 언어만 C++를 사용했지, 객체지향 프로그래밍의 장점을 하나도 살리지 못했었습니다. C++을 배우기 시작한지 얼마 되지 않았을 때이기도 했죠. 하지만 2차 프로젝트에서 기능을 추가하며 "왜 객체지향 프로그래밍이 편리한지" "왜 클래스를 적극 활용하는지" 깨달았습니다.. 역시 뭐든간에 직접 당해보고 부딧혀봐야 뭔가 뼈저리게 느끼는 것 같네요.. 멍청하게..

1차 프로젝트때와 소스코드가 완전 뒤엎어진걸 느끼실 수 있을 겁니다..ㅎㅎ..

뭐 지금도 너무 복잡하다고 느끼긴 하지만..일단 한동안 이 프로젝트에서는 손을 떼려고 합니다. 위에서 쓴 것처럼 더 공부를 한 뒤에 온라인 대전 기능을 추가한다던지 할 계획입니다.

아 참고로 2차 프로젝트를 마친 날짜는 2018년 6월 21일 입니다.

 

블로그 주인의 컴퓨터 사양

 

CPU = i5 - 8500;

GPU = geforce gtx1050ti(갤럭시 제품);

RAM = 16GB (8GB*2);

MotherBoard = msi H310m pro-m2;

Power = 마이크로닉스 Classic II 600W;

따로 사제 쿨러를 사용하지는 않습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함