학원

DirectX 3D Block

Srff5123 2023. 11. 15. 02:11
728x90

저번에 만든 Block맵에서 유저가 블럭을 밟고 블럭을 깨거나 그것을 먹는것을 추가하기

 

 

우선 엑셀또는 스프레드시트를 사용하는데

게임의 여러가지의 요소들의 데이터를 관리하기 위해 사용

 

여러가지의 table을 사용하기에 key값을 사용하여 설정해준다.

연관컨테이너 검색에 좋기 때문에 처음 게임시작할때 모든 데이터를 로드하고

게임에서 빼서 쓰는 형태

 

일반적으로는 csv를 사용하는데 

간혹 tsv 파일을 사용하는 경우는 시나리오 같은것을 관리 할때 사용

 csv 파일로 다운을 받아

 

 

현재 쓰고있는 파일에 폴더를 하나 만들어 넣어준다.

 

다음 Data는 Singleton으로 사용하는것이 편하기에 BlockDataManage.h파일을 새로 만들어준다.

 

struct로 아까만든 csv파일을 받기 위한 key, name, modelname, uiimage를 가져오고

 

map을 만들어 data를 뽑아줌

다음 cpp파일을 만들어주고 

 

다운해놓은 scv 파일을 Load하여 Data를 받아준다. 

하기전에 fsting 헤더파일 추가하기

입출력을 파일에다가 하겠다는 역할

 

읽는것은 ifstream사용하고

파일의 첫줄은 쓸모없는 부분이라 isFrisrtLine으로 예외처리 

 

eof가 true면 끝나는 while문으로

파일 data 받아 주는데

그것을 위해  추가 하여 SplitString에 temp와 ,를 받아 파일을 ,단위로 하나씩 잘라서 data를 구분해주어

받아줌

Data를 다 받아주고 이제 저번에 만든 MineCraftScene.cpp로 이동하여 

table을 Load해주고

실행하면 되는데 스프레드시트 같은경우에는 data가 옮겨지는 과정에서 한글이 깨지는 경우가 있어

그것을 방지해줘야한다. 그래서 csv파일을 메모장으로 열어 다른이름으로 저장을하여 인코딩을 해주는데

Ansi로 해줬다가 그래도 안되면 utf-8로 한번더 해주면 된다.

설정해주고 다시 실행하면  data가 잘 읽히고있는것을 볼수있다.

 

이제 이것을 확인하기 위해 BlockManage.cpp로 이동하여

랜덤값을 받은 data를 이용하여 수정해준다.

 

다음 높이를 받아 유저가 블럭에 서서 이동할수있도록 구현해주자

 

예전에 만든 Ray collision을 밑으로 쏘아 충돌이일어나게 하여 물체에 올라갈수있게 해주게 되는데

다음 for문으로 반복하고 maxHeight를 이용하여 가장 높은 블럭을 받을수있게 해준다

 

 

이제 적용을 위해 Player를 추가한다 h,cpp파일을 만드는데 예전에 썼던 ShootingPlayer코드를 가져와 수정한다.

기존의 코드에는 점프가 없기에 점프는 추가하였다.

중력을 적용하기 위해 98.0f 값을 주었고, Jump power는 50을 주었다.

 

jump함수에서

key space로 받아주고

velocitiy에서 중력의 크기만큼 계속 줄여주어 떨어뜨린다.

그러고 그 값을 높이값에 넣어주고

 

조건문을 이용하여 높이와 내 위치값을 빼주어 비교하여

중간에 블럭에 닿게되면 0으로 꺼주어서 위치를 고정시켜준다.

 

그러고 블럭을 캐고 설치하는 것을 설정하기 위해

Key값을 받아 마우스로 mining과 build를 준다.

 

 

이제 설치와 블럭캐기 UI 설정을 위해 새로운 MineCraftUI.h를 만들어준다.

 

함수로는 Mining 채굴과 , Build 설치를 만들어주고

멤버 변수로는 Cursor와 blocks를 가져온다,

 

cpp파일을 만들어 이동하여

 

생성자에서 Cursor를 만들어주고

 

 Mining 함수에서 이제 ray 충돌을 이용하여

블럭에 닿으면 그 부분에 block을 설치할수있도록 한다. 

 

Build에서는 우선 block을 들고있는지 없는지를 조건으로 걸어주어 예외처리

 

 

BlockManage에 AddBlock을 만들어 cpp를 작성해준다.

list에서 빼준 블럭을 받아 설치하는데

우선 가장 가까운 값을 충돌처리 해주어 설치를 하기 위해 충돌박스를 구하고

가장 가까운 블럭에 hitpoint로 contact를 해주고,

없다면 예외처리 해주고

block을 push_back으로 넣어준다.

 

다음 BlockManage파일로 이동하여

헤더 파일에

블럭을 반환해줄 Block* Collision을 받아주고 매개면수로 ray를 설정한다.

 

다음 cpp로 이동하여

블럭을 여러개 받지 않게 하기 위해 minDistance에 Max값을 넣어주고

 

list를 이용하여 충돌난 블럭에 iterator를 넣어주고

 

반복문을  end가 아닐떄 까지 돌려주어

 

*iter를 간접참조를 하면 값으로 표현할수있다.

그렇게 충돌이 났는지 확인을하여 더 가까우면

방금 충돌난 거리를 넣어주고

충돌난블럭을 iter를 넣어준다.

 

그러고 충돌난 블럭이 end와 같다면 충돌이 나지 않았기에 

null값을 넣어준다.

 

났으면 block에 간접참조를 하여 block을 넣어주고

erase로 지워주어 빼준다. (erase를 한다고 데이터가 사라지지 않음 list에서만 빠짐)

 

다음 Block.h로 이동하여

Vector3를 반환하는 GetDirection 함수를 만들어준다

 

direction에 방향을 구해주고 정규화된값을 넣어준다.

planes에 6방향벡터를 넣어주고

최소각도를 구해준다.

 

제일 가까운 방향을 반환한다. 블럭 설치를 위한 코드

 

이제 테스트 실행을 해주면 클릭한 부분의 블럭이 list에 순서대로 저장되고,

설치 버튼을 클릭하면 먹은 블럭들이 다시 설치가 된다.

 

 

 

 

 

 

 

 

 

 

 

 

728x90