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할 때 조건을 넣는 부분에서 가장 시간이 많이 걸림.
클릭이벤트 발생시 함수포인터로 바인딩하는 부분은 그냥 함수 포인터의 시그니처를 맞추어서 진행하면 되지만
내가 만든 코드의 예외조건을 걸러내는 부분이 가장 시간이 많이 걸림.