서울게임아카데미 교육과정 6개월 C++ ~ DirectX2D

71일차. 포트폴리오 제작 10일

WDmil 2023. 8. 22. 23:53
728x90

 

D2DGame 2023-08-22 23-43-21.mp4
1.91MB

 

진행중인 작업

UI

3. 핸드, 상점, 전장 UI 생성

 

진행 예정 작업

 

객체

진영 생성시 객체 위치

전투 생성시 객체 위치

 

전투 AI

1. 전투로직

2. 스킬로직

 

그외

투사체

마우스 위치에 따른 카메라 이동

전투시 자동카메라 이동 설정

적 난이도 생성

상점 카드 생성

 

완료된 작업

 

UI

텍스트 출력엔진 생성

텍스트 출력엔진의 외곽선 생성 쉐이더

 

UI

1. 팝업바 생성

2. 상태창 생성

 

버튼 기본 생성

기본 마우스 포인터 연동

캐릭터 사망시 삭제처리 연동

HP 표시 [ HP바 재처리 ]

데미지 연산중복 처리

데미지 연산 ( 객체질량 * 운동량 )

OBB충돌처리

각 객체간 부모자식관계 재처리

객체 공격 딜레이

공격시 오브젝트 회전처리

객체 공격

객체 이동

애니메이션 재생

객체 생성

 

문자 출력 까지는 좋으나, 문자 내부의 숫자값을 계속 변경해주어야할 일이 발생할경우,

이미 만들어져있는 문자의 string값의 uv좌표를 수정하기가 매우 힘들다.

그래서 수정할 수 있는 value를 가진, 숫자출력용 엔진을 만들어야한다.

 

그래서 숫자를 받아왔을 때, 그 숫자를 문자로 변환 -> 문자로 변환된 배열을 미리 만들어놓은 Numberpad TextureRect -123456789 값들중 정해진 값으로 TextureRect로 변환해주는 처리를 해야함.

 

이유는 모르겠지만, TextureRect를 Safe_Delete하게되면, srv까지 같이 날아가서, 정해진 한개의 srv를 사용하는 문자출력엔진에는 알맞이 않았음. 그래서 Safe_Delete를 안하고 할당된 TextureRect만 새롭게 생성한 TextureRect로 변경해주면, 메모리 누수가 심하게 발생함.

 

위 방안을 해결하기 위해서, 문자출력이 아닌, 숫자출력용 텍스트엔진을 따로 제작하여야 했음.

 

현재 출력용 텍스트 엔진을 만들었으나. 좌표기입값을 수정중

struct D3DXNUMBER
{
	D3DXVECTOR3 Startposition;			// 숫자판
	D3DXVECTOR3 Endposition;			// 숫자판 종료 포지션
	Color color;						// 숫자 색상
	Vector3 size;						// 숫자 크기
	int nvectorsize;					// 번호판 사이즈 ( 구조상 넘어가면 표시불가 )
	int sortType;						// 정렬기준이 좌측 중앙 우측인지
	int num;							// 들어있는 숫자
	std::vector<TextureRect*> numstring;	// 숫자 벡터
	std::map<wchar_t, TextureRect*>* numberpad;// 넘버페드 벡터

public:
	void Update() { for (auto def : numstring) def->Update(); } // 숫자 위치좌표 갱신
	void Render() { for (auto def : numstring) def->Render(); } // 숫자 출력

	void Changer_Number(int num) {
		std::wstring numdef = std::to_wstring(num);
		for (int i = 0; i < numstring.size(); i++)
		{
			while (true) {
				if (numstring.size() <= numdef.size()) { // 사이즈가 크거나 같으면 뒤로 빼버린다.
					Endposition.x -= (*numstring.end())->GetSize().x;	//Endposition을 계산해준다.
					numstring.pop_back();
				}
				break;
			}
			
			if(i >= numdef.size()) { // 사이즈 위치에 포지션 가져와서 박아줌.
				TextureRect* numberdef = new TextureRect(*numberpad->find(numdef[i])->second);
				numberdef->SetPosition(numstring[i]->GetPosition());
				numstring[i] = numberdef;
			}
			else {					// 포지션 빼줌.
				TextureRect* numberdef = new TextureRect(*numberpad->find(numdef[i])->second);
				numberdef->SetPosition(Endposition + Vector3(size.x,0,0));
				numstring.push_back(numberdef);
				Endposition += Vector3(size.x,0,0);
			}
		}
	}
private:
	template<typename T>
	D3DXNUMBER operator+ (T x) {
		num += x;
		Changer_Number(num);
	}

	template<typename T>
	D3DXNUMBER operator- (T x) {
		num -= x;
		Changer_Number(num);
	}

	template<typename T>
	D3DXNUMBER operator* (T x) {
		num *= x;
		Changer_Number(num);
	}

	template<typename T>
	D3DXNUMBER operator/ (T x) {
		num /= x;
		Changer_Number(num);
	}
};
D3DXNUMBER FontClass::Makenumberbord(const int number, const Vector3 position, const Color color, const Vector3 stringsize, const int sorting, const int outline)
{
	D3DXNUMBER* result = new D3DXNUMBER;
	std::wstring wsnumber = std::to_wstring(number);

	// 오류체크, 만약 Fontpng가 실행되지 않았을 경우, 폰트 를 다시 잡아준다.
	if (Fontpng == nullptr)
		SetFont("..\\Framework\\GameAsset\\Fontfile\\Base_Font.fnt");

	// 반환값에 문장의 전반 데이터를 기입.
	result->Startposition = result->Endposition = position;
	result->size = stringsize;
	result->color = color;

	// 넘버패드를 안말들었을 경우, 만듬
	if(numberpad.empty()) {
		for (int i = 0; i <10; i++) {
			std::wstring def = std::to_wstring(i);
				// map배열에서 해당되는 숫자의 유니 코드를 찾아온다. 
			auto value = charators.find((int)def[0]);

			// uv의 기준값. 문자의 x위치에 전체 이미지를 나눠주어 전체이미지가 1일경우 x의 값을 구한다. 가로세로길이, y도 같은 방식으로 도출
			std::vector<Vector2>* uv =
				uvInit(value->second->x / fontImagesize.x, value->second->y / fontImagesize.y,
					value->second->width / fontImagesize.x, value->second->height / fontImagesize.y);

			// 문자 사이즈를 백분율하여, 일정한 사이즈로 키워줄 수 있게 한다.
			float Charsizex = value->second->width * 2 / fontsinglesize;
			Vector3 Offset;
			// y를 음수처리하는 이유는 uv 좌표상, y가 반대이기 때문, BMFont 프로그램이 구형이라 offset 좌표가 0,0이 좌상단임.
			Offset = Vector3(value->second->xoffset / 2, -value->second->yoffset / 2, 0);

			Vector3 fontsize = Vector3(value->second->width / fontsinglesize * result->size.x,
				value->second->height / fontsinglesize * result->size.y, 0);
			TextureRect* numpaddef = new TextureRect(Offset, uv, fontsize, 0.0f, result->color, Fontpng);

			numberpad.insert(std::make_pair(def[0], numpaddef));
			// 넘버페드에 숫자를 입력함.
		}

		std::wstring def = L"-";
		// map배열에서 해당되는 숫자의 유니 코드를 찾아온다. 
		auto value = charators.find((int)def[0]);

		// uv의 기준값. 문자의 x위치에 전체 이미지를 나눠주어 전체이미지가 1일경우 x의 값을 구한다. 가로세로길이, y도 같은 방식으로 도출
		std::vector<Vector2>* uv =
			uvInit(value->second->x / fontImagesize.x, value->second->y / fontImagesize.y,
				value->second->width / fontImagesize.x, value->second->height / fontImagesize.y);

		// 문자 사이즈를 백분율하여, 일정한 사이즈로 키워줄 수 있게 한다.
		float Charsizex = value->second->width * 2 / fontsinglesize;
		Vector3 Offset;
		// y를 음수처리하는 이유는 uv 좌표상, y가 반대이기 때문, BMFont 프로그램이 구형이라 offset 좌표가 0,0이 좌상단임.
		Offset = Vector3(value->second->xoffset / 2, -value->second->yoffset / 2, 0);

		Vector3 fontsize = Vector3(value->second->width / fontsinglesize * result->size.x,
			value->second->height / fontsinglesize * result->size.y, 0);
		TextureRect* numpaddef = new TextureRect(Offset, uv, fontsize, 0.0f, result->color, Fontpng);

		numberpad.insert(std::make_pair(def[0], numpaddef));
		// 넘버페드에 -를 입력함.
	}

	// 입력받은 숫자를 확인함.
	for (int i = 0; i < wsnumber.size(); i++)
	{
		TextureRect* numberdef = new TextureRect(*numberpad.find(wsnumber[i])->second);
		numberdef->SetPosition(numberdef->GetPosition() + result->Endposition);
		numberdef->Update();

		Vector3 Offset;
		// y를 음수처리하는 이유는 uv 좌표상, y가 반대이기 때문, BMFont 프로그램이 구형이라 offset 좌표가 0,0이 좌상단임.

		result->numstring.push_back(numberdef);
		result->Endposition.x += result->size.x;
	}

	switch (sorting)
	{
	case RIGHT: // 이 문장은 시작위치 기준 왼쪽으로 발산합니다.
	{
		float sortvectorsizex = (result->Endposition.x - result->Startposition.x); // 전체 문장 길이
		Vector3 sortvector = { sortvectorsizex, 0, 0 };
		for (auto def : result->numstring) {
			if (def->GetPosition().y < result->Startposition.y) // 엔터가 입력되었을 경우,
				sortvector.x = sortvectorsizex; // x를 문장길이 기본 으로 초기화

			Vector3 charX = Vector3(def->GetRect().x / 3.8, 0, 0);

			def->SetPosition(def->GetPosition() - sortvector); // 현재 위치의 단어 길이만큼을 쭉 밀어버림.
			sortvector -= charX;
			// 다음에 왼쪽으로 미는 값은 방금 민 글자의 x사이즈 만큼 줄어들어야 한다.
		}
		break;
	}
	case MIDDLE: 	// 이 문장은 시작위치 가 문장의 중앙입니다.
	{
		float sortvectorsizex = (result->Endposition.x - result->Startposition.x) / 2; // 전체 문장 길이의 반
		Vector3 sortvector = { sortvectorsizex, 0, 0 };
		for (auto def : result->numstring) {
			if (def->GetPosition().y < result->Startposition.y) // 엔터가 입력되었을 경우,
				sortvector.x = sortvectorsizex; // x를 문장길이의 기본의 반절 로 초기화

			Vector3 charX = Vector3(def->GetRect().x / 3.8, 0, 0);

			def->SetPosition(def->GetPosition() - sortvector); // 현재 위치의 단어 길이만큼을 쭉 밀어버림.
			sortvector -= charX;
			// 다음에 왼쪽으로 미는 값은 방금 민 글자의 x사이즈 만큼 줄어들어야 한다.
		}
		break;
	}
	default: // 이 문장은 시작위치 기준 오른쪽으로 발산합니다.
		break;
	}

	return *result;
}

일단 대충만든 숫자출력용 엔진.

실시간으로 출력된 데이터의 숫자값을 바꿀 수 있도록 했음.

728x90