승쨩개발공부

[SR] 프레임워크(1) 본문

SR

[SR] 프레임워크(1)

Unknowns 2021. 12. 9. 14:11

1. 빈 프로젝트 생성

솔루션이 생성 되었으면 FramWork -> 우클릭 -> 제거 해주어 다음과 같이 솔루션만 남겨놓고 만들어진 프로젝트를 지워준다.

 

 

2. Clinet 프로젝트와 Engine(DLL) 프로젝트 만들기

비어있는 FrameWrok솔루션에 오른쪽 마우스 클릭 후 Client프로젝트와 Engine프로젝트를 만들어준다.

Client 프로젝트는 Win32프로젝트

Engine 프로젝트는 Win32프로젝트에서 DLL과 빈프로젝트 체크박스를 체크해준다.

 

Cilent : exe파일

Engine : lib파일

 

이렇게 마쳤다면 완성결과는 아래와 같을것이다

이 다음 Cilent와 Engine프로젝트도 1번과 같이 제거를해주자.

 그다음 솔루션 -> 우클릭 -> 파일 탐색기에서 폴더열기 를 해주자.

 

 

 

3. 폴더 및 파일 분할

 Clinet, Engine 폴더에 각각 들어간다.

bin, public, private, default 폴더를 생성해준다.

bin : 프로젝트 결과물(.exe), 리소스 , 사운드 , 텍스쳐, 매쉬, 등을 넣는다.

public : 이제부터 생성하는 헤더파일을 모두 넣는다.

private : 이제부터 생성하는 .cpp파일을 모두 넣는다.

default : 위 사항을 제외한 모든 파일을 넣는다.

 

일단은 현재 있는 파일 모두 default 에 넣는다

엔진 폴더도 위와 같이 수행한다.

 

 

이제 다시 프로젝트로 돌아와서

솔루션 -> 우클릭 -> 추가 -> 기존 프로젝트 누르고 default에있는 Client.vcx를 추가해준다.

Engine도 위와같이 똑같이 추가해준다.

 

 

그러면 결과가 이렇게 이쁘게 나올것이다.

 

 

Clinet 와 Engine 에 필요없는 필터가 많으니 정리해주자.

 

 

그다음 Client솔루션과 Engine솔루션 둘다 출력 디렉토리를 각각 bin폴더에  실행파일을 생성할 수 있도록

..\bin\ 으로 바꿔준다. 

.. : 나가서

\ : 들어가라

 

 

 

4. 기본 윈도우 초기화

기본 윈도우를 수정하기 위한 헤더파일인 Cilnet_Defines.h를 만든다

단, Cilient에서 만든 헤더파일이기에 Client폴더에 public폴더에 생성해준다.

g_iWinCX = 윈도우창 가로 사이즈

g_iWinCY = 윈도우창 세로 사이즈

전역변수를 다른곳에서도 쓸수있게 핸들을 extern 잡아준다

 

 

 

이제 Clinet.cpp에 들어가서 윈도우 초기화를 해보자

전역변수에 핸들을 넣고 윈도우 수정을 위한 Cilent_Defines.h 를 include해준다

그런대 이제부터 헤더파일을 추가하면 다 public 폴더에 넣을건데 매번 이렇게 ../public/ 를

명시해주어야하기엔 너무 귀찮다.

그래서 추가 포함 디렉터리에 ../public/을 추가해줘서 생략해보자

 

정상적으로 생략이 되었다 이제 매번 ../public/을 치지 않아도 된다.

 

 

 

메세지 루프 PeekMessage로 수정

게임은 업데이트 -> 랜더 -> 업데이트 -> 랜더 무한 반복이다.

 

윈도우창 수정

이제 기본 윈도우는 출력이 될것이다.

 

 

 

5. Client 솔루션 클래스 생성

우리가 자주쓰던 MainGame클래스처럼 MainApp클래스를 만들것이다.

이제부터 프레임 워크 구조는 아래 사진과 같이 하도록한다.

1. public 변수는 절대 선언하지 않는다.

외부에서 아예 접근하지 않게 만들것이다.

변수를 탐하지 말자.

 

2. Get Set함수도 웬만하면 사용하지 않는다.

무조건 Get Set을 쓰지말라는 말은 아니다.

하지만 값을 가져와서 선언하기 전에 그 클래스 안에 기능을 구현해보자.

 

3. 움직임이 필요한 클래스에 모듈을 선언해준다.

 

4. 소멸자는 다른 함수로 대체할것이다 그래서 default로 막는다.

 

 

CMainApp 생성

당연히 .h파일은 public 폴더,

.cpp파일은 private 폴더에 생성해준다. 

클래스를 namespace에 정의하는 이유?

외부 lib파일을 사용할떄 클래스 이름이 겹칠수가있다

그렇기 떄문에 namespace 안에 클래스를 정의해준다.

 

단, 정의부 (.cpp 파일) 에도 이 이름 공간에서 사용중인 클래스라고 명시해주어야한다.

 

Free() 함수?

상속관계에 자식 부터 타고올라가면서 RefCnt를 지워주는 역활

소멸자의 역활을 대신하기 떄문에 소멸자를 Defalut처리함.

 

 

 

 

 

6. Engine 솔루션 클래스 생성

 

엔진 프로젝트

-> 여러 클라이언트에 사용할수 있는 기능.

-> 공통적으로 클라이언트에서 쓰는 기능을 정의해서 사용.

-> base클래스는 엔진에 구현

-> 클라이언트는 엔진에 있는 프로젝트를 전부 사용가능

-> 엔진은 클라이언트의 프로젝트를 사용하면 안됨 (엔진의 기능 상실)

 

Base 클래스 생성

선언부 .h

정의부 .cpp

CBase 클래스란?

앞으로 우리가 제작하는 모든 클래스들의 부모 클래스가 될 클래스이다.

-> 슈퍼 클래스

 

클래스와 객체 차이

-> 메모리 할당

객체 : 메모리 덩어리

 

클레스를 객체화 한다?

-> 이 정의부를 메모리 할당한다.

 

Base 클래스를 쓰는 이유?

모든 클래스들에게 공톡적인기능을 상속하기위해.

-> 참조갯수를 관리하기위해

 

m_dwRefCnt ?

->현재 참조된 갯수를 보관한다. (래퍼런스 카운트)

 

참조라는 개념?

원래 보관하고자 했던 포인터형 변수에 담아놓는 행동 (참조X)

담아놨던 주소를 다른 객체에게 저장해준다는 형태로 행동 (참조O)

 

플레이어가 있다면 몬스터가 플레이어를 따라와야한다

몬스터에게 플레이어의 주소를 저장하면 언제든지 접근해서 플레이어의 주소를 가져올 수 있다.

 

플레이어의 주소를 몬스터에게 보관

RefCnt 증가

또 다른 몬스터에게 보관

RefCnt 증가

 

Release의 기능

1. 삭제한다.

2. 삭제하지 않고 레퍼런스 카운트를 감소시킨다.

 

모든 클래스에겐 Release를 부여한다

RefCnt = 0이면 진짜로 지우고.

RefCnt = 1이상이면 RefCnt를 감소시킨다.

 

플레이어가 지워질떄는 오브젝트 매니저를 정리할떄이다.

 

'SR' 카테고리의 다른 글

[SR] 버퍼(Buffer)  (0) 2022.05.24
[SR] #1. Rendering PipeLine  (0) 2021.12.23
[SR] Graphic_Device  (0) 2021.12.23
[SR] Time / GameInstance  (0) 2021.12.22
[SR] 프레임워크2 (DLL 파일 피싱)  (0) 2021.12.10