25
Game Programming I Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp1 Windows 프로그래밍 (1) March 27, 2006 Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1 http://www.hallym.ac.kr/~sunkim/teach/2006/gp1 목표 윈도우 프로그래밍에서 이용되는 이벤트 구동 프로그래밍 모델의 이해 Direct3D를 이용하는 윈도우 어플리케이션의 작성을 위한 최소한의 코드 이해

Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Game Programming I

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Windows 프로그래밍 (1)

March 27, 2006

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

목표

윈도우프로그래밍에서이용되는이벤트구동프로그래밍모델의이해

Direct3D를이용하는윈도우어플리케이션의작성을위한최소한의코드이해

Page 2: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

윈도우 (Win32) 어플리케이션

Direct3D API (어플리케이션프로그래밍인터페이스)를이용하기위해필요

Win32 API를이용해작성C 프로그래밍언어로공개된저수준함수와구조체의집합

우리가작성한어플리케이션과운영체제(OS)가서로통신하도록도와줌

핵심테마 –창을제어하는것메뉴, 도구모음, 스크롤바, 버튼, 대화상자컨트롤

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

둘러보기

자원 (Resources)CPU 사이클, 메모리, 모니터화면등

다수의어플리케이션은자원을공유

이벤트 (Events), 메시지큐, 메시지, 메시지루프이벤트구동프로그래밍모델 (“event-driven programming model”)

이벤트발생 메시지전달 메시지큐에추가메시지루프가메시지확인 해당하는창의윈도우프로시저로메시지전달

Page 3: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

이벤트 구동 프로그래밍 모델

이벤트이벤트

어플리어플리케이션케이션 AA메시지메시지루프루프

어플리어플리케이션케이션 BB메시지메시지루프루프

어플리어플리케이션케이션 CC메시지메시지루프루프

윈도우윈도우

프로시저프로시저A1A1

윈도우윈도우

프로시저프로시저B1B1

윈도우윈도우프로시저프로시저

C1C1

윈도우윈도우프로시저프로시저

C2C2

메시지큐

어플리케이션A

메시지큐

어플리케이션B

메시지큐

어플리케이션C

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

GUI (Graphical User Interface)

그래픽사용자인터페이스

윈도우의 캡션 바 메뉴 바

툴 바

크기 조절 바상태 바 윈도우 클라이언트 영역

대화 상자

버튼 컨트롤

Page 4: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

MS Visual C++ 6.0

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

File New

1

2

3

Page 5: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

New Win32 Application

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

New Win32 Application

Page 6: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

ClassView

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

FileView

Page 7: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

File New

1

2

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

New C++ File

Page 8: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Hello

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

“main.cpp”

#include <windows.h>

HWND MyMWindowHandle = 0;

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, intnShowCmd )

{// Create the main window

// Main message loop

}

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )

{

}

Page 9: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

WNDCLASS와 등록

// Registers the window class

WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;wc.lpfnWndProc = (WNDPROC)WndProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );wc.hCursor = LoadCursor( 0, IDC_ARROW );wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );wc.lpszMenuName = 0;wc.lpszClassName = szClassName;

RegisterClass(&wc);

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

MSDN Library (1)

Page 10: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

MSDN Library (2)

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

MSDN Library (3)

Page 11: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

윈도우 만들기와 보여주기

// Create the main window

MyMWindowHandle = CreateWindow( szClassName,

"Hello",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

0,

0,

hInstance,

0 );

if( !MyMWindowHandle )

return false;

ShowWindow( MyMWindowHandle, nShowCmd );

UpdateWindow( MyMWindowHandle );

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

메시지 루프

// Main message loop

MSG msg;

while( GetMessage( &msg, 0, 0, 0 ) )

{

TranslateMessage( &msg );

DispatchMessage (&msg );

}

UnregisterClass( szClassName, wc.hInstance );

return msg.wParam;

Page 12: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

윈도우 프로시저

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )

{switch( msg ) {case WM_LBUTTONDOWN:

MessageBox( 0, "Hello, World!!!", "Hello", MB_OK );break;

case WM_KEYDOWN:if( wParam == VK_ESCAPE ) {

DestroyWindow( MyMWindowHandle );}break;

case WM_DESTROY:PostQuitMessage( 0 );break;

default:return DefWindowProc( hWnd, msg, wParam, lParam );

}return 0;

}

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

MessageBox 함수

API 함수

hWnd –소유주윈도우의핸들 (null 가능)

lpText –메시지상자에넣을텍스트

lpCaption –메시지상자의제목에넣을텍스트

uType –메시지상자의스타일 (MB_OK, MB_OKCANCLE, MB_YESNO, MB_ICONINFORMATION, MB_ICONQUESTION, …)

리턴값 – IDOK, IDCANCLE, IDYES, IDNO, …

int MessageBox (HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType

);

int MessageBox (HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType

);

Page 13: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

향상된 메시지 루프

int Run( ){

MSG msg;while( true ){

if( ::PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ){

if( msg.message == WM_QUIT )break;

::TranslateMessage( &msg );::DispatchMessage (&msg );

}else

// 게임 코드를 실행한다.}return msg.wParam;

}

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

연습과제 (1)

윈도우어플리케이션에서다음을변경시키시오.윈도우배경색상

아이콘

커서

윈도우의크기

메시지상자의내용

새로운메시지상자를생성하시오.마우스우측버튼을클릭했을때, 메시지상자생성

키보드의 Enter키를눌렀을때, 메시지상자생성

Page 14: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

선 그리기

선 (Line)두점사이의이동경로

마우스로드래그하는경로를따라생성

알고리즘마우스왼쪽버튼이눌렸을때의위치 (x, y) 를저장

(x1, y1)

마우스가드래그된위치 (x, y)와 (x1, y1) 사이의경로를직선으로그림

(x, y)를 (x1, y1)에저장

마우스왼쪽버튼이올라갈때까지계속반복

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Creating Variables

Page 15: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Window Procedure (1)

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Window Procedure (2)

Page 16: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Result (1)

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

사각형 그리기

펜(pen)과브러쉬(brush)의색상변경create select delete

HPEN CreatePen ( int fnPenStyle, int nWidth, COLOREF crColor );HPEN HPEN CreatePenCreatePen ( ( intint fnPenStylefnPenStyle, , intint nWidthnWidth, COLOREF , COLOREF crColorcrColor ););

PS_SOLID

PS_DASH

PS_DOT

PS_DASHDOT

PS_DASHDOTDOT

HBRUSH CreateSolidBrush ( COLOREF crColor );HBRUSH HBRUSH CreateSolidBrushCreateSolidBrush ( COLOREF ( COLOREF crColorcrColor ););

HBRUSH CreateHatchBrush ( int fnStyle, COLORREF crColor );

Page 17: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

MSDN – CreatePen

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

MSDN – CreateHatchBrush

Page 18: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Creating a Function

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Window Procedure

Page 19: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

DrawRect( )

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Result (2)

Page 20: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

사각형 움직이기

타이머 (Timer)정해진간격으로시간을측정해주는내부함수 (단위: milliseconds)

함수 – SetTimer ( ), KillTimer ( )

이벤트– WM_TIMER

알고리즘WM_TIMER 통지를받을때마다사각형의위치를변경시킴

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

MSDN – Timers

Page 21: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

New Definition

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Creating a Timer

Page 22: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Window Procedure

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Killing a Timer

Page 23: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

DrawRect( )

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

InvalidateRect( )

Page 24: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Result (3)

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Erasing the Background

Page 25: Windows 프로그래밍(1)graphics.hallym.ac.kr/teach/2006/gp1/src/04windows.pdf둘러보기 자원(Resources) CPU 사이클, 메모리, 모니터화면등 다수의어플리케이션은자원을공유

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

Result (4)

Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2005/gp1http://www.hallym.ac.kr/~sunkim/teach/2006/gp1

연습과제 (2)

사각형을세로나대각선으로움직이도록만드시오.

사각형이윈도우의끝에부딪히면반대방향으로바꿔움직이도록만드시오.

RECT rect;GetClientRect( MyMWindowHandle, &rect );

rect.left, rect.top, rect.right, rect.bottom

RECT RECT rectrect;;GetClientRectGetClientRect( ( MyMWindowHandleMyMWindowHandle, &, &rectrect ););

rect.leftrect.left, , rect.toprect.top, , rect.rightrect.right, , rect.bottomrect.bottom