우주배경그림
sky1.bmp
#include <windows.h>
#include "resource.h"
#define SCREEN_WIDTH 1024
#define SCREEN_HEIGHT 768
//───────── 함수선언 ──────────────────────────────────────
//윈도우프로시져 함수 -사용자와 시스템이 보내오는 메세지를 처리
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);// CALLBACK는 호환성과 이식성을 위한 매크로
void DrawScreen(HWND hWnd,HDC hdc);
void DrawBitmap(HDC hdc, int x, int y, HBITMAP NowBitmap);
void DrawBitmap(HDC hdc,int x,int y, int srcx, int srcy, HBITMAP NowBitmap);
void Init(HWND hWnd);
//───────── 전역변수 ──────────────────────────────────────
HINSTANCE g_hInst; //핸들 인스턴스(실행중인 프로그램 하나를 의미/ 프로그램 번호로 봐도 무방)
LPCSTR lpszClass=TEXT("하늘바다영재교육원 기본파일 LEVEL2 ");
//LP는 long pointer를 나타내는 약어
// C는 constant의 약자-함수의 내부에서 인자값을 변경하지 말라는 뜻
// STR은 string 의 약어
int dx=-10 , dy=-10; ; //총알의 위치를 가리키는 변수
int cnt=1;
int spd=8;//스피드
TCHAR str[128]="_=^=_";
TCHAR strh[128]="좌표";
bool isPressed = false ;// 스페이스키 눌림 판단
typedef struct Object
{
int x; // x좌표
int y; // y좌표
bool bLife; //활성화여부 체크
}Object;
Object Myship;
Object Enemy;
Object Bullet;
HBITMAP hBgBitmap, hMyshipBitmap,hEnemyBitmap;
int nScrolly=SCREEN_HEIGHT*2-640 ;
//───────── 메인함수 API엔트리 는 윈도우즈 표준규약을 사용한다는 의미 ─────────────
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd; //윈도우 손잡이(핸들러)
MSG Message; // 메인함수에서 읽어들이는 메시지
WNDCLASS WndClass;//윈도우클래스 lpszClassName,lpfnWndProc,style,hInstance등 10개의 멤버를 가진 구조체
g_hInst=hInstance; //인스턴스 - 실행되는 프로그램 하나 (영어의 뜻: 경우,실제예,사건)
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//기본배경색
//WndClass.hbrBackground=(HBRUSH)CreateSolidBrush(RGB(200,50,100));//사용자 배경색
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //커서
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//아이콘
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass; // 전역변수의 프로그램명 저장
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
//////////////////윈도우 만들기 ////////////////////////////
hWnd=CreateWindow(lpszClass,lpszClass,//클래스명,타이틀바문자열,
WS_OVERLAPPEDWINDOW,//스타일
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,//x,y좌표 가로폭 세로높이 크기
NULL,(HMENU)NULL,hInstance,NULL);//부모윈도우 핸들, 메뉴핸들,프로그램핸들,구조체번지
///////////////// 윈도우 보여주기 ////////////////////////////
ShowWindow(hWnd,nCmdShow);
//////////////////메세지 루프 멀티태스킹 지원 ////////////////////////
while(GetMessage(&Message,NULL,0,0)) //메세지를 읽어들임
{
TranslateMessage(&Message);//키보드 입력 메세지를 만들기
DispatchMessage(&Message); //메세지를 윈도우 프로시저에 전달
}
return (int)Message.wParam; //메세지의 부가 정보
}
//───────── 윈도우 프로시듀어 함수─────────────────────────
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{ //콜백함수 -운영체제에 의해 호출되는 응용프로그램 내의 함수
HDC hdc=0;
PAINTSTRUCT ps;
switch(iMessage)
{
case WM_CREATE:
Init(hWnd);
return 0;
case WM_PAINT: //윈도우즈를 다시 그릴 때 발생
hdc=BeginPaint(hWnd,&ps);
DrawScreen(hWnd,hdc);
EndPaint(hWnd,&ps);
return 0;
case WM_TIMER: //타이머 이벤트 발생
nScrolly-=1;
DrawScreen(hWnd, hdc);
wsprintf(strh,TEXT("nScrolly=%d x=%d y=%d "),nScrolly,Myship.x,Myship.y,dx,dy);
SetWindowText(hWnd,strh);
if (nScrolly<0) { nScrolly=SCREEN_HEIGHT*2-640; }
InvalidateRect(hWnd,NULL,0);
return 0;
case WM_LBUTTONDOWN: //마우스 왼쪽 버튼을 눌렀을 때 발생
MessageBox(hWnd,"왼쪽마우스 눌렸습니다.","안내문",
MB_OK | MB_ICONINFORMATION);
return 0;
case WM_RBUTTONDOWN: //마우스 오른쪽 버튼을 눌렀을 때 발생
if( MessageBox(hWnd,"오른쪽마우스 종료할까요?","안내문",
MB_YESNO | MB_ICONWARNING )==IDYES)
{ exit(0); }
else
{ ; }
return 0;
case WM_KEYDOWN:
switch (wParam)
{
case VK_RIGHT:
Myship.x+=spd;
break;
case VK_LEFT:
Myship.x-=spd;
break;
case VK_UP:
Myship.y-=spd;
break;
case VK_DOWN:
Myship.y+=spd;
break;
case VK_RETURN : case VK_SPACE :
isPressed = true;
SetTimer(hWnd, 1, 10, NULL);
break;
}
wsprintf(strh,TEXT("x=%d y=%d dx=%d dy=%d"),Myship.x,Myship.y,dx,dy);
SetWindowText(hWnd,strh);
InvalidateRect(hWnd,NULL,0);
return 0;
case WM_CHAR: //문자입력이 될 때 발생
return 0;
case WM_DESTROY: //윈도우가 메모리에서 파괴될때 발생
KillTimer(hWnd,1);//1번타이머 끄기
PostQuitMessage(0);
return 0; }
return(DefWindowProc(hWnd,iMessage,wParam,lParam));//기타의 경우 처리
}
//───────── 사용자정의 함수 ──────────────────────────────
void DrawScreen(HWND hWnd, HDC hdc)
{
DrawBitmap(hdc, 0, 0, 0, nScrolly, hBgBitmap);
DrawBitmap(hdc, Enemy.x,Enemy.y, hEnemyBitmap);
DrawBitmap(hdc, Myship.x,Myship.y, hMyshipBitmap);
}
//───────────────────────────────────────────────
void DrawBitmap(HDC hdc,int x,int y, HBITMAP NowBitmap)
{
HBITMAP OldBitmap;
BITMAP bit;
HDC MemDC=CreateCompatibleDC(hdc);
OldBitmap=(HBITMAP)SelectObject(MemDC, NowBitmap);
GetObject(NowBitmap,sizeof(BITMAP),&bit);
int bx=bit.bmWidth;
int by=bit.bmHeight;
BitBlt(hdc,x,y,bx,by,MemDC,0,0,SRCCOPY);
//StretchBlt(hdc,x,y,bx/2,by/2,MemDC,0, 0,bx,by,SRCCOPY);
SelectObject(MemDC,OldBitmap);
DeleteDC(MemDC);
}
//───────────────────────────────────────────────
void DrawBitmap(HDC hdc,int x,int y, int Srcx, int Srcy, HBITMAP NowBitmap)
{
HBITMAP OldBitmap;
BITMAP bit;
HDC MemDC=CreateCompatibleDC(hdc);
OldBitmap=(HBITMAP)SelectObject(MemDC, NowBitmap);
GetObject(NowBitmap,sizeof(BITMAP),&bit);
int bx=bit.bmWidth;
int by=bit.bmHeight;
BitBlt(hdc,0,0, bx, by, MemDC,0, Srcy,SRCCOPY);
SelectObject(MemDC,OldBitmap);
DeleteDC(MemDC);
}
void Init(HWND hWnd)
{
SetTimer(hWnd, 1,100 ,NULL);//1번 타이머 1초마다 발생
Enemy.x=Myship.x=SCREEN_WIDTH/2;
Myship.y=SCREEN_HEIGHT/2;
MessageBeep ( MB_ICONEXCLAMATION ) ;// 사운드
hBgBitmap=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_SPACE)); //초기배경화면
hMyshipBitmap=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_MYSHIP));
hEnemyBitmap=LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_ENEMY));
}