=================================
=================================
=================================
다이렉트 SDK 를 참조해서 DXUT+MFC를 만들어 보았습니다. (구현해 보신분들은 패스 ㅋㅋㅋ)
간단하게 mfc와 dxut만 있습니다 ^^ (다른분들 만들어 두었던 예제들 붙이다 만 상태의 코드들도 많은..정리가..;;)
불안정해성 ㅠㅠ 만약 버그나 이상한점 있으면 꼭!!! 말해주세요~ (제가봐도 헤깔리는게 한두가지가;;;)
버전은 Microsoft DirectX SDK (October 2006) 입니다
일단 기본적으로 보실것만 써 놓았습니다.
//---------------------------------------------------------------------
//DxView.Cpp
//---------------------------------------------------------------------
//---------------------------------------------------------------------
static CDxView* s_pRenderView = NULL; //각각 draw,moveframe등등 관련 동작해주는 랜더뷰
LRESULT CALLBACK FullScreenWndProc( HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam )
{
//..............................코드들
return DefWindowProc( hWnd, msg, wParam, lParam );
}
void CDxView::OnInitialUpdate()
{
//--------------------------------------------------------
//DX 전용 초기화
//....... 코드들
//
여기에서 m_wndSplit00.GetPane(0,1)위치의 핸들(Dxview)을 넘겨주고 RegisterClass( &wndClass ); 설정m_hwndRenderWindow =pMF->m_wndSplit00.GetPane(0,1)->GetSafeHwnd();
// Register a class for a fullscreen window
WNDCLASS wndClass = { CS_HREDRAW | CS_VREDRAW, FullScreenWndProc, 0, 0, NULL,
NULL, LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH), NULL,
_T("Fullscreen Window") };
RegisterClass( &wndClass );
m_hwndRenderFullScreen = CreateWindow( _T("Fullscreen Window"), NULL,
WS_POPUP, 0, 0, 640, 480,
GetTopLevelParent()->GetSafeHwnd(), 0L, NULL, this );
// If we haven't initialized the D3D framework, do so now
if( !DXUTGetD3DDevice() )
{
//................코드들
//
DXUT 유명한 함수들이져 ㅋㅋ.. 여기서 한번 부르고 DXUTMainLoop() 함수를 부르지 못합니다. (mfc)와 같이 이용하기 때문에//
즉 여기에서는 한번 설정해주고 DXUT의 이함수들의 상위 함수를 다시 불러주어야 합니다.//
상위함수부분은 DXUT.cpp에 설정 되어 있습니다. 만약 DXUTSetCallbackFrameRender 로 설정된 OnFrameRenderCB를//
계속 불러주고 싶다면 Mfc에 연속적으로 불러주는 랜더링이라불리우는 함수에 DXUTRender3DEnvironment()를 불러주면 됩니다.//
다른 방법두 있지만 저는 일단 이대로의 방법을 했습니다.//
그리고 전부 상위에서 안불러도 적용되는 것들은 그냥 나두어두 됩니다, Reset,Lost등등, 하지만 안불러두 괜찮은지 그건 아직//
눈여겨 보구 있습니다. 나중을 대비해서 ^^;;// Set up the DXUT callbacks
DXUTSetCallbackDeviceCreated( OnCreateDeviceCB );
DXUTSetCallbackDeviceReset( OnResetDeviceCB );
DXUTSetCallbackDeviceLost( OnLostDeviceCB );
DXUTSetCallbackDeviceDestroyed( OnDestroyDeviceCB );
DXUTSetCallbackMsgProc( MsgProcCB );
DXUTSetCallbackFrameRender( OnFrameRenderCB );
DXUTSetCallbackFrameMove( OnFrameMoveCB );
// Show the cursor and clip it when in full screen
//..............코드들
}
}
pDoc->Compile(); //
MapToolDoc.cpp의 영역으로 갑니다~
}
//
MapTool.cpp부분의 OnIdle함수에서 계속 함수를 불러들입니다.~ 리소스 아이디를 만들어서 ON_COMMAND로//
OnRender() 를 계속 불러들입니다~ 이렇게 하는 이유는 DXUTMainLoop()에서 루프를 따로 돌지 않기 때문인것 같습니다void CDxView::OnRender()
{
if( DXUTGetD3DDevice() != NULL )
DXUTRender3DEnvironment(); //
}
//
메인에서 부르는 OnFrameRenderCB,CDxView::OnFrameMoveCB 의 등등의 함수들이 있습니다. 이 함수들에서//
바로 불러주는 것이 아니고 전역으로 받은 포인터로 다시 각각의 함수도 부릅니다. 포인터 안써도 직접써도 무방할것 같습니다 ^^void CDxView::OnFrameRenderCB( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
............
s_pRenderView->OnFrameRender( pd3dDevice, fTime, fElapsedTime );
}
void CDxView::OnFrameMoveCB( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
.................
s_pRenderView->OnFrameMove( pd3dDevice, fTime, fElapsedTime );
}
//........................................................등등등 비슷한 함수들..............
//
메시지프로시져를 받는 부분입니다 .. 이것두 상위 부분을 불러들여 메세지를 계속적으로 보냅니다.
LRESULT CDxView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
DXUTStaticWndProc(m_hWnd,message, wParam, lParam );
return CScrollView::WindowProc(message, wParam, lParam);
}
//---------------------------------------------------------------------
//MapToolDoc.cpp
//---------------------------------------------------------------------
//---------------------------------------------------------------------
//psj DX사용 함수 뷰어에서 init되면 여기서 컴파일 됨
void CMapToolDoc::Compile( bool bForceCompile )
{
if( !bForceCompile && !m_bNeedToCompile )
return;
//............................. 코드들
CDxView* pRenderView = GetRenderView();
//................코드들
}
//psj 뷰어를 넘겨준다 ㅁ
CDxView* CMapToolDoc::GetRenderView()
{
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
if( pView->IsKindOf( RUNTIME_CLASS( CDxView ) ) )
{
return (CDxView*)pView;
}
}
return NULL;
}
//---------------------------------------------------------------------
//MapTool.cpp
//---------------------------------------------------------------------
//---------------------------------------------------------------------
// CMapToolApp 메시지 처리기
//
이 함수부분은 지속적으로 함수를 부르는 부분입니다 렌더링같은 함수를 부를때 사용합니다
//
DxView.Cpp/*//----------------------------------------------------------------BEGIN_MESSAGE_MAP(CDxView, CScrollView)
........
ON_COMMAND(ID_VIEW_RENDER, OnRender)
.......
END_MESSAGE_MAP()*//-----------------------------------------------------------------
//
여기 아이디를 통해서 지속적으로 불러 들입니다, 메인부분에 이와똑같이 한번 더 거칩니다.//
만약에 지속적으로 부를 함수가 더있다면 이 부분과 똑같이 활용하면 됩니다.
BOOL CMapToolApp::OnIdle(LONG lCount)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if( m_bRenderContinuously )
{
CWinApp::OnIdle(lCount);
if( !m_bAppActivated )
//Sleep(50);
m_pMainWnd->SendMessage(WM_COMMAND, ID_VIEW_RENDER);
return TRUE; // always request more time
}
else
{
return CWinApp::OnIdle(lCount);
}
//return CWinApp::OnIdle(lCount);
}
=================================
=================================
=================================
//여기까지 읽어 주셔서 감사 합니다~~~
//오늘도 오크 코딩~~~
//코드 보시구 이상하점 찾으시면 꼭 리플 남겨 주시는 센스 +.+ (오크 코딩이라 엄청난 가독성이...;;; 쿨럭)
//좋은 방법 있으신 분들 언제나 충언 해주세요 +.+
//압축은 alz,7z으로 알집으로 압축을 풀수 있습니다. (ㅠㅠ 나누어 압축)
=================================
=================================
=================================
'프로그래밍 관련 > 게임프로그래밍' 카테고리의 다른 글
다이렉트X 비디오 메모리 구하기 (0) | 2016.05.26 |
---|---|
게임개발 가변 프레임율이 지원되는 FrameSkip (1) | 2012.11.08 |
DirectX9를 이용한 3D GAME 프로그래밍 입문 ppt자료 (0) | 2011.03.30 |
텍스쳐를 잘라서 복사하기~ 텍스쳐 자르기 관련 (3) | 2011.03.29 |
가변프레임 (0) | 2011.01.31 |