디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

그라고 게임을 만들고 싶냐잉? 만들고싶으면 따라해

전설의백야행갤로그로 이동합니다. 2009.06.26 14:49:08
조회 103 추천 0 댓글 0

안녕하세요 ^_^ ㅋㅋㅋ VampireJK입니다
가입한지 얼마안된 뉴비입니다. 굽신굽신 아프롱 잘부탁드린다능..
간단하게 제가 제작 중인 게임을 통해서 소스를 같이 파악해보려는 의도와
잘하시는분의 도움좀 받고싶사
이렇게 강의같이 글을 올리게 되었습니다.
자~ 그럼 시작해..보기전에..
개발은 winapi, directx를 이용한 슈팅게임입니다
현재 개발 단계는 배경화면등록, 주인공비행기등장, 미사일발사, 이동 이렇게만 구현된 상태입니다.
일단 사전지식에 대해서 말씀드리겠습니다.
WinApi, C, C++ 이 정도는 어느정도 간단하게 라도 알고 계셔야 이해하기 편할것 같습니다.
그래도 최대한 자세하게 써볼려고 하니 재미있게 읽어주세요.
그리고 제작에 많은 도움을 주신 Vitamin500님에게 정말 감사의 말씀을 드립니다.
밑에 부분이 풀소스입니다.
일단 지금은 시간이 없어 소스만 올리겠습니다(회사에서 하는거라 ㅎㅎㅎ)
주석은 최대한 달아놓았으니 한번 읽어보시고
오늘안에 강의를 시작할 예정입니다 ^^
그럼 즐프하세요

#include <d3d9.h>
#include <d3dx9.h>
#pragma warning( disable : 4996 ) // disable deprecated warning
#include <strsafe.h>
#pragma warning( default : 4996 )

LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
LPD3DXSPRITE g_pSprite;
WNDCLASSEX g_wc;
HWND g_hWnd;

//구조체 생성
struct Object
{
 BOOL bVisible;     //총알 발사여부
 LPDIRECT3DTEXTURE9 g_pTexture;
 RECT rcSrc;
 D3DXVECTOR3 vecCenter;
 D3DXVECTOR3 vecPosition;
};
Object g_Obj[3];
Object g_Bullet[100];

//제작함수 2가지.
void Update();    
void initvector(); //그림이 출력될 위치 변수 초기화
//Game g_Game;
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
HRESULT InitD3D( HWND hWnd );


void initvector() //이미지출력 위치 초기화 함수선언
{
 ZeroMemory(g_Obj, sizeof(g_Obj));
 //배경화면
 g_Obj[0].bVisible = TRUE;
 g_Obj[0].vecPosition.x = .0f;
 g_Obj[0].vecPosition.y = .0f;
 g_Obj[0].vecCenter.x = .0f;
 g_Obj[0].vecCenter.y = .0f;
 D3DXCreateTextureFromFile(g_pd3dDevice, "배경.bmp", &g_Obj[0].g_pTexture);
 g_Obj[0].rcSrc.left = 0;
 g_Obj[0].rcSrc.top = 0;
 g_Obj[0].rcSrc.right = 1000;
 g_Obj[0].rcSrc.bottom = 550;
   
 //비행기
 g_Obj[1].bVisible = TRUE;
 g_Obj[1].vecPosition.x = 100.0f;
 g_Obj[1].vecPosition.y = 100.0f;
 g_Obj[1].vecCenter.x = .0f;
 g_Obj[1].vecCenter.y = .0f;
 D3DXCreateTextureFromFile(g_pd3dDevice, "비행기1.jpg", &g_Obj[1].g_pTexture);
 g_Obj[1].rcSrc.left = 0;
 g_Obj[1].rcSrc.top = 0;
 g_Obj[1].rcSrc.right = 30;
 g_Obj[1].rcSrc.bottom = 50;

 //총알이미지
 g_Obj[2].bVisible = FALSE;
 g_Obj[2].vecPosition.x = g_Obj[1].vecPosition.x;
 g_Obj[2].vecPosition.y = g_Obj[1].vecPosition.y;
 g_Obj[2].vecCenter.x = .0f;
 g_Obj[2].vecCenter.y = .0f;
 D3DXCreateTextureFromFile(g_pd3dDevice, "bullet.bmp", &g_Obj[2].g_pTexture);
 g_Obj[2].rcSrc.left = 0;
 g_Obj[2].rcSrc.top = 0;
 g_Obj[2].rcSrc.right = 5;
 g_Obj[2].rcSrc.bottom = 5;

 //나아가는 총알이미지를 위해 총알객체 100개정도생성
 g_Bullet[0].bVisible = FALSE;
 g_Bullet[0].vecPosition.x = .0f;
 g_Bullet[0].vecPosition.y = .0f;
 g_Bullet[0].vecCenter.x = .0f;
 g_Bullet[0].vecCenter.y = .0f;
 D3DXCreateTextureFromFile(g_pd3dDevice, "bullet.bmp", &g_Bullet[0].g_pTexture);
 g_Bullet[0].rcSrc.left = 0;
 g_Bullet[0].rcSrc.top = 0;
 g_Bullet[0].rcSrc.right = 50;
 g_Bullet[0].rcSrc.bottom = 50;

 for(int i = 1 ; i < 100 ; i++)
 {
  memcpy( &g_Bullet[i], &g_Bullet[0], sizeof(g_Bullet[0]));

 }

}
void InitWin(void)
{
 // Register the window class
 WNDCLASSEX g_wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  "D3D Tutorial", NULL };
 RegisterClassEx( &g_wc );

 // Create the application\'s window
 g_hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 02: Vertices",
  WS_OVERLAPPEDWINDOW, 100, 100, 1000, 500,
  NULL, NULL, g_wc.hInstance, NULL );

}

void InitDX(void)
{
 InitD3D(g_hWnd);
 D3DXCreateSprite(g_pd3dDevice, &g_pSprite);
}

void Initilize(void)
{
 
 InitWin(); //윈도 클래스등록 및 윈도우 생성
 InitDX();  //Direcx 초기화
 initvector();//배경화면 위치 및 비행기 위치 초기화 및 총알 초기화

 // Show the window
 ShowWindow( g_hWnd, SW_SHOWDEFAULT ); //윈도우 화면에 뿌려주기
 UpdateWindow( g_hWnd );               //윈도화면이 바뀌면 업데이트해주기
}

//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
 g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );


    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );

    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;


 g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  &d3dpp, &g_pd3dDevice );

    return S_OK;
}

//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
 if ( g_pSprite != NULL)
  g_pSprite->Release();

    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )      
        g_pD3D->Release();
}

//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
 int k = 0;

 // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
  
    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
 
  g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
  
  //처음에 배경화면과 비행기를 표현
  for(int i=0; i<2; ++i)
  {
   if(g_Obj[i].bVisible == TRUE)
   {
    g_pSprite->Draw(g_Obj[i].g_pTexture, &g_Obj[i].rcSrc, &g_Obj[i].vecCenter, &g_Obj[i].vecPosition, 0xffffffff);
   }
   
  }

  for(int i=0; i<100; ++i)
  {
   if(g_Bullet[i].bVisible == TRUE)
    g_pSprite->Draw(g_Bullet[i].g_pTexture, &g_Bullet[i].rcSrc, &g_Bullet[i].vecCenter, &g_Bullet[i].vecPosition, 0xffffffff);
  }
  //g_pSprite->Draw(g_pTexture2, &rcSrcRect, &vecCenter, &vecPosition2, 0xffffffff);
  //g_pSprite->Draw(g_pTexture, &rcSrcRect1, &vecCenter, &vecPosition, 0xffffffff);
  g_pSprite->End();
  
        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

// 키값을 입력받아 처리하는 함수
void Update()
{
 if(GetKeyState(VK_LEFT) & 0x80000000)//왼쪽
  {
   g_Obj[1].vecPosition.x -= 5.0f;
  }
  else if(GetKeyState(VK_RIGHT) & 0x80000000)
  {
   g_Obj[1].vecPosition.x += 5.0f;//오른쪽
  }
  else if(GetKeyState(VK_UP) & 0x80000000)
  {
   g_Obj[1].vecPosition.y -= 5.0f;//위
  }
  else if(GetKeyState(VK_DOWN) & 0x80000000)
  {
   g_Obj[1].vecPosition.y += 5.0f;//아래
  }

      if(GetKeyState(VK_SPACE) & 0x80000000)//총알발사
  {
   for(int i=0; i<100; ++i)
   {
    //총알 이미지가 false값이면 트루로 변경
    if(g_Bullet[i].bVisible == FALSE)
    {
     g_Bullet[i].bVisible = TRUE;
     
     //비행기의 위치에서 총알 발사하기위함
     g_Bullet[i].vecPosition = g_Obj[1].vecPosition;
     break;
    }
   }
   
  }

  for(int i=0; i<100; ++i)
  {
   if(g_Bullet[i].bVisible == TRUE)
    g_Bullet[i].vecPosition.y -= 5.0f;

   if(g_Bullet[i].vecPosition.y <= -50.0f)
    g_Bullet[i].bVisible = FALSE;
  }

}


//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window\'s message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}


//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application\'s entry point
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
 Initilize();
 MSG msg;
 ZeroMemory( &msg, sizeof(msg) );
 while( msg.message!=WM_QUIT )
 {
  //메세지큐에 메시지가있으면 처리
  if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  {
   TranslateMessage( &msg );
   DispatchMessage( &msg );
  }
  //메세지가없다면
  else
  {
   Update(); //키보드입력에 대한 변화 비행기 이동 및 스페이스바에 의한 총알 발사위치 지정
   Render(); //dx를 이용하여 화면에 비행기 및 총알 이미지출력
  }
 }
    UnregisterClass( "D3D Tutorial", g_wc.hInstance );
    return 0;
}

 


 

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 어떤 상황이 닥쳐도 지갑 절대 안 열 것 같은 스타는? 운영자 24/05/20 - -
144919 GetKeyState()에 대해 질문좀 [5] 화나(58.237) 09.08.24 74 0
144918 내가 근무하고 싶은회사. [5] 심심이(203.248) 09.08.24 171 0
144917 아이팟 터치로 돌아다니면서 프로그래밍 할 수 있으면 진짜 좋을것 같다. [6] 이에갤로그로 이동합니다. 09.08.24 132 0
144916 자유무역은 무역에 참가한 모든사람에게 모두 이익이다. [3] 심심이(203.248) 09.08.24 131 0
144915 내가 근무하고 싶은 회사 [7] fguy(211.192) 09.08.24 247 0
144914 api책 추천좀 [1] 간왕(121.142) 09.08.24 65 0
144913 웹서비스 개발할적에.. [2] yundream(211.189) 09.08.24 113 0
144912 블랙잭이 떴구나... [1] 물속의다이아갤로그로 이동합니다. 09.08.24 135 0
144911 지금 옴니아에 리눅스 깔아서 emacs 설치하려고 하는데... [9] 물속의다이아갤로그로 이동합니다. 09.08.24 183 0
144910 삼성폰 내년에 독자 OS 개발 [6] 심심이(203.248) 09.08.24 173 0
144909 스카포에서는 OS 시간에 운영체제 하나 만드나여? [6] ㅇㄹ(118.217) 09.08.24 165 0
144908 만선 예감] 싱크 어바우트 FTA [127] yundream(211.189) 09.08.24 343 0
144906 자바 질문좀 부탁드릴게여 ㅠㅠ [7] ㅈㅈㅈ(221.165) 09.08.24 89 0
144904 CLOSE_WAIT 해결책은 뭐임? [7] 허허실실(125.177) 09.08.24 134 0
144903 분당살람 횽아... 나 암호 까먹었는데... [3] 물속의다이아갤로그로 이동합니다. 09.08.24 77 0
144902 프로그래밍 잘한다고 허세부리는 중2의 블로그 [12] 김네버(115.137) 09.08.24 303 0
144901 나 어제 신종플루 환자와 접촉한듯 [2] 유리한갤로그로 이동합니다. 09.08.24 106 0
144900 개쉛기횽은 봄니다 [4] 아주아슬갤로그로 이동합니다. 09.08.24 74 0
144899 신고정신 투철한 도둑 [6] ㅇㅇㅃ갤로그로 이동합니다. 09.08.24 153 0
144898 F# for scientist 라는 외국책 6만원주고 샀었는데요 [7] 성대아싸(121.137) 09.08.24 265 0
144897 프로그래머 혼신의 삶을 담은 애니메이션이 나왔으면 좋겠다. [7] 라큐아갤로그로 이동합니다. 09.08.24 149 0
144896 지난여름... [2] rntjr갤로그로 이동합니다. 09.08.24 141 0
144895 Vita500형 질문좀 할꼐요 [3] 곽한구(58.237) 09.08.24 86 0
144894 과학의 탈을 쓴 종교 떡밥 [2] Tathagata갤로그로 이동합니다. 09.08.24 134 0
144892 갑자기 생각나서.. [4] 유리한갤로그로 이동합니다. 09.08.24 88 0
144891 나 잘하면 11월달에 멕시코 가는데... [2] 물속의다이아갤로그로 이동합니다. 09.08.24 67 0
144890 중국갔다가 잘 돌아왔는데 [5] ∫ 2t dt=t²+c갤로그로 이동합니다. 09.08.24 121 0
144889 주성치 영화가 유치하다?? [14] 개쉛기갤로그로 이동합니다. 09.08.24 177 0
144888 아주쓸쓸훃 있츰 'ㅅ'?? [2] 개쉛기갤로그로 이동합니다. 09.08.24 62 0
144887 plc가 어려운거야? 아니면 윈도우 프로그래밍이 어려운 거야>? [2] 미미빠빠갤로그로 이동합니다. 09.08.24 214 0
144886 컴파일러 과목이 궁금함니다 [11] 아주아슬갤로그로 이동합니다. 09.08.24 179 0
144885 1부터 100까지 더하는 완전 대박 획기적인 알고리즘... [3] 물속의다이아갤로그로 이동합니다. 09.08.24 242 0
144883 근데 횽들 지난학기에 학교에서 png jpg 풀네임같은거 시험봄 ㅠㅠ [4] 노소프소갤로그로 이동합니다. 09.08.24 104 0
144882 프로그래머가 운영체제에 대해서도 공부해야 됨? 걍코딩질만 하면안됨?? [15] 노소프소갤로그로 이동합니다. 09.08.24 251 0
144881 불여우로 데브피아 들어가려고 하는데 이런게 뜬다능... [1] 물속의다이아갤로그로 이동합니다. 09.08.24 84 0
144880 횽들 학교 과목중 운영체제 및 실습을 들어야할까여 말아야 될까요 ㅠㅠ? [9] 노소프소갤로그로 이동합니다. 09.08.24 104 0
144879 엉엉 내 이어폰 죽었다능 엉엉 ㅠㅠㅠㅠㅠ [3] 아주아슬갤로그로 이동합니다. 09.08.24 84 0
144878 경리가 나보고 잠깐 오후에 남자고 하는데... [4] 물속의다이아갤로그로 이동합니다. 09.08.24 188 0
144877 공돌이를 유혹하는 걸그룹 [5] ㅇㅇㅃ갤로그로 이동합니다. 09.08.24 248 0
144873 국내 도입이 시급하다능 [3] 분당살람갤로그로 이동합니다. 09.08.24 152 0
144872 자바 제네릭 질문 [3] ww(221.165) 09.08.24 80 0
144871 신자유주의와 자본주의 [64] yundream(211.189) 09.08.24 334 0
144870 프로그램 리소스에 manifest 넣을 때 질문.. [5] 설지갤로그로 이동합니다. 09.08.24 64 0
144869 요즘 전산전공 학부생들의 플밍 실력이 좋지 않다는 게 사실? [6] 중달(121.166) 09.08.24 215 0
144868 피보나치는 재귀로 짜도 된다 [7] Zaphod갤로그로 이동합니다. 09.08.24 257 0
144867 횽들 나 뭔가를 깨달았당 [14] 폐인의세계갤로그로 이동합니다. 09.08.24 178 0
144865 유니코드와 아스키 질문좀 [4] TUNA갤로그로 이동합니다. 09.08.24 98 0
144864 나로호 내일발사 [4] 이모군(210.218) 09.08.24 101 0
144862 짐승같이 무식한. [5] 핫바리(124.198) 09.08.24 144 0
144861 사람이 만든건 항상 완벽하지 않다 [8] 부락페스티발갤로그로 이동합니다. 09.08.24 151 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2