오늘은 Attach 기능을 요구하는 AttachPiece, AttachLatch, Character의 Attach 기능의 Script를 작성하였습니다.

작성하면서 여러 종류를 고민하다보니 시간이 많이 흘렀지만, 그래도 하루만에 코드 부분은 대략 작성할 수 있었습니다.

하지만 실제로 테스트를 해보니 정상적으로 작동하지는 않았습니다.

그래서 다음에는 로그를 찍어보고 문제가 되는 부분을 탐색하여 수정하는 작업을 진행해야 할 것 같습니다.

 

왠지 새벽에 조금 해주면 주말 안에 끝날법도 해서 뭔가 안심이 된달까.

반환점이 하나 보이는 것 같습니다.

8월에는 리빌딩을 꼭 마무리 하고, 했던 작업이 아닌 안해봤던 작업.

데디케이트 서버 구축 단계로 넘어가고 싶습니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.08.03 개발일지  (0) 2020.08.03
20.08.02 개발일지  (0) 2020.08.02
20.07.30 개발일지  (0) 2020.07.30
20.07.29 개발일지  (0) 2020.07.29
20.07.27 개발일지  (0) 2020.07.27

오늘은 DirectX 예시 프로젝트 수정 중 발생한 오류 원인을 찾아보았습니다.

 

결과적으로, 오류의 원인을 밝힐 수는 없었지만 한가지 오류는 찾았습니다.

https://docs.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgifactory-createswapchain

 

IDXGIFactory::CreateSwapChain (dxgi.h) - Win32 apps

Creates a swap chain.

docs.microsoft.com

https://gamedev.stackexchange.com/questions/149822/direct3d-12-cant-create-a-swap-chain

 

Direct3D 12 can't create a swap chain

I'm learning DirectX12 and I'm trying to create a simple application that clears the screen with a solid color, but I'm stuck in Direct3D initialization. I can't create the swap chain and the DXGI

gamedev.stackexchange.com

CreateSwapChain에서 문제가 발생했는데 최신 버전에서는 이 함수 사용을 지양한다는 내용입니다.

그래서 다른 방식으로 구현을 했는데, 여전히 문제가 발생하고 있습니다.

 

그래서 좀 더 근본적인 부분을 먼저 수정해보려 합니다.

바로 Window 생성 부분입니다.

DirectX 예시 코드와 Windows Template 예시 코드는 각각 다른 Main Window를 생성하고 있습니다.

우선 이 부분을 해소하기 위해 코드 분석을 해보았습니다.

 

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: Place code here.

    // Initialize global strings
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_DIRECTX12EXAMPLECODE, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Perform application initialization:

    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DIRECTX12EXAMPLECODE));

    //D3DApp::Run
    MSG msg{ };

    // Main message loop:
    try
    {
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        return (int)msg.wParam;
    }
    catch (DXException& e)
    {
        MessageBox(nullptr, e.ToString().c_str(), L"HR Failed", MB_OK);
        return 0;
    }
}

Main 함수에 해당하는 WinMain입니다.

LoadStringW를 통해 창 이름과 Class 이름을 지정합니다.

 

그리고 MyRegisterClass로 Window Class를 등록합니다.

//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DIRECTX12EXAMPLECODE));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_DIRECTX12EXAMPLECODE);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

이중 WndProc는 자체적으로 선언한 함수입니다.

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE: Processes messages for the main window.
//
//  WM_COMMAND  - process the application menu
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case ID_EXAMPLE_CHAPTER6:

                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code that uses hdc here...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Class가 등록이 되면 그 다음은 Instance를 초기화 합니다.

//
//   FUNCTION: InitInstance(HINSTANCE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Store instance handle in our global variable

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

그 아래가 Main Mesage Loop입니다.

 

다음은 DirectX 코드에서 해당 부분입니다.

bool D3DApp::InitMainWindow()
{
	//--------------RegisterClass
	WNDCLASS wc;
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = MainWndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = mhAppInst;
	wc.hIcon = LoadIcon(0, IDI_APPLICATION);
	wc.hCursor = LoadCursor(0, IDC_ARROW);
	wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(NULL_BRUSH));
	wc.lpszMenuName = 0;
	wc.lpszClassName = L"MainWnd";

	if (!RegisterClass(&wc))
	{
		MessageBox(0, L"RegisterClass Failed.", 0, 0);
		return false;
	}


	//--------------------------InitInstance
	RECT R = { 0, 0, mClientWidth, mClientHeight };
	AdjustWindowRect(&R, WS_OVERLAPPEDWINDOW, false);
	int width = R.right - R.left;
	int height = R.bottom - R.top;

	mhMainWnd = CreateWindow(L"MainWnd", mMainWndCaption.c_str(), 
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, width, height, 0, 0, mhAppInst, 0);
	if (!mhMainWnd)
	{
		MessageBox(0, L"CreateWindow Failed.", 0, 0);
	}

	ShowWindow(mhMainWnd, SW_SHOW);
	UpdateWindow(mhMainWnd);

	return true;

}

주석으로 대략 나눠놓았습니다.

InitMainWindow( 안에 RegisterClass와 InitInstance 부분이 같이 존재합니다.

이를 각각의 함수로 나누고, 양쪽 코드에서 필요로 하는 기능을 모두 갖추도록 하고자 합니다.

그리고 Main에서는 아무런 작업 없이, 메뉴의 Event에서 화면 출력을 교체하고자 합니다.

 

이 중 InitInstance는 다음 과정을 거쳐서 호출이 됩니다.

 

bool D3DApp::Initialize()
{
	if (!InitMainWindow())
	{
		return false;
	}
	if (!InitDirect3D())
	{
		return false;
	}

	OnResize();
	return true;
}

 

bool BoxApp::Initialize()
{
	if (!D3DApp::Initialize())
	{
		return false;
	}

	ThrowIfFailed(mCommandList->Reset(mDirectCmdListAlloc.Get(), nullptr));
	BuildDescriptorHeaps();
	BuildConstantBuffers();
	BuildRootSignature();
	BuildShadersAndInputLayout();
	BuildBoxGeometry();
	BuildPSO();

	ThrowIfFailed(mCommandList->Close());
	ID3D12CommandList* cmdLists[] = { mCommandList.Get() };
	mCommandQueue->ExecuteCommandLists(_countof(cmdLists), cmdLists);

	FlushCommandQueue();
	return true;
}

 

또한 WndProc와 대응하는 함수는 MsgProc가 있습니다.

LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	//WndProc
	switch (msg)
	{
	case WM_ACTIVATE:
		if (LOWORD(wParam) == WA_INACTIVE)
		{
			mAppPaused = true;
			mTimer.Stop();
		}
		else
		{
			mAppPaused = false;
			mTimer.Start();
		}
		return 0;
	case WM_SIZE:
		mClientWidth = LOWORD(lParam);
		mClientHeight = HIWORD(lParam);
		if (md3dDevice)
		{
			if (wParam == SIZE_MINIMIZED)
			{
				mAppPaused = true;
				mMinimized = true;
				mMaximized = false;
			}
			else if (wParam == SIZE_MAXIMIZED)
			{
				mAppPaused = false;
				mMinimized = false;
				mMaximized = true;
				OnResize();
			}
			else if (wParam == SIZE_RESTORED)
			{
				if (mMinimized)
				{
					mAppPaused = false;
					mMinimized = false;
					OnResize();
				}
				else if (mMaximized)
				{
					mAppPaused = false;
					mMaximized = false;
					OnResize();
				}
				else if (mResizing)
				{

				}
				else
				{
					OnResize();
				}
			}
		}
		return 0;
	case WM_ENTERSIZEMOVE:
		mAppPaused = true;
		mResizing = true;
		mTimer.Stop();
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_MENUCHAR:
		return MAKELRESULT(0, MNC_CLOSE);
	case WM_GETMINMAXINFO:
		((MINMAXINFO*)lParam)->ptMinTrackSize.x = 200;
		((MINMAXINFO*)lParam)->ptMinTrackSize.y = 200;
		return 0;
	case WM_LBUTTONDOWN:
	case WM_MBUTTONDOWN:
	case WM_RBUTTONDOWN:
		OnMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case WM_LBUTTONUP:
	case WM_MBUTTONUP:
	case WM_RBUTTONUP:
		OnMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case WM_MOUSEMOVE:
		OnMouseMove(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case WM_KEYUP:
		if (wParam == VK_ESCAPE)
		{
			PostQuitMessage(0);
		}
		else if (static_cast<int>(wParam) == VK_F2)
		{
			Set4xMsaaState(!m4xMsaaState);
		}
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}

 

다음에는 D3DApp의 상위 클래스를 두던가 하여 통합을 하고자 합니다.

'내용정리 > DirectX12' 카테고리의 다른 글

20.08.07 개발일지  (0) 2020.08.07
20.08.04 일지  (0) 2020.08.04
20.07.28 개발일지  (0) 2020.07.28
20.07.25 개발일지  (0) 2020.07.25
20.07.24 일지  (0) 2020.07.24

https://www.acmicpc.net/problem/3300

 

3300번: 무어 기계

문제 무어 기계는 상태에 의해서 출력이 결정되는 유한 상태 기계이다. 무어 기계는 이름은 미국의 수학자이자 컴퓨터 과학자 Edward F. Moore의 이름을 따서 지었다. 무어 기계의 상태 전이는 입력�

www.acmicpc.net

Graph 순회 방법을 대충 맞추어서 정리를 합니다.

 

하나는 String을 두어 Push_Back과 erase로 정답을 산출.

그리고 두개의 Stack을 두어 하나는 순회를 하고 다시 되돌아 올 Index를 저장.

다른 하나는 되돌아 왔을 때 어느 Node로 넘어가야 하는지를 알려주는 Stack입니다.

 

지금 개발중인 기능을 마무리 하고 8월 중으로 여러 회사들에 입사지원서를 쓰기 위해 언리얼 개발에 더 전념중입니다.

그러다보니 알고리즘 풀 체력이나 정신력이 부족해 한 문제를 몇 주씩 물고 늘어지게 되는 것 같습니다.

여태까지 못푼 문제들 위주로 잡다보니 어려운 것도 한 몫 하고 있긴 합니다만.

빨리 못푼 문제 다 털어버리고 부족한 부분을 더 다잡고 싶습니다.

'개발일지 > Algorithm' 카테고리의 다른 글

20.07.29 개발일지 - Frogger  (0) 2020.07.29
20.07.28 개발일지 - 무어기계  (0) 2020.07.28
20.07.27 - 무어기계(cont)  (0) 2020.07.27
20.07.26 - 무어 기계(cont)  (0) 2020.07.26
20.07.24 개발일지 - 무어 기계(cont)  (0) 2020.07.24

+ Recent posts