130910.API게임 제작 프로젝트 : 디펜스 슈팅 게임

|




gohn0929@gmail.com


저작자 표시 비영리 변경 금지
신고
Trackback 0 And Comment 0

130827.윈도우 화면에 캐릭터 띄우기

|

#include <windows.h>


LPCTSTR g_lpszClass = 

"First"; // 클래스 이름


char g_szPlayer[15] = {"(˛¸人˛¸)"}; // 주인공 이미지

int g_iPosX = 400, g_iPosY = 500; // 주인공 위치




// 윈도우 프로시져 콜백 메시지 함수

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


//

// ※ 윈도우 모드에서의 시작 메인

//    1. 윈도우 클래스 등록

//    2. 윈도우 생성

//    3. 윈도우 화면 출력

//

int WINAPI WinMain(

  HINSTANCE hInstance, // 애플리케이션 인스턴스 핸들

  HINSTANCE hPrevInstance, // 이전 인스턴스 핸들로 Win32기반은 NULL

  LPSTR lpszCmdParam, // 커맨드 라인 받을 포인터

  int nCmdShow // 윈도우가 보여질때 상태 기본 NULL

  )

{

HWND hWnd; // 윈도우 핸들

MSG Message; // 이벤트 메시지 큐


WNDCLASS WndClass; // 윈도우 클래스 구조체

// - 개발자가 원하는 형식의

//   윈도우를 만들기 위해

//   구조체에 직접 입력



// 구조체 0으로 초기화( == memset() )

ZeroMemory(&WndClass, sizeof(WndClass));


WndClass.cbClsExtra = 0; // 예약영역. 기본0으로 사용하지 않음

WndClass.cbWndExtra = 0;

WndClass.hbrBackground

(HBRUSH)GetStockObject(WHITE_BRUSH); // 바탕색(흰색)


//<추가코드>

// 백그라운드 색상 변경 테스트!!

/*

#define WHITE_BRUSH         0

#define LTGRAY_BRUSH        1

#define GRAY_BRUSH          2

#define DKGRAY_BRUSH        3

#define BLACK_BRUSH         4

#define NULL_BRUSH          5

*/


WndClass.hCursor

LoadCursor(NULL, IDC_ARROW); // 마우스 커서 이미지


//<추가코드>

// 커서 변경 테스트!!!

/*

#define IDC_ARROW   

#define IDC_IBEAM   

#define IDC_WAIT    

#define IDC_CROSS   

#define IDC_UPARROW 

#define IDC_SIZE    

#define IDC_ICON    

#define IDC_SIZENWSE

#define IDC_SIZENESW

#define IDC_SIZEWE  

#define IDC_SIZENS  

#define IDC_SIZEALL 

#define IDC_NO  

*/


WndClass.hIcon =

LoadIcon(NULL, IDI_APPLICATION); // 아이콘 이미지

WndClass.hInstance = hInstance; // 인스턴스 핸들

WndClass.lpfnWndProc = WndProc; // 프로시저 지정

WndClass.lpszClassName = g_lpszClass; // 클래스 이름

WndClass.lpszMenuName = NULL; // 메뉴이름 기본 NULL


WndClass.style = // 윈도우 스타일

CS_HREDRAW | CS_VREDRAW;


// 1. 레지스터 등록

RegisterClass(&WndClass);


// 2. 윈도우 생성

hWnd = CreateWindow(

g_lpszClass, // 클래스 이름

g_lpszClass, // 캡션바 이름(변경테스트) <추가코드>

WS_OVERLAPPEDWINDOW, // 윈도우 스타일

CW_USEDEFAULT, // 윈도우 X좌표

CW_USEDEFAULT, // 윈도우 Y좌표

CW_USEDEFAULT, // 윈도우 넓이

CW_USEDEFAULT, // 윈도우 높이

NULL, // 부모윈도우 기본 NULL

(HMENU)NULL, // 메뉴

hInstance, // 인스턴스 핸들

NULL // 여분 데이터 기본 NULL

);


//<추가코드>

// 윈도우 스타일 변경 테스트

/*

#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | \

WS_CAPTION        | \

WS_SYSMENU        | \

WS_THICKFRAME     | \

WS_MINIMIZEBOX    | \

WS_MAXIMIZEBOX)

*/


// 3. 윈도우 화면 출력

ShowWindow(hWnd, nCmdShow);



// ※ 무한루프

//    - 윈도우 메시지를 받아서 처리하는 부분

while( GetMessage(&Message, NULL, 0, 0) )

{

if( Message.message == WM_QUIT) break;

TranslateMessage(&Message); // 키 문자이벤트 검사 함수

DispatchMessage(&Message); // WndProc이벤트 처리 함수

}


return (int)Message.wParam;

}



//

// ※ 윈도우 프로시져

//    - iMessage : 이벤트 감지

//  - wParam, lParam : 이벤트를 통한 상세 정보

//

LRESULT CALLBACK WndProc(

HWND hWnd, // 핸들

UINT iMessage, // 이벤트 메시지

WPARAM wParam, // 메시지 파라미터 1

LPARAM lParam // 메시지 파라미터 2

)

{

HDC hdc;

PAINTSTRUCT ps;

switch( iMessage )

{

case WM_KEYDOWN : 

switch(wParam)

{

case VK_LEFT :

g_iPosX--;

break;

case VK_RIGHT :

g_iPosX++;

break;

case VK_UP :

g_iPosY--;

break;

case VK_DOWN :

g_iPosY++;

break;

}

InvalidateRect(hWnd, NULL, true);

break;


// 캐릭터 이미지 출력

case WM_PAINT :

hdc = BeginPaint(hWnd, &ps);

TextOut(hdc, g_iPosX, g_iPosY, g_szPlayer, strlen(g_szPlayer));

EndPaint(hWnd, &ps);

break;

// 윈도우 종료 이벤트

case WM_DESTROY:

PostQuitMessage(0); // 윈도우 종료 함수

break;

}


return( DefWindowProc(hWnd, iMessage, wParam, lParam) );

}

저작자 표시 비영리 변경 금지
신고
Trackback 0 And Comment 0

130826.15일차

|

#include "130826.h"



// 가상 소멸자



/*

class CellPhone

{

char model[12];

public : 

CellPhone( char * model = "no" );

char * getModel();

virtual ~CellPhone();

};

CellPhone::CellPhone( char * model ) {

strcpy( this->model,model );

}

char * CellPhone::getModel() {

return model;

}

CellPhone::~CellPhone() {

puts("CellPhone 소멸자");

}





class CaPhone : public CellPhone

{

int pixel;

public :

CaPhone( char * model = "no", int pixel = 0 );

int getPixel();

virtual ~CaPhone();

};

CaPhone::CaPhone( char * model, int pixel ) : CellPhone ( model ) {

this->pixel=pixel;

}

int CaPhone::getPixel() {

return pixel;

}

CaPhone::~CaPhone() {

puts("CaPhone 소멸자");

}



class Mp3Phone : public CaPhone 

{

int chord;

public : 

Mp3Phone( char * model = "no", int pixel = 0, int chord = 0 );

int getChord();

virtual ~Mp3Phone();

};

Mp3Phone::Mp3Phone( char * model, int pixel, int chord ) : CaPhone ( model , pixel ) {

this->chord=chord;

}

int Mp3Phone::getChord() {

return chord;

}

Mp3Phone::~Mp3Phone() {

puts("Mp3Phone 소멸자");

}



void main()

{

Mp3Phone kim( "갤럭시", 700, 64 );

printf("모 델 명 : %s\n", kim.getModel() );

printf("화    소 : %d\n", kim.getPixel() );

printf("화    음 : %d\n", kim.getChord() );


puts("");


Mp3Phone * ap = new Mp3Phone( "아이폰", 700, 64 );

printf("모 델 명 : %s\n", ap->getModel() );

printf("화    소 : %d\n", ap->getPixel() );

printf("화    음 : %d\n", ap->getChord() );


delete ap;

puts("");



CellPhone * bp = new Mp3Phone("옵티머스", 1000, 128);

printf("모 델 명 : %s\n", bp->getModel() ); // virtual 쓰면 소멸자를 다 호출함. 사용을 못할뿐

// 이게 가상 소멸자

//printf("화    소 : %d\n", bp->getPixel() );

//printf("화    음 : %d\n", bp->getChord() );

delete bp;

puts("");


}


*/







// Template

/*

using namespace std;



template <class T1, class T2, class T3>

T3 hap( T1 a, T2 b);

template <class T1, class T2, class T3>

T3 cha( T1 a, T2 b);

template <class T1, class T2, class T3>

T3 gop( T1 a, T2 b);

template <class T1, class T2, class T3>

T3 mok( T1 a, T2 b);





void main() {


cout << hap < int , char , int > (5,'a') << endl;

cout << hap < int , double , double >(5,5.2) << endl;

cout << cha < double , int , double > (6.7,3) << endl;

cout << gop < int , int , int > (5,2) << endl;

cout << setiosflags(ios::fixed) << setprecision(2) << mok < int , int , int > (5,2) << endl;



}



// 템플릿의 핵심은 만들때 자료형을 정하지 않고 main에서 정한다. 


template <class T1, class T2, class T3>

T3 hap( T1 a, T2 b){

return a+b;

}

template <class T1, class T2, class T3>

T3 cha( T1 a, T2 b){

return a-b;

}

template <class T1, class T2, class T3>

T3 gop( T1 a, T2 b){

return a*b;

}

template <class T1, class T2, class T3>

T3 mok( T1 a, T2 b){

return double(a)/b;

}

*/





//CLASS 를 이용한 template


/*

using namespace std;


template <class T1, class T2, class T3>

class Calc

{

public : 

T3 hap( T1 a , T2 b );

T3 cha( T1 a , T2 b );

T3 gop( T1 a , T2 b );

T3 mok( T1 a , T2 b );

};

template <class T1, class T2, class T3>

T3 Calc< T1 , T2 , T3 >::hap( T1 a , T2 b )

{

return a+b;

}

template <class T1, class T2, class T3>

T3 Calc< T1 , T2 , T3 >::cha( T1 a , T2 b )

{

return a-b;

}

template <class T1, class T2, class T3>

T3 Calc< T1 , T2 , T3 >::gop( T1 a , T2 b )

{

return a*b;

}

template <class T1, class T2, class T3>

T3 Calc< T1 , T2 , T3 >::mok( T1 a , T2 b )

{

return double(a)/b;

}



void main()

{

Calc < int, int, int > m;

cout << "합 : " << m.hap(5,2) << endl;

cout << "차 : " << m.cha(5,2) << endl;

cout << "곱 : " << m.gop(5,2) << endl;

cout << "몫 : " << m.mok(5,2) << endl;



Calc < int, double, double > w;

cout << "합 : " << m.hap(5.2,2) << endl;

cout << "차 : " << m.cha(5,2.4) << endl;

cout << "곱 : " << m.gop(5,2.6) << endl;

cout << "몫 : " << m.mok(5,2.2) << endl;

}


*/







/*


STL ( Standard Template Library )



반복자(iterator)를 가지고 동작하는 C++ 표준 라이브러리의 일부분


컨테이너는 동일한 타입의 객체를 저장, 관리할 목적으로 추상화한 클래스


종류

표준 시퀀스 컨테이너 vecter, string, deque, list 선형방식의 컨테이너

표준 연관 컨테이너 set, multiset, map, multimap 비선형 방식의 컨테이너


저장 방식에 따라

-연속 메모리 기반 컨테이너 보통 데이터 여러개가 하나의 메모리 단위에 저장

배열 기반 컨테이너(array-based container)라고도 함

노드 기반 컨테이너 데이터 하나를 하나의 메모리 단위에 저장


반복자

반복자는 컨테이너에 저장된 객체들에 접근하고 순회하는 일반화된 방법을 제공


*/





/* 


VECTOR


가장 많이 사용

시퀀스 컨테이너 / 연속 메모리 기반 컨테이너


데이터가 삽입될 수록 기존 메모리를 삭제하고 새로운 메모리를 재할당한다.

비효율적인 재할당을 막기 위해서 미리 여유 메모리 공간을 확보한다.

operator[]() 함수를 가지고 있다


==  !=  ++  *  -> 연산자 함수가 정의 되어 있다.




http://www.cplusplus.com/reference/



*/





/*

#include <vector>



using namespace std;




void main()

{

vector <int> v(5);

//v.reserve(5)


v.push_back(10);


// 방의 갯수가 확보된 상태에서만 사용하기

v[0] = 10;

v[1] = 20;

v[2] = 30;

v[3] = 40;

v[4] = 50;


cout << "용량 : " << v.capacity() << endl; // 여분의 크기

cout << "크기 : " << v.size() << endl; // 현재 크기


// 출력

int i;

for ( i=0 ; i<v.size() ; i++ ) {

cout << "v[" << i << "] : " << v[i] << endl;

}

cout << endl;


// 반복자

vector <int>::iterator iter;


for ( iter = v.begin() ; iter < v.end() ; iter++ ) { // 처음 주소를 얻어와서 한칸씩이동하면서 반복

cout << * iter << endl;

}

cout << endl;



// 연산자

iter = v.begin();

iter += 3; // 3칸 이동한곳의 데이터

cout << * iter << endl;


}


*/




/* 


리스트 ( list )


시퀀스 컨테이너 / 노드 기반 컨테이너

삽입, 삭제가 자주 발생할 때 유용

이중 연결 리스트로 구현되어 있어 양방향 반복자를 제공

앞 뒤로 삽입이 모두 가능

operator[]() 함수가 없다.


*/



/*

#include <vector>

#include <list>


using namespace std;

void main()

{

list <int> lt;

lt.push_back( 40 );

lt.push_back( 50 );

lt.push_back( 60 );


lt.push_front( 30 );

lt.push_front( 20 );

lt.push_front( 10 );




cout << "크기 : " << lt.size() << endl;



// 반복자로 출력

list <int>::iterator iter;

for ( iter = lt.begin() ; iter != lt.end() ; iter++ ) {

cout << * iter << endl;

}

cout << endl;



// 양방향 반복자

iter = lt.end();

while ( true )

{

if ( iter == lt.begin() ) break;

iter--;

cout << * iter << endl;

}


cout << endl;


list <int>::reverse_iterator riter;

for ( riter = lt.rbegin() ; riter != lt.rend() ; riter++ ) {

cout << * riter << endl;

}


cout << endl;


// 삽입 

iter = lt.begin();

iter++;


lt.insert( iter , 100 );

for ( iter = lt.begin() ; iter != lt.end() ; iter++ ) {

cout << * iter << endl;

}

cout << endl;




// 삭제

iter = lt.begin();

iter++;

lt.erase(iter);

for ( iter = lt.begin() ; iter != lt.end() ; iter++ ) {

cout << * iter << endl;

}

cout << endl;



}


*/






/*


STRING


문자열을 다루는 전용 컨테이너


basic_string<char>의 typedef일 뿐이다.

시퀀스 컨테이너 / 연속 메모리 기반 컨테이너.

vector와 비슷한 특징을 갖는다.

operator[]() 한수를 가지고 있다. 

string 8bit, basic_string<char>의 typedef

wstring 16bit, basic_string<wchar>의 typedef

string과 wstring은 저장 바이트 수만 다를 뿐 모든 멤버와 기능은 같다


*/




/*

#include <vector>

#include <list>

#include <string>

using namespace std;



void main() 

{

string str = "Hello";


cout << str << endl;

str.push_back('H');

str.push_back('e');

str.push_back('l');

str.push_back('l');

str.push_back('o');


cout << str << endl;


for ( int i=0 ; i<str.size() ; i++ ) {

cout << str[i] ;

}


cout << endl;


//반복자

string::iterator iter;

for (iter = str.begin() ; iter < str.end() ; iter++ ) {

cout << * iter ;

}

cout << endl;


// char *

const char * s = str.c_str(); // const는 값을 변경하지 말라는 말

cout << s << endl;



// cin

//string str1;

//cout << "입력 : ";

//cin >> str1;

//cout << str1 << endl; 

// 입력 받기 귀찮으니까 주석



// find

cout << str.find('e') << endl;


// 대입 연산

string str2 = str;

cout << str2 << endl; 

}



*/





/* 


set / multiset


연관 컨테이너 / 노드 기반 컨테이너

양방향 반복자를 제공

균형 2진 트리인 레드-블랙 트리를 사용

데이터 값을 빠르게 검색하고자 할 때 유용


set 유니크(unique)한 데이커

multiset 중복된 데이터가 존재


*/



/*

#include <vector>

#include <list>

#include <string>

#include <set>

using namespace std;


void main()

{

set <int> s;

s.insert( 10 );

s.insert( 20 );

s.insert( 30 );

s.insert( 40 );

s.insert( 50 );


set <int>::iterator iter;

for ( iter = s.begin() ; iter != s.end() ; iter++ ) {

cout << * iter << endl;

}


cout << endl;




iter = s.find( 40 );

if ( iter != s.end() ) {

cout << * iter << endl;

} else { 

cout << "없음" << endl;

}

}


*/



/*


map multimap


연관 컨테이너 / 노드 기반 컨테이너

양방향 반복자를 제공

균형 2진 트리인 레드-블랙 트리를 사용

map은 key와 value의 쌍으로 구성된 데이터 셋의 집합

연관 컨테이너에서 유일하게 operator[] 연산자 함수 제공


map 유니크한 key

multimap 중복된 key가 존재


*/



/*

#include <vector>

#include <list>

#include <string>

#include <set>

#include <map>

using namespace std;


void main()

{

map <int,int> m;

m[0] = 90;

m[9] = 40;

m[5] = 20;

m[1] = 50;

m[3] = 80;


m.insert( pair<int,int>(4,100) ); // 동일한 index에 대입 안됨


map <int,int>::iterator iter;

for ( iter = m.begin() ; iter != m.end() ; iter++ ) {

cout << "key : " << (*iter).first << "\t" << "value : " << (*iter).second << endl;

}


}


*/



저작자 표시 비영리 변경 금지
신고

'Study > C, C++' 카테고리의 다른 글

130826.15일차  (0) 2013.08.26
130823.14일차  (0) 2013.08.26
130822.13일차  (0) 2013.08.22
130821.12일차  (0) 2013.08.22
130820.11일차  (0) 2013.08.22
130819.10일차  (0) 2013.08.22
Trackback 0 And Comment 0
prev | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ··· | 10 | next