22/10/05

CJB_ny·2022년 10월 5일
0

공부 요약

목록 보기
15/38
post-thumbnail

win32API

PaenlUI의 TileButtonUI 텍스쳐 변경 구현함.

void ButtonUI::render(HDC dc)
{
	UINT curPageIdx = p_toolScene->GetCurPageIndex();
	UINT prevPageIdx = p_toolScene->GetPrevPageIndex();

	if (nullptr == p_buttonTexture || -1 == _buttonImageIdx)
		return;

	UINT width = p_buttonTexture->GetWidth();
	UINT height = p_buttonTexture->GetHeight();

	UINT maxCol = 0;
	UINT maxRow = 0;

	UINT curRow = 0;
	UINT curCol = 0;

	// 버튼 갯수가 나온다. 72 x 72
	if (_buttonTypeIdx == 1)
	{
		if (_tileImageIndex > curPageIdx || _tileImageIndex < curPageIdx - PAGE_INDEX)
			return;

		maxCol = (width / TILE_SIZE); // 22
		maxRow = (height / TILE_SIZE); // 12
	}
	else
	{
		maxCol = (width / BUTTON_SIZE); // 5
		maxRow = (height / BUTTON_SIZE); // 5
	}

	// _buttonImageIdx 0부터 시작 일떄
	// 5 / 5 => 1, 5 % 5 => 0
	if (_buttonTypeIdx == 1)
	{
		curRow = static_cast<UINT>(_tileImageIndex / maxCol);
		curCol = static_cast<UINT>(_tileImageIndex % maxRow);
	}
	else
	{
		curRow = static_cast<UINT>(_buttonTypeIdx / maxCol);
		curCol = static_cast<UINT>(_buttonTypeIdx % maxRow);
	}

	// 현재 행이 최대행을 넘지않게 하기 위한 예외처리
	if (maxRow <= curRow)
		assert(nullptr);

	if (_buttonTypeIdx == 1)
	{
		UINT tempTileImageIdx = 0;
		UINT curRow = 0;
		UINT curCol = 0;

		if (curPageIdx > prevPageIdx)
		{
			tempTileImageIdx = _tileImageIndex - prevPageIdx;

			curRow = tempTileImageIdx / 7;
			curCol = tempTileImageIdx % 7;
		}

		if (curPageIdx < prevPageIdx)
		{
			tempTileImageIdx = _tileImageIndex;

			if (curPageIdx != PAGE_INDEX)
				tempTileImageIdx = curPageIdx - _tileImageIndex;
			
			curRow = tempTileImageIdx / 7;
			curCol = tempTileImageIdx % 7;
		}

		if (curRow > 4)
			return;

		Vector2 startSetPos = { 30.f, 100.f };

		(p_toolScene->GetTileButtonVec(_tileImageIndex))->SetPos(Vector2(static_cast<float>(startSetPos._x + (curCol * TILE_SIZE)), static_cast<float>(startSetPos._y + (curRow * TILE_SIZE))));
	}

	Vector2 finalPos = GetFinalPos();

	// checkButton 화면에 띄우는 부분
	if (GetIsMouseOn())
	{
		if (_buttonTypeIdx == 1)
		{
			Rectangle(dc, finalPos._x, finalPos._y, GetScale()._x, GetScale()._y);

			/*TransparentBlt
			(
				dc,
				int(finalPos._x),
				int(finalPos._y),
				int(TILE_SIZE),
				int(TILE_SIZE),
				p_buttonTexture->GetDC(),
				curCol * TILE_SIZE,
				curRow * TILE_SIZE,
				TILE_SIZE, TILE_SIZE,
				RGB(1, 1, 1)
			);*/
		}
		else
		{
			TransparentBlt
			(
				dc,
				int(finalPos._x),
				int(finalPos._y),
				int(BUTTON_SIZE),
				int(BUTTON_SIZE),
				p_buttonTexture->GetDC(),
				curCol * BUTTON_SIZE,
				curRow * BUTTON_SIZE,
				BUTTON_SIZE, BUTTON_SIZE,
				RGB(0, 0, 0)
			);
		}
	}
	else
	{
		if (_buttonTypeIdx == 1)
		{
			TransparentBlt
			(
				dc,
				int(finalPos._x),
				int(finalPos._y),
				int(TILE_SIZE),
				int(TILE_SIZE),
				p_buttonTexture->GetDC(),
				curCol * TILE_SIZE,
				curRow * TILE_SIZE,
				TILE_SIZE, TILE_SIZE,
				RGB(255, 0, 255)
			);
		}
		else
		{
			TransparentBlt
			(
				dc,
				int(finalPos._x),
				int(finalPos._y),
				int(BUTTON_SIZE),
				int(BUTTON_SIZE),
				p_buttonTexture->GetDC(),
				curCol * BUTTON_SIZE,
				curRow * BUTTON_SIZE,
				BUTTON_SIZE, BUTTON_SIZE,
				RGB(255, 0, 255)
			);
		}
	}
}

render코드가 이런데 현재 타일의 행과 열을 맞추는 부분에서의 어려움이 좀 많았다.

일단 행을 구할 때

curRow = tempTileImageIdx / 7;
curCol = tempTileImageIdx % 7;

이부분에서 왜 7로 나누는지와 %7로 나누는지에 대한 것과

가장 많이 애먹었던 부분은

ToolScene에서 함수 포인터로 클릭이벤트 발생시 curPageIdx와 prevPageIdx를 변경하고 이것을 render할 때 조건을 넣는 부분에서 가장 시간이 많이 걸림.

클릭이벤트 발생시 함수포인터로 바인딩하는 부분은 그냥 함수 포인터의 시그니처를 맞추어서 진행하면 되지만

내가 만든 코드의 예외조건을 걸러내는 부분이 가장 시간이 많이 걸림.

        
profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글