저번 Sphere를 이용하여 충돌 구현을 하였는데, 그것을 이용하여 간단한 ShootingGame 만들겠습니다.
우선 게임을 만들 Scene폴더에 새로운 ShootingScene.h를 만들어줍니다.
생성자와 소멸자 만들어주고,
cpp를 만들어 순수가상함수를 만들어줍니다.
그다음 private로 필요한 멤버 변수들을 추가해주는데
terrian이랑 player를 추가할것인데 player를 추가하기 위해
Object폴더로 이동하여 Shooting 폴더를 만들어주고 그 안에 ShootingPlayer.h를 만들어줍니다.
그 다음 소멸자 생성자를 만들어주고
FrameWork.h에 ShootingPlayer.헤더를 추가해주고
다시 돌아와 Update와 PostRender 함수를 만들어주고
멤버 변수로 moveSpeed와 rotSpeed 을 만들,terrain을 참조받아 만들어줍니다. 그다음 cpp함수를 만들어줍니다.
다음 ShootingScene.cpp로 이동하여 생성자에
terrain과 player를 만들어주고 player에 terrain을 참조해줍니다. player가 계속 terrain값을 알게되어 높이값을 뽑을떄 붙여주기 위함
다음 소멸자에는 terrain과 player를 delete해주고
Render에서는 terrain을 Render해줍니다.
PostRender에서는 player를 PostRender해줍니다.
다음 잘 실행이 되는지 확인을 위해 GameManager.cpp에 ShootingScene 헤더를 포함해주고 GameManager 생성자에 Create를해줍니다.
이렇게하면 이제 맵은 준비가 다된 상태이고 이제 Sphere가 지형을 돌아다닐수있도록 만들어줍니다.
ShootingPlayer로 이동하여 충돌사용을 위해 SphereCollider를 상속받아 사용하고, cpp로 이동하여 player도 Render를 해줍니다.
그런다음 Update부분이 무거워 질수 있기 때문에 헤더파일에 캡슐화를 해줍니다.
다음 Move에서 키값에 따른 움직임 구현을 if조건문으로 받습니다.
그 다음 헤더파일에서 Speed와 rotSpeed를 조정하여 움직임 테스트를 진행합니다.
다음 Camera도 사용할것이기 때문에 Move에 Camera도 추가시켜 실행을하여 잘되는지 테스트를 합니다.
카메라의 움직임 좌표가 잘못된곳으로 잡혀있 생성자에 위치를 잡아줍니다.
다음 높이를 잡겠습니다. 그러기 위해서 Terrain.h로 이동하여
public으로 GetHeight를 호출하여 위치를 받아주고
cpp 파일로 이동하여 높이를 반환해줍니다.
높이를 구하기 위해서는 정점 4개를 알아내어 높이를 얻어낸다.
x 와 z값을 형변환으로 잡아주고
예외처리로 x < 0 , x >= widtg -1로 범위를 벗어난경우를 빼준다, z로 마찬가지
다음 index를 만들어주고 width를 곱해주어 1차원 바꿔준다.
Vertices를 가져와
vertor에 Index4개를 넣어주고
for문을 이용하여 찍어주고,
다음 uv를 구하여 (보강된 값을 넣어주기 위함) 계산해준다.
이제 잘나오는지 확을 위해 ShootingPlayer로 이동하여 추가 하면
Sphere가 높이가있는 경사면을 부드럽게 올라가는 것을 확인할 수 있다.
다음 Shooting게임이기 때문에 총을 쏠때 조준점을 만들어준다.
조준점은 구글이나 아무 곳에서 조준점 사진을 다운 받아와 사용한다.
그다음 알파값 수정을 위해 State 폴더에 BlendState.h를 추가한다
Src - 출력할 이미지에 알파값을 곱해라,
Dest - 목적지에는 Inverse src를 곱해라
BlendOp - src와 dest를 더해라
이것을 사용하여 불투명 반투명 사용
Additive -는 뒷배경에 1을 곱하는 것인데 그러면 배경이 밝아지는 효과를 준다. 검은 색은 투명하게 만듬
광원효과 불과 번개, 사용
OMsetBlendState 깊이나 알파쪽에 최종적으로 색을 선택하는값
Environment.h로 이동하여 Matrix orthographic을 추가해주고
위에 기존에 projection으로 만든 Matrix를 이름 바꾸기를 이용하여 perspective로 바꿔준다.
다음 Matrix로 uiViewBuffer 추가하고
BlendState를 추가한다.
다음 생성자로 이동하여
uiViewBuffer를 만들어주고 소멸자에서 Delete를 해준다
다음 CreateProjection으로 이동하여 세팅값을 이제 3d출력하기 전에 해야되기때문에
이런식으로 옮겨주고 orthographic을 추가한다.
XMMatrixOrthographicOffCenterLH 는 가운데를 원점으로하는것 OFF하고 왼손좌표계를 사용한다.
다음 다시 헤더로 이동하여 SetPost함수를 만들어주고 cpp로 이동하여 postRender에 세팅할 부분을 만들어준다.
MainVIew를 세팅하면 안되기 때문에 uiViewBuffer를 1번에 세팅해주고 projectionBuffer는 2번으로 세팅해준다.
blenderstate추가 하여 반투명값 넣
다음 GameManager.cpp로 이동하여 PostRender전에 Setpost를 해준다.
Object폴더에 있는 Basic폴더에 Quad.h 파일을 만들어주고 FrameWork.h에 헤더추가를 해주고 Cube.h에 있는 코드를 복사하여 돌아와 붙혀주고 수정작업을 해주고 정의를 만들어 준다.
다음 cube.cpp에 있는 MakeMesh코드를 가져와 Quad.cpp에 있는 MakeMesh에 옮겨준다. 그 다음 정점 4개만 사용하기 떄문에 4개 제외하고는 다 지우고 size같은 경우에는 z가 필요가 없기 때문에 xy만 남겨준다.
그다음 생성자를 하나 더 만들어준다 Quad 특성상 이미지를 많이 출력할거기 때문에 wstring으로 Texturefile을 받아준다.
이제 ShootingPlayer.h로 이동하여 cursor를 만들어주고
마우스 좌표를 가운데로 하기위해 POINT clientCenterPos를 잡아줌
POINT = long x , long y를 잡아주고
ClientToScreen , API함수로 윈도우창 기준으로 가운데를 잡아준다.
그다음 Move에서 delta를 마우스 이전좌표 대신에 가운데 기준으로 체크를 해주고
SetcursorPos로 마우스좌표를 따로 움직이는 함수,
cpp 에서 이미지를 받아오고 위치를 가운데 좌표 잡아준다. 좌표는 Framework.h에서 define으로 정의한다.
그러고 위치를 잡았으면 updateworld를하고 소멸자에 delete를 해준다음 Render를 해준다.
그다음 출력을 하면 이런식으로 화면을 움직일떄 커서도 같이 따라서 움직이는 것을 확인할수있다.
'학원' 카테고리의 다른 글
DirectX 3D PointLight (0) | 2023.11.07 |
---|---|
DirectX 3D DirectionalLight (0) | 2023.11.07 |
DirectX 3D SphereCollision (1) | 2023.10.28 |
DirectX 3D XMLSaveLoad (0) | 2023.10.27 |
DirectX 3D Material & Save,Load(Camera) (0) | 2023.10.27 |