===== DX 2D비행슈팅강좌 ======
===== 18. 충돌박스 표시 =====
충돌박스를 넣었으면, 어디가 충돌영역인지 확인할수있어야 한다.
사각형으로 그려서 그 영역을 표시해준다.
Tab을 누르면, On/Off할수있다.
1. 애니메이션의 키이미지 변수를 만든다.
2. GameBase에 추가된 변수
3. 메모리에 흰 텍스쳐생성
4. 충돌영역 그리기
1. 애니메이션의 키이미지 변수를 만든다.
VOID Character::setAnimation(const ImageVec2* vImage)
{
_vImages = *vImage;
_pAni_Key = _vImages[0][0];
}
배열로 접근하면, 너무길어 코드를 읽기가 힘들다.
그래서, 현재의 보여줄 이미지를 받아둔다.
코드중간중간에도 이런식으로 대치되어 사용된다.
2. GameBase에 추가된 변수
static BOOL _bBound_visible;
static LPDIRECT3DTEXTURE9 _pWhite_texture;
충돌박스 그릴여부를 체크하는 변수와 흰색텍스쳐변수가 추가되었다.
3. 메모리에 흰 텍스쳐생성
D3DXCreateTexture(_pd3dDevice, 2, 2, 1, NULL, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &_pWhite_texture);
D3DLOCKED_RECT rcLock;
_pWhite_texture->LockRect(0, &rcLock, NULL, D3DLOCK_NO_DIRTY_UPDATE );
DWORD* pColor = (DWORD*)rcLock.pBits;
*(pColor+0) = 0xffffffff;
*(pColor+1) = 0xffffffff;
*(pColor+2) = 0xffffffff;
*(pColor+3) = 0xffffffff;
_pWhite_texture->UnlockRect(0);
메모리에 2x2크기의 텍스쳐를 만든다.
그리고, 주소를 얻어와서 흰색으로 채우고, 락을 해제한다.
이것을 사용하여, 충돌박스영역을 그리게 된다.
4. 충돌영역 그리기
if ( !_bBound_visible)
return;
static RECT rcSource = {0,};
static D3DXVECTOR3 vCenter(.0f, .0f, .0f);
static UINT uSize = 0;
if ( !_vBoundBox.empty() )
{
uSize = _vBoundBox.size();
for (UINT i=0; i<uSize; ++i)
{
rcSource.right = LONG(_vBoundBox[i]->RB.x - _vBoundBox[i]->LT.x);
rcSource.bottom = LONG(_vBoundBox[i]->RB.y - _vBoundBox[i]->LT.y);
_pSprite->Draw( _pWhite_texture, &rcSource, &vCenter, &_vBoundBox[i]->LT, 0x50E74280 );
}
}
else
{
uSize = _pAni_Key->BoundBox.size();
for (UINT i=0; i<uSize; ++i)
{
rcSource.right = LONG(_pAni_Key->BoundBox[i]->RB.x
- _pAni_Key->BoundBox[i]->LT.x);
rcSource.bottom = LONG(_pAni_Key->BoundBox[i]->RB.y
- _pAni_Key->BoundBox[i]->LT.y);
_pSprite->Draw( _pWhite_texture, &rcSource, &vCenter,
&_pAni_Key->BoundBox[i]->LT, 0x50E74280 );
}
}
_bBound_visible값이 TRUE이면, 충돌박스영역을 그린다.
Character에 충돌이 있으면, 그것을 그리고, 없으면, 이미지의
충돌박스영역을 그린다.
만약, 충돌박스 영역이 없으면, 아무것도 그리지 않는다.
충돌박스영역의 좌표를 가지고 와서 그린다는것을 빼면,
어려운 내용은 없다.
다만, 변수명이 길어서 글자를 보기가 어려울뿐이다.
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.