디시인사이드 갤러리

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

갤러리 본문 영역

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

전설의백야행갤로그로 이동합니다. 2009.06.26 14:49:08
조회 102 추천 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
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 주위 눈치 안 보고(어쩌면 눈치 없이) MZ식 '직설 화법' 날릴 것 같은 스타는? 운영자 24/04/29 - -
139821 최근 24시간 동안 블로거 들이 관심있어 하는 단어들.. [1] rntjr갤로그로 이동합니다. 09.07.20 108 0
139820 groovy in action 역서나왔네 [1] 핫바리(124.198) 09.07.20 55 0
139819 안돼에에에~~~~!!!! [2] 씬입사원1.7갤로그로 이동합니다. 09.07.20 93 0
139818 횽들아 링크하는법좀 알려줘 [4] 팬져곰갤로그로 이동합니다. 09.07.20 58 0
139816 Material은 망했어 [3] ㅡㅡ(58.184) 09.07.20 68 0
139815 안철수연구소에 입사하려면 어느정도 실력을 가져야 하나요? [9] ㅏㅣㅓ(121.132) 09.07.20 273 0
139813 자바 쓰레드 질문~~ [5] 두루미(218.238) 09.07.20 131 0
139811 몬테카를로 시뮬레이션으로 최적화할때 괜찮은 상황이 뭐가 있을까요...?? [3] 유후잉(121.170) 09.07.20 144 1
139810 횽아들은 직장 상사가 어떤 스타일이었으면 좋겠음? [10] Q Lazzarus갤로그로 이동합니다. 09.07.20 188 0
139807 내가 요즘 웹게임을 즐겨 하는데 [3] Q Lazzarus갤로그로 이동합니다. 09.07.20 106 0
139806 초강추 일본 AV스타 세리나 [7] Vita500갤로그로 이동합니다. 09.07.20 253 0
139805 내 친구녀석이 프로그래머가 3D업종이라는데 [11] 숙신갤로그로 이동합니다. 09.07.20 234 0
139803 기존의 앎은 모두 파괴된다 [12] 오사카(124.56) 09.07.20 186 0
139802 아...슬프고 피곤하다 [12] 숙신갤로그로 이동합니다. 09.07.20 97 0
139801 ajax? javascript? [10] 히밤리눅스갤로그로 이동합니다. 09.07.20 110 0
139800 내일은 비가 안온다네... [16] 아주아슬갤로그로 이동합니다. 09.07.19 119 0
139799 김장훈은 참 멋진거 같아. [3] 제로리플(118.36) 09.07.19 97 0
139797 내가 쓰는 강의에 대해서.. 그 배경이야기 [7] Vita500갤로그로 이동합니다. 09.07.19 88 0
139796 비타500 횽이 쓰는 강의말이양. [1] ㅇㅇ(125.136) 09.07.19 85 0
139795 오랜만에 운동했음 [1] ㅇㅇㅃ갤로그로 이동합니다. 09.07.19 56 0
139794 최근들어 프갤에다 글 안쌌으며 하는 인물 둘을 선정해보자 [14] nRST갤로그로 이동합니다. 09.07.19 178 0
139793 모바일 개발자형들 SK에서 만든거 SKAF 이게 성능이 좋은가요? [4] 아놕(116.123) 09.07.19 129 0
139792 근데 메텔 정체가 뭐임? [9] nRST갤로그로 이동합니다. 09.07.19 134 0
139791 [C]이제 갓 시작한 초보가 질문하나만드릴게요 [3] ㅁㄴㅇㄹ(119.67) 09.07.19 81 0
139790 ddos 뭐라고 읽는가? [6] df갤로그로 이동합니다. 09.07.19 121 0
139788 하드 뒤지다가 이게 나왔네 [3] ls갤로그로 이동합니다. 09.07.19 141 0
139787 아 슈ㅣ발 내 주말 !! [1] 캐꼬꼬닭(221.142) 09.07.19 26 0
139786 드디어 열혈강의 C 책 다끝냈슴. [1] 노소프소갤로그로 이동합니다. 09.07.19 142 0
139784 해킹, 속임수의 예술 책 삽니다. [3] 123(59.6) 09.07.19 165 0
139783 SCJP 문제인데 잘 이해가 안가네요. ㅋ [11] 두루미(218.238) 09.07.19 151 0
139782 휴 드디어 소리가 난다. ∫ 2t dt=t²+c갤로그로 이동합니다. 09.07.19 73 0
139781 IT 존나 편함. [2] ㅇㅇ(121.129) 09.07.19 175 0
139780 엔지니어와 개발자는 다른의미임? 같은의미임? [4] 태연여신님갤로그로 이동합니다. 09.07.19 138 0
139779 태연 NaCl갤로그로 이동합니다. 09.07.19 84 0
139778 방구석에서 컴퓨터나 쳐하지말고 나가서 운동좀하지?? [4] 커플갤로그로 이동합니다. 09.07.19 150 0
139776 프로그래밍 시작하려는 사람은 봅니다. [3] rntjr갤로그로 이동합니다. 09.07.19 197 0
139775 이거 내가 만든 프로그램인데 어때? [5] 프로그래밍갤(58.120) 09.07.19 266 0
139773 진지하게 여쭈어 봅니다..제 인생의 기로 [13] 엄마밥줘(211.36) 09.07.19 323 0
139771 [추가]티셔츠 디자인 하나 해봤음 [15] NaCl갤로그로 이동합니다. 09.07.19 198 0
139770 부러운 샛퀴 [1] 유리한갤로그로 이동합니다. 09.07.19 105 0
139769 블로그 홍보는 어떤식으로 하는거임? [6] DMW(123.111) 09.07.19 122 0
139767 여기서 포토샵 관련 질문해도 됨? [4] 체리찡갤로그로 이동합니다. 09.07.19 96 0
139765 TCPㅡ Z [1] 때릴꺼야?(116.40) 09.07.19 125 0
139764 돼뿔횽은 봄미다 [1] nRST갤로그로 이동합니다. 09.07.19 47 0
139763 근데, 유니코드라 말하면 [10] NaCl갤로그로 이동합니다. 09.07.19 148 0
139762 이런 기획자가 되면 안됩니다. [3] nRST갤로그로 이동합니다. 09.07.19 170 0
139760 다이나 리눅스 첨에 DVD 부팅했을 때 글자 겹치는 문제 해결 [1] 오사카(124.56) 09.07.19 109 0
139757 하앙하앙 폰트를 바꿔 봤다능 [1] DMW(123.111) 09.07.19 129 0
139756 석달간 프로그램 구매비용 총 $60 [6] algorithm갤로그로 이동합니다. 09.07.19 167 0
139755 이런 프로그램 만드려면 어느정도 공부해야함? [15] 눈팅족갤로그로 이동합니다. 09.07.19 296 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2