안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2011년 4월 26일 화요일

d3d 기본 창 띄우기

#include <d3d9.h>

#include <string>
#pragma comment(lib, "d3d9.lib")
using namespace std;
//전역변수
LPDIRECT3D9 g_pD3D = NULL; // D3D 디바이스를 생성할 D3D 객체 변수
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 랜더링에 사용 될 D3D 디바이스

///Direct3D 초기화
HRESULT InitD3D(HWND hWnd)
{
///디바이스를 생성하기 위한 D3D 객체 생성

if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp; // 디바이스 생성을 위한 구조체
ZeroMemory(&d3dpp, sizeof(d3dpp)); // 반드시 구조체를 깨끗이 지워야한다.

d3dpp.Windowed = TRUE; // 창모드
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 가장 효율적인 SWAP 효과
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //현재 바탕화면 모드에 맞춰서 후면 버퍼 생성

if(FAILED(g_pD3D -> CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,
&g_pd3dDevice)))
{
return E_FAIL;
}

///디바이스 상태 정보를 처리할 경우 여기에서 함

return S_OK;
}

///초기화 된 객체들 소거

VOID Cleanup()
{
if(g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if(g_pD3D != NULL)
g_pD3D->Release();
}

//화면 그리기
VOID Render()
{
if(NULL == g_pd3dDevice)
return;

//후면 버퍼를 파란색으로 지운다.
g_pd3dDevice->Clear(0,NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0,0,255),1.0f,0);

//랜더링 시작
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//실제 랜더링 명령들이 나열될 곳
//랜더링 종료
g_pd3dDevice->EndScene();
}

//후면 버퍼가 보이는 화면으로
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

//윈도우즈 프로시저

LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
ValidateRect(hWnd, NULL);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}

//프로그램의 시작점
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
string className = "D3D Tutorial";
wstring str2(className.length(), L' '); // Make room for characters

// Copy string to wstring.
copy(className.begin(), className.end(), str2.begin());
//...
//윈도우 클래스 등록
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
(LPCTSTR)"D3D Tutorial", NULL};
RegisterClassEx(&wc);
//윈도우 생성
HWND hWnd = CreateWindow((LPCTSTR)"D3D Tutorial", (LPCTSTR)"CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 600, 480,
GetDesktopWindow(), NULL, wc.hInstance, NULL);
//Direct3D 초기화

if(SUCCEEDED(InitD3D(hWnd)))
{
//윈도우 출력
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//메시지 루프
MSG msg;
while(GetMessage(&msg, NULL, 0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//등록된 클래스 소거
UnregisterClass((LPCTSTR)"D3D Tutorial", wc.hInstance);
return 0;
}


P.S 창 이름이 한문으로 깨져서 나온다.

이유를 아시는 분은 꼭 댓글로 가려쳐 줬으면 합니다.

이 코드 인터넷 상에 많이 떠도는 데

붙여 넣기가 안되도록 많이 들 막아 놨더군요.

인터넷 세상 공유하면서 삽시다.

2011년 4월 22일 금요일

객체 지향 프로그램(abstract, override)

 이 때까진 막 코딩 ( 인터넷 검색을 통해 필요한 정보를 얻는) 을 통해 생존해 왔다. 이번 학기에 객체 지향 프로그램을 배우면서 이 때 동안 그냥 막 썼던 implement 와 override의 개념에 대해 배우게 되었다. 간단하게 설명할 테니 잘 듣기 바란다. (거만한데..)

 override의 개념은 상속에 근거한다.

 그럼 상속이란 무엇인가? 자바 프로그램 자체가 OOP(Object Oriented Programming) 기법을 따르다 보니 객체 지향적으로 만들어졌다. 여기서 상속이라는 개념은 우리가 흔히 생각 할 수 있는

   사람

남     여

와 같이 상위 개념 아래 하위 개념이 존재하는 관계에서 남, 여는 사람을 상속 받는 다고 정의하게 된다.

 이를 쉽게 알아 보기 위해 IS-A 룰이라는 것이 있다.

" 남자 IS A 사람" (영어 "is"를 생각해라)

 한글로 쓰면 "는 - 이다" 룰 이 되겠다.

 "남자 는 사람이다" 가 성립 하면 남자는 사람을 상속하게 된다.

 마찬가지로 "여자는 사람이다" 가 성립 하므로 여자는 사람을 상속하게 된다.

 자- 이제 상속이 무엇인지 알았을 것이다. 그러면 abstract는 무엇인가?

 이것은 개인적으로 프로그래밍 기법 상 나온 말이라 생각한다.

 컴퓨터 프로그램을 만드는 데 (예를 들어 게임) 남자와 여자 케릭터를 생성하고자 한다.

 근데 이 남, 여 케릭터는 사람을 상속 받는 데 프로그래머가 잘못해서 사람 class 를 생성 할려고 하면 이는 안될 말이다.

 남자, 여자 두 가지 캐릭터가 있어야 하는 데 사람 케릭터라니 중성이란 말인가 머란 말인가!? 이처럼 상속의 개념에서 필요한 class 이지만 절대로 instance 화 되어서는 안되는 class들이 존재하기 마련이다.

 이러한 클래스를 abstact 를 이용해 선언하면 해당 클래스는 "절대" instance화 시킬 수 없다.

 이것이 abstract의 개념이다. 여기서 abstract의 또 한가지 좋은 점은

 abstract로 만들어진 method(즉 함수) 들은 상속 시 반드시 쓰여져야 한다.

 즉, 사람 클래스에 "이름, HP, MP" 세 가지 instance 와 "공격" method 가 있다고 가정하고

이들을 abstract 화 시킨 다면

남자, 여자 클래스는 반드시 위 세 가지 instance 와 한 가지 method를 반드시 포함해서 class 를 만들어야 한다. 그렇기에 반드시 필요한 인스턴스와 메소드를 상위 클래스에 지정해 놓는 다면 프로그래밍 시의 실수를 줄이는 데 많은 도움을 줄 것이다.

 override 란 상위 클래스의 메소드 (예 - 공격) 을 하위 클래스에서 사용하는 것을 말한다.

override를 통해 공격 method를 남자 , 여자는 그 메소드를 부르는 것 만으로 사용할 수 있다.

즉, 코드의 중복을 막을 수 있다.

예)
   사람 - 공격 : 몬스터를 때려잡는다. (라고 프로그램을 만들었다고 치자)

남자 - 공격 ; 여자 - 공격

이처럼 공격 메소드를 넣어 놓기만 하면 "몬스터를 때려잡는다" 라는 명령어는 다시 호출 하지 않아도 알아서 상위 클래스에서 불러 와서 사용할 수 있게 된다.

 남자 와 여자 클래스에서 몬스터를 때려잡는다 외에 다른 어떤 것을 넣고자 할 때

super를 이용하면 가능해진다.

즉-  공격 super(몬스터를 때려잡는다) 를 적은 후 사람을 때려잡는다 라고 적으면

super 가 알아서 상위 메소드를 한 번 부르고 사용자가 지정한 사람을 때려잡는다를 호출하게 된다.

 ----- 이해가 되셨나 모르겠다 ---- 하도 주저리 주저리 떠들어 대서... ㅎㅎ;;

2011년 4월 5일 화요일

directx 9 튜터리얼

#include <d3d9.h>
//-----------------------------------------------------------------------------
// 전역 변수
//-----------------------------------------------------------------------------
LPDIRECT3D9         g_pD3D = NULL;
LPDIRECT3DDEVICE9   g_pd3dDevice = NULL; 
//-----------------------------------------------------------------------------
// Device 생성 및 초기화
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof( d3dpp ) ); /// 반드시 ZeroMemory로 깨끗이 초기화 해주어야 함
    d3dpp.Windowed = TRUE;  /// 창 모드로 생성
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; /// 가장 효율적인 SWAP 효과
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;  /// 현재 바탕화면 모드에 맞춤

    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }
    return S_OK;
}
//-----------------------------------------------------------------------------
// Device 해제
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();
    if( g_pD3D != NULL )
        g_pD3D->Release();
}
//-----------------------------------------------------------------------------
// 랜더링
//-----------------------------------------------------------------------------
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );

    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        g_pd3dDevice->EndScene();
    }

    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

create Directx Object

LPDIRECT3D9 g_pD3D = NULL;
    
if( NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
    return E_FAIL;

#pragma comment()

2. #pragma comment()

#pragma comment()로 사용할 수 있는 명령은 여러 개가 있는데, 그 중 가장 대표적인 것이
#pragma comment(lib, "*.ilb")로 해당 라이브러리를 링크 시켜준다.

예를 들어 VC++6.0에서 DirectDraw를 사용하기 위해서는 Project>>Settings의 Link 탭으로 이동하여
Object/library modules 항목란에 ddraw.lib 와 dxguid.lib를 적어 넣어 lib 파일을 링크해 줘야 한다.

하지만,

#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "ddraw.lib")
와 같이 소스코드 내에서 명시적으로 지정을 하면, Project>>Settings... 의 과정을 거치지 않고도 라이브러리를
링크할 수 있다.

2011년 3월 17일 목요일

[안드로이드] Resource entry is already defined.

 Project 내에 이미 존재하는 xml을 클릭(open)한 상태에서

프로젝트를 run 할 때 발생한다.

 xml 파일이 오픈 된 상태에서 run을 하면 그 xml 파일을

포함하고 있는 프로젝트가 아니라 xml 자체를 run 하기 때문에

발생한다.

출처 : (영어) http://stackoverflow.com/questions/1674101/android-project-wont-build-when-editing-a-resource-file

2011년 3월 10일 목요일

[안드로이드] 웹 브라우저 띄우기 + 구글 웹 검색

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
startActivity(intent);
▣ gog.is 는 웹주소 중에서도 이러한 구글 검색 주소만을 줄여주는 서비스입니다. 주소창에 간단하게
http://gog.is/2009.최다판매.자동차
http://gog.is/2009+최다판매+자동차

* 크롬브라우저에서는 + 와 , 기호인식이 안되는군요.
라고만 입력하면 아주 간단하게 위에 구글 검색창에서 직접 검색한 것과 같은 주소로 포워딩해줍니다.
즉, gog.is/ 뒤에 검색하고자 하는 단어를 입력하기만 하면 됩니다. (단어사이는 ' + ' 혹은 ' . ' )
특히, 채팅창에서 친구와 대화하다가 갑자기 검색화면을 공유할 필요가 있을때, http://gog.is/무한도전+유재석+웃긴장면   라고만 입력해주면 편리합니다. 직접링크를 걸 수 없는 커뮤니티 게시판에서 뉴스검색을 간접링크로 걸때도 유용하게 쓸 수 있구요.
제작자는 누군가가 스파이웨어 제거 방법을 당신에게 묻는다면 
http://gog.is/스파이웨어+제거+윈도우 
나 http://gog.is/우분투+설치 로 응수하라고 하는군요. ㅎㅎ
대답해주기 귀찮을 땐 이렇게 :: Let me google that for you 서비스와 함께 이용하면 아주 유용하겠군요. ㅎㅎ