TA的每日心情 | 开心 2015-9-17 20:42 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
#include
5 P/ Y' i+ R! w1 F#include // DirectDraw所使用的头文件;( X& q r# F( [
#define MAP_X 64
) w0 q: g+ o1 s6 f3 y7 T8 U#define MAP_Y 48+ g; y+ m, w( W) C
// 变量、声明函数;% \ e- x) E3 y( s9 l [0 ? m* G
LPDIRECTDRAW lpDD; // DirectDraw对象;) Q* ]8 @; e. O" E
LPDIRECTDRAWSURFACE lpDDSPrimary; //主页面,就是你看到的屏幕
\8 b3 f" b* \) {% A" d, uLPDIRECTDRAWSURFACE lpDDSBack; //后备页面,用于翻转屏幕 , y* v5 i5 B, `1 {6 n( f
LPDIRECTDRAWSURFACE lpBK; //地图页面 ; ~% C, u7 R, ~2 \- r& u
LPDIRECTDRAWSURFACE lpPlayer; //英雄页面
" g' G6 B0 z" m* w9 Y- T1 `% |& f6 u* z) YLPDIRECTDRAWSURFACE lplogo; //logo页面 5 L& J" i2 I5 P3 `( A" R. O# t
LPDIRECTDRAWSURFACE lphays; //海斯 7 l+ H) l4 e; G2 N$ U% {; k
2 r" Y8 n- u9 P- w
int MAP[MAP_Y][MAP_X]={- b, P1 O: v9 }. D
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, ) v6 Y9 g* i+ W) o
{1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0 ^8 z* f% C! R3 s* |+ L: f6 I7 o, n
{1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, _& P5 e: k+ S R. b. {- A4 Z" ]
{1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},$ P1 q3 b$ e1 y4 x, ^
{1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},1 _1 {- @1 ?4 A( I+ M
{1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,1},
. }5 [5 j0 ]* a9 h1 D{1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1},
! b, X ~4 ]/ `- B" w{1,0,0,1,0,0,1,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,1,0,1},/ z0 q) B2 i% s3 w
{1,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,1},
' [3 R J3 M. m3 S+ q{1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1},
8 P* V7 y/ R: r4 Z% P2 D4 d/ k! U{1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1},: R9 L1 w: i( I' X# g
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
: q- A: V, |1 j5 k7 k+ ^{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},/ Y' c3 }" ~' ^ B0 T9 j
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},! w! q# B& r' A7 [
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
, W1 x/ X; B b% B& f{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
+ g7 s4 w( a) x& i{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},0 j+ M: p4 y$ ^3 l3 x5 o
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},: j" {% g3 y5 G- S
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},! ] O' w1 p. e: \8 j9 J0 c! `
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
6 }! d) p: H5 y, r; A( @{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
& g. W3 L0 q; f- \# n; P+ T0 C% t{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},( S& C4 Y/ i* n1 M* J
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},# B- k" _9 j o
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};5 R/ a/ |( T6 N- m" A& u
/ r: ^/ \. S+ K2 r' s8 ^2 G$ o6 b# }, `: L8 K% r0 S5 V
int SX=0,SY=0; //地图坐标 . E9 S: G; [3 H% A+ S
" g4 p- y( i" z/ k) X9 a
int old_SX=0,old_SY=0;
) v' \' K9 o* T7 [4 S2 F& j* {0 J7 N# g" I4 n
RECT rect; //blt用的巨型 $ t6 K9 a3 {& e7 L1 S
int speed=10;, V7 Q/ w6 ]+ x5 ~) m* R8 u! g2 x
4 F) H( u2 {6 r3 e( R' h9 O! h
typedef struct{; L3 @- o) {7 W4 i7 u) r6 y! l
int x,y; //当前坐标
& N4 W; X, `- bint old_x,old_y; //旧的坐标
7 f w+ O" O( _int Way; //方向
7 P" J$ G" H/ m0 i I2 P9 nint Stats; //状态
. Y; F" P9 H$ [( g6 M+ b* b}Role;
! {# M: Y3 _4 R! |0 A+ n+ M4 |3 O6 L4 A Z0 J3 B% ] y5 a% g/ m
Role Hero={1,
2 A0 i6 J6 g! Q( b: X( s% u 1,4 S9 m: K7 p. x7 @! ^# p
0,
$ \+ ?+ \6 A# N n& ]; Q3 Y% |! g" J2 { 0,/ B; N/ J$ E% I. s6 _: d
0};/ R$ f' c- b2 S" J$ p
/ W& C! W6 ]" r5 k) i' n7 j, Q
3 y6 j0 ? |4 e @1 z" c1 F) U$ d9 H; ]* g) d; Q" V9 J! x7 G) X
4 M" O$ R# y$ _- B/ V$ y& u
: p* @# @8 ]: [7 M F" e( x
//函数声明列表* e# T9 C4 _8 [2 {2 ?
0 K2 b9 z9 X2 T( ^( E/ aRECT GetRect(int x1,int y1,int x2,int y2);
0 u. M8 _1 t' m; Pvoid MainLoop();
* j2 k& b6 |- R& Xvoid Gamehead();
6 O. O4 \6 c& B+ b8 }! avoid BackGround(); / |4 I* o8 S9 ]
LPDIRECTDRAWSURFACE bitmap_surface(char* file_name);0 ]+ }) ^$ |/ q
DWORD DDColorMatch(IDirectDrawSurface *pdds, COLORREF rgb);
) m9 Y' s. L/ v N3 ZHRESULT DDSetColorKey(IDirectDrawSurface *pdds, COLORREF rgb);' G0 v7 h( b$ G
LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
+ v7 o7 z3 c$ F9 Evoid Delay(long time); //时间函数
3 L& ]# s2 c6 }5 ^/ `BOOL InitWindow(HINSTANCE hInstance, int nCmdShow); // 创建主工作窗口;8 _' @$ M7 ?2 S7 Z& D& _1 s2 W
BOOL InitDDraw(void); // 初始化DirectDraw并且打印字7 y. }8 u3 p' b2 v+ Z' ~+ M) \
#define SafeRelease(x) if (x) { x->Release(); x=NULL; }- |3 r& d5 S% K
void Cleanup(void); // 卸载DirectDraw函数;: Z. q* I- p, D# ?4 I0 S
$ |/ F1 g1 G- n! T; `: X' d5 v
) _& z8 X' ], e7 ^- s3 |
/ Q9 b! M8 E8 z# }' x; Q/ {/ cBOOL InitWindow(HINSTANCE hInstance, int nCmdShow)
( {2 |/ ^) j- F& |; T6 J/ Y{+ D8 p, G3 W" G3 w
HWND hwnd; // 窗口句柄;
! i3 a; U" h/ G$ k* T: s9 r) E7 a WNDCLASS wcex; // 窗口类结构;* J1 ~4 F. a/ V+ \1 r. n3 b5 ~0 k0 F
% l0 v( P, @ q' i% t9 @; c
// 设置窗口类结构;
2 R. ]( M1 d! J8 \( y7 P wcex.style=0; // 风格;
# h/ o+ m9 ]/ N" C( `8 d0 G' h wcex.lpfnWndProc=WinProc; // 窗口处理程序;. I/ n$ ]: A+ T2 G+ e6 f
wcex.cbClsExtra=0; // 扩充风格;
# @5 {6 k# c3 H: m+ G% D: }- X1 f wcex.cbWndExtra=0; // 扩充程序;; `5 q- \7 v' J# x
wcex.hInstance=hInstance; // 应用程序hInstance句柄;
9 ^7 \- E" k, s4 E6 B$ | wcex.hIcon=LoadIcon(hInstance,IDI_APPLICATION); // 读入默认的图标;( I& |* D h# N2 p+ J2 w ]" j
wcex.hCursor=LoadCursor(NULL,IDC_ARROW); // 读入默认鼠标形状;
2 |" Y1 R( _7 G" V/ W: L6 @/ V% G wcex.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景;! y3 k: V; x: O; T
wcex.lpszMenuName=NULL; // 窗口目录;
- L' ^3 @2 M, K) Y7 Z wcex.lpszClassName= "DirectX--Hello"; // 窗口的类名, L8 |3 M) }" M/ [7 K" s+ ?
// 注册窗口类;
) y- w# r" n. L7 J' f RegisterClass(&wcex);
9 m. u- t, U; Y- {# R // 创建主窗口;( ^% }; O% ~* ]
hwnd=CreateWindowEx(WS_EX_TOPMOST,"DirectX--Hello","",WS_POPUP|WS_VISIBLE,- K$ ]6 F3 o& d6 Q4 i
0,0,GetSystemMetrics(SM_CXSCREEN),3 A$ g1 c- b% l e3 k3 j
GetSystemMetrics(SM_CYSCREEN),NULL,NULL,hInstance,NULL);$ K2 G/ h& _2 @/ G+ V& l
if(!hwnd) return FALSE;. i1 Y0 I4 i0 c& s/ L. {( M$ i+ ~4 }; D
ShowWindow(hwnd,nCmdShow); // 显示窗口;
& k- d5 f( P. e UpdateWindow(hwnd); // 更新窗口;
: M8 R8 b3 `5 ^0 [- ? # b L- @- J" M, T
SetTimer(hwnd,1,30,NULL);/ Z6 H( {6 y) M3 ?
8 R8 M' U; G( `6 o* `- U. [/ p
return TRUE;
1 p2 W4 A9 Q& i}
8 g. C$ s) [3 Q* D: O0 [% ^4 b5 s. |
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
/ V6 w3 g7 V! X/ C2 Y9 O' {8 ]{1 v' v3 ?8 y6 G/ Z& G: s
switch(message)
# S6 t5 x# w! q- u( [4 z- n {
1 j4 ^$ Q9 A/ I5 d! t9 }2 l; n case WM_TIMER:
0 I& \7 ^+ r. l2 [9 r9 h' [ lpDDSPrimary->Flip( NULL, 0 );
2 H& b) F3 r! S4 Y" K* s ] break;
8 P9 J- |) X* D
5 A1 q! e: ^% y8 I: x% ~' C, m case WM_KEYDOWN: // 如果击键;8 z4 u& @1 v* n, k0 W1 r& m
switch(wParam)7 B D S/ }" G6 ]: ]
{
, s/ E, N! U, o2 ~ case VK_UP:
0 Y! g& R# v- M( Q6 ?3 L' J% ]2 d+ | Hero.Way=3;
1 x5 d: z" I" [2 X5 {4 b if (SY<=0 && Hero.y<=240) //往上走 1 b( K# {* B# C6 n8 {/ J# ^$ M
{- ^3 `0 F+ p$ q" v
SY=old_SY;
/ |. z; d# U, I Hero.y-=speed;& V$ G- h0 h" G! {1 C2 m+ t
}
5 v$ \8 v0 x8 Z3 Y. g# ~( h8 M else if(SY>=MAP_Y-48 && Hero.y>=240)
3 `* e1 F8 o0 h6 ^( {/ X8 q! _! l {
2 ]7 G7 u/ }* T u SY=old_SY; E l$ [$ R9 Z! p8 x
Hero.y-=speed;
8 w7 g% q' z5 n S: n5 @3 D }2 J( S& F4 Y! \: a i4 { o+ g
else SY--;
3 c, d" D+ h0 c9 g+ B3 b
+ t7 @$ X0 D9 j2 |; C break;
+ \9 E4 b$ z) I! H8 h) `
$ z6 S1 R, h* K* M case VK_DOWN:5 v9 `7 N# S: S. }$ z2 ^
Hero.Way=0;
, H; N. ] E% l' U if (SY>MAP_Y-48 && Hero.y>=240) //往下走
0 P1 b8 h$ r: l7 ? {* k1 W. B4 o+ q( C/ L+ v1 R: C
SY=old_SY;
# _* b x: ~2 C- r4 Z( h9 l( X Hero.y+=speed;8 q+ A' z; o( Z9 C
}9 L7 s- U! w4 X4 @+ E# c, e9 C
else if (SY<=0 && Hero.y<=240): i' |9 d) g. r5 W3 ]
{
3 m, I" a, q* I ?# ?+ R4 p SY=old_SY;
, |/ g3 b5 ?3 t( `" K' I# j Hero.y+=speed;/ W# v- h3 n& x
}
. `3 W7 ^+ x$ F1 B else SY++;1 f4 [4 d7 ^9 n3 t! K% ^
2 X! m+ [! A. ^. n
break;
! `% i l, P& o) x % d( Y+ t9 {# G# g$ p# d. o6 F; o
case VK_LEFT:, t9 d( A# z0 M1 B. X7 f, t& O
Hero.Way=1;
# g7 r& i @% v if (SX<=0 && Hero.x<=320) //往左边走3 \" I& ?7 a( f- {
{) C6 G' M# q: s( z. `: e$ E
SX=old_SX;
5 i* b. `- z; B C Hero.x-=speed;
4 `7 D6 o% H; G }4 M3 i4 b' l/ D* |
else if (SX>=MAP_X-32 && Hero.x>=320)
% u& I9 {1 T4 Z+ a) s# N {& R. ?! r- q2 Y* E8 ?5 R% ]( B; m
SX=old_SX;
]# [, t1 E/ m( k* R Hero.x-=speed;
. p- j2 A% u% Q# M# { }
+ q& L% I/ L' {3 t else SX--;
3 J) W4 s% i' }$ K! _$ s2 K3 d
9 e) t% y! w- w. q break;
% v. P) w, c: q& s, Y ( q1 ?7 s7 _! q+ ~
9 D5 W8 [- O. |* E) X! l% C' Q
case VK_RIGHT:, ?; u. ]7 ^: I+ d: ]" T- ^" z
Hero.Way=2;- H4 U' r- [5 K* c
if (SX>=MAP_X-32 && Hero.x>=320) //往右边走
! X1 a3 Z0 `1 G) U& e1 ~! u% c8 A {
! j# V/ ?' K5 t; [" s SX=old_SX;6 \; p( X" m4 r1 Z* E/ C
Hero.x+=speed;
! d* a) k! j9 F. N }, g* y: X- q0 Y
else if (SX<=0 && Hero.x<=320)
: s- Z% p7 i$ J9 H {8 V/ ~( ]5 G' W
SX=old_SX;1 Z! ^2 p$ |2 a* q& ^! p4 u& y
Hero.x+=speed;
% O0 Y$ t; e' `; } E* M# g0 u g, K }3 F: n2 F0 A V8 K! l
else SX++;5 \7 {2 c' d% U' j' t
2 d0 z3 k0 y& Y/ T
break; 8 |1 x( D7 m% k: S2 h1 L
} 4 E. {1 Z( q) ^7 L- e" i' I
' M" O s0 t' O$ S$ ]* O) K
; G+ O X) i; O3 R6 `" I) G; I8 C Hero.Stats++;
; w l0 `/ e8 H n4 p2 o8 o7 \; ^ if( Hero.Stats>=3 ) Hero.Stats=0;) S( H2 |4 g- F! k a
4 U. o. C# \1 I, n) u8 b/ [ break;% ^1 D$ P! H* g3 k
7 V4 M1 v- n' @ V" e9 W- a7 W case WM_DESTROY: // 退出消息循环;) [5 u9 @$ T6 S* N
Cleanup();, o4 a8 |) C( S0 s" Y0 r6 D
PostQuitMessage(0);, m/ p, @( @- \* M! Q. C7 V
break;
( Z& K; l6 @" A8 N: j }
. j& y* X( `3 i9 F( `* V) S8 ]! ? // 调用缺省消息处理过程;
1 G0 i) B+ B; V7 j return DefWindowProc(hWnd,message,wParam,lParam);5 J6 S% x( k) b8 @
}
' I. B, E. O. M3 X3 T5 [' O2 V0 X1 |4 P, E0 L
// 本程序的最核心内容,即DirectDraw的基本功能与用法;
' k6 \2 E; n- i* g* t; HBOOL InitDDraw(void) - w# p, i9 p5 ~* Y) M% I* P: t; V) |
{0 N. J' E7 [0 S0 S2 h3 z
DDSURFACEDESC ddsd;
% ]" |4 v- g) K: g6 V6 I9 o4 S& B HDC hdc;
6 H: J5 N8 ], b; F. o3 j0 E( U DDSCAPS ddscaps;
8 v |: w1 D' D* H) {" s" C: p4 m // 创建DirectDraw对象;% Q3 W# K4 q: ^2 U# y' W; L9 Z [
if (DirectDrawCreate(NULL,&lpDD,NULL)!=DD_OK) return FALSE;8 a. W, ?3 B7 w3 e6 Y
// 设置为全屏模式;
9 t o$ e8 P- A: Y) O4 I# w if (lpDD->SetCooperativeLevel(GetActiveWindow(), P& h: }. [' c- @" {' n T* M5 Z
DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN)!=DD_OK)
, ? O1 B+ s; Y6 s( p) \ return FALSE;; s, _* t- I5 Y$ M# N6 R
// 设置显示模式;" Y" z; X/ ?4 \) }; J6 }- G
if (lpDD->SetDisplayMode(640,480,16)!=DD_OK) return FALSE;) P/ e+ q5 n4 e- ?. l
// 设置主页面信息;! P( C: m3 r6 }
ddsd.dwSize=sizeof(ddsd);
/ _7 ^% r: d O/ C# M3 y ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
' @$ F* P9 S: I9 F ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |6 X1 i2 A, m+ I7 x2 r# R6 C
DDSCAPS_FLIP |
& N6 p) V+ u6 f2 {2 X' G* q DDSCAPS_COMPLEX;" S" i2 R8 J! B s- K( g* | K/ w
, k: l5 P; G6 R; Y7 [8 B# g# K$ I# F, g ddsd.dwBackBufferCount = 1; 4 R& I: [ m, v+ T% d j4 S- y
& m, E6 J" d, s4 y0 Y4 W
// 创建一个表面,类似开辟一块屏幕大小的显示内存;
! M, B- }, d& s3 g( D if (lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL)!=DD_OK) 7 m8 ]0 m4 {( ]8 H0 w
MessageBox(NULL,"SDSDSDSD","sdsdsdsdsd",0);
& Y- O( z1 I. c* @3 m 4 _0 a( i7 f# I. O4 ]# I
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
8 c: ^6 r; x( k2 z, r, L7 i+ g if ( lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack)!=DD_OK)
2 u/ G- L; P: |8 R' o: T! i3 k MessageBox(NULL,"SDSDSDSD","sdsdsdsdsd",0);
* T, ]3 h( R: [0 t; `$ V# e
% O0 }$ v6 i8 i1 d( _8 } lpBK = bitmap_surface("map1.bmp");
+ l% {& p9 l5 Z lplogo = bitmap_surface("logo.bmp");
7 {" V1 V1 p4 q3 {2 ]! W lphays = bitmap_surface("hays.bmp");
/ {. O$ T, a/ t7 t) o3 i2 ` lpPlayer = bitmap_surface("PLAYER.bmp");
$ L5 k* N5 b2 l$ [& a# \* m DDSetColorKey(lpPlayer,RGB(255,238,187));7 q9 K5 x+ f0 E# K( G# Q* C
) \" v+ w8 ^7 p* T2 w6 o$ q/ r return TRUE;4 {$ Y( a* T1 `( E) U
}
+ u: o/ z0 J3 q0 ?9 q4 b
+ a- Q& F4 [4 B' Pvoid Cleanup(void)% q/ N- J9 @4 n. h* {/ E( A
{
& H% S1 x- B+ S6 ~2 ]
4 t) u3 ?3 G6 h" d- x/ Z! R SafeRelease(lpBK); 8 S5 P0 U( y1 f: m1 ]+ B) y
SafeRelease(lpPlayer); : D. p) a' K& C
SafeRelease(lpPlayer); " t H" H! \ W9 N; U
SafeRelease(lpDDSBack);% @4 L6 T+ k& Z$ ~6 h
SafeRelease(lpDD);
7 T2 b) l) K: x! ~ SafeRelease(lplogo);
7 e$ |: a& x. D
) u7 z# `) S; t% z( h" z4 W}" m7 `; G4 A0 k/ n- w
% d! V; d/ y! a; O
// Windows的主工作函数,类似Dos下Turbo C编程的main();
: O3 V+ `8 @( s; q( Yint PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
' W2 p) P3 A9 t' b2 L+ }8 o2 ` LPSTR lpCmdLine,int nCmdShow)
% A# d3 c! A! P- d5 V G{6 o# S' ]4 g( r% [ }0 E
MSG msg;
) H6 O0 K9 P9 `1 s- C) ]% a . P0 n/ A" n: D- B" d1 z+ U
// 初始化主窗口;% w% S; K p6 f5 E/ }2 n
if (!InitWindow(hInstance,nCmdShow)) return FALSE;
; H% y8 f; d5 P8 X
t; _; n1 _8 I6 _' S // 初始化DirectDraw环境,并实现DirectDraw功能;5 M7 d, {8 |7 ?3 `0 o
if (!InitDDraw())4 z2 R, K+ t- H" S4 z
{
% K6 q! M# z9 m; K2 x MessageBox(GetActiveWindow(),"初始化DirectDraw时出错!",5 h/ K- k% l5 x9 z3 T
"Error",MB_OK);
2 s. o5 \5 B- H2 d; N( }" P void Cleanup();
$ Q4 X" @# d. N1 n* V$ c. c+ T0 s DestroyWindow(GetActiveWindow());
9 L7 v( h; j; b+ C6 f# U/ w return FALSE;
0 n r& P" b4 k8 ? }
! O, r4 e; u1 ]) ] Gamehead();* @" |1 I2 }! E$ |/ \5 [: Z
; p) f! O9 I: [- K; h G- g( ? // 进入消息循环;( I! R$ m. Z- v, X
while(1)
+ ~$ X2 t0 p5 I7 h {
8 q. s( I/ G" ~* U1 |, Z if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
2 m9 d; W! y. p3 ~2 B {; \" J# p5 p8 H* M2 D% W9 H0 d
if(!GetMessage(&msg, NULL, 0, 0 )) return msg.wParam;
5 M6 }) r: P3 A5 r* T9 L TranslateMessage(&msg);
- Z `$ I6 r! R& A. Y. S c DispatchMessage(&msg);
$ ]$ D' C7 L$ W c1 Y' u }
! b" U9 @; j5 p% D5 ?; ~+ }4 O else
( c- H. X6 {. T6 Q8 H* d3 S MainLoop();7 A& D; \9 O% l+ Q
} - x1 V% L) k/ ^. q. a
return msg.wParam;
3 p' R' D$ Q# [3 P, o+ g& M2 C7 ^}8 U( y" J' Q% c" h
( C/ c( z* C5 m- k
( z+ I3 J+ a/ s1 F- p3 R//游戏需要用到的函数
. @/ w }+ v$ a7 I( b# Q% u) X$ c l
& N& \5 f* S2 I3 ]* J$ ~- {& ?, ]) u, V. G _$ r N; B C
6 }" E I7 J! qvoid Gamehead()
( D* w6 c/ B) M{) _7 H; k; m* C0 e5 {1 U7 Z
RECT rect1={0,0,178,145};
: P* s" t/ m& e1 m int x=80,y=100;
$ J1 H( u5 g+ M% k' ` | int i;; s. [$ K# B+ G8 d* ]0 q3 D
8 H. l3 f( U. P$ I5 e8 D' X' B$ b lpDDSPrimary->BltFast( 130+80, 202+120, lphays , &rect1, DDBLTFAST_NOCOLORKEY);
7 q, D [/ ] r9 p& J% D3 b, C
2 A n: v. H5 L6 ]2 v0 m3 a9 K2 R for (i=0;i<6;i++)7 T! Z2 d! Y+ S# W# @
{
( d5 W- \- j& O rect1=GetRect(i*65,0,i*65+65,202);
; i8 X8 H3 [: K& m M: @ lpDDSPrimary->BltFast( x+=65, y, lplogo , &rect1, DDBLTFAST_NOCOLORKEY);
1 p# W: q d& F- h Delay(500);. y1 X& t4 Z; W6 e5 J% r" w6 Q
}
; E- p% E4 w7 N2 g" @0 j8 ?) X 7 K$ n, [4 t+ D, P
Delay(3000);6 t- b% }% o. U5 Y5 E
} 2 k6 k8 c5 M& b# i
3 u' }# q% y& s3 }# o8 Wvoid BackGround() //画地图 * P0 y; }; m; E+ f; W! C% B
{* t9 ~3 ~+ Y1 m
int i,j;
6 l* O. p) P8 z2 {. Y for (i=SY;i# A! p6 `5 h. I* [$ S1 _& c9 b for (j=SX;j2 b3 H& v. ]/ [7 `% Z/ d% e# f if (MAP[j]==1)8 E8 F. T( m4 u( g1 L7 l2 D
{
s1 l" [1 A" z7 O' Y+ K rect=GetRect(0,0,32,32);% i; f# K/ q* }3 i2 c- M4 t6 F4 y
lpDDSBack->BltFast( (j-SX)*32, (i-SY)*32, lpBK , &rect, DDBLTFAST_NOCOLORKEY);# V% L6 s6 e+ o8 K9 ^
}
# B! g; i* G7 Y, y else) c7 k( {& v2 \6 Q8 `
{
5 n; t& M1 w! v( H2 I rect=GetRect(0,32,32,64);. u) q7 L* ~( F$ m- T
lpDDSBack->BltFast( (j-SX)*32, (i-SY)*32, lpBK , &rect, DDBLTFAST_NOCOLORKEY);
; l: E9 h9 Y% z, @ \; ] }
% i' Q" u! b/ H! Q; j; r9 k' k}9 x V) D. S; ]9 u
, U# h9 m( \& f- z9 T$ }8 k! m5 M
RECT GetRect(int x1,int y1,int x2,int y2) //获取对象巨型 $ T' X- h) e9 u) K
{/ s, Y* k8 C4 C; S& U( b
RECT TempRect={x1,y1,x2,y2};+ H3 b* S; }. ]1 C2 [5 _% R8 _
return TempRect;8 N; p' `. L. E) w
}* b1 E: N. V" B/ [ M0 Z
+ p' w% V( F6 H2 Avoid MainLoop() //游戏循环 1 c T* O$ q/ ~% y* j8 O% n
{3 E% w9 J" E _/ B k, K1 d+ w! r" _2 i
BackGround();8 c% r7 c: n7 X. W, Q
RECT rect2={Hero.Stats*32, Hero.Way*48, Hero.Stats*32+32, Hero.Way*48+48};
6 x! C; X4 w2 p. R lpDDSBack->BltFast( Hero.x, Hero.y, lpPlayer , &rect2, DDBLTFAST_SRCCOLORKEY);* G4 h+ L- D- m( I& q, E: e
$ e/ W9 v3 P* s: L6 h) @
if( Hero.x<0 ) Hero.x=0;
8 ]* i5 q, d/ `1 X! `) h if( Hero.x>640-32 ) Hero.x=640-32;
% u8 g; c2 Q0 U$ P& { if( Hero.y<0 ) Hero.y=0;( V/ y/ K6 n8 G: R4 ?
if( Hero.y>480-48 ) Hero.y=480-48;, g$ S% g& M8 h: P0 O7 x
! T" E/ G- O+ u$ c! C Hero.old_x=Hero.x;$ l# @, ]' Y, z8 Q1 o) Q5 Q
Hero.old_y=Hero.y;
. _5 ?: n* Y3 m; T5 o0 j! Y old_SX = SX; old_SY = SY;
8 Z! C, P' ^$ o6 D' k8 o& ]' Q7 j}
. e6 Y9 @5 f* `. @# m" f+ m, o: o# P2 C# L4 @
. K+ ]4 `! w: H( N$ W' ?0 Ivoid Delay(long time) //时间函数
/ t7 a: x! ]/ v$ J& j{8 r6 l- c: j! _& q1 G0 r
static long old_clock, new_clock; //延时变量- U6 f t" i$ c) {
new_clock=old_clock=GetTickCount();
/ W8 T6 H8 v3 D/ _# Q9 B) w$ Q while( new_clock < old_clock + time )
1 \1 Q# H9 j6 P: l {! [! A: k% r9 |: I
new_clock=GetTickCount();
" Y. ~( H5 x3 @! T% E3 Y& U }) I& L8 J/ J0 T
}
- N. c. a4 ?0 E
6 {# q) I1 e* O& Y& H
5 h9 S* r) Z: Z9 i; G7 r8 Y& e/ m$ ^3 U8 M- V
: g. r7 Y/ f6 H9 y" E; F; R//下面是dx相关的函数
4 }* C+ P# c4 j+ ^LPDIRECTDRAWSURFACE bitmap_surface(char* file_name) //位图载入 0 e+ j* w; o2 K/ I' L1 D K
{' a1 B& B5 t4 c
HDC hdc;1 o- {. W( r! ~
HBITMAP bit;
" N1 T% } ^6 l& |1 |$ T LPDIRECTDRAWSURFACE surf;! n5 `4 L4 @. M/ v
. k. F" l3 }$ T2 b( e7 \* F3 @4 A) `1 P0 a% [5 K' J' j+ _
( A1 W: u$ E2 U) K* i! U bit=(HBITMAP) LoadImage(NULL,file_name,IMAGE_BITMAP,0,0,: s5 V3 d ]" e+ I; \8 {2 V
LR_DEFAULTSIZE|LR_LOADFROMFILE);
: h6 ]0 O. B1 C; v; r; h if (!bit) + h( F7 R4 \0 S4 b Y, M8 e
# D& [( u/ V5 i) I. M; C1 p4 }8 w" R" Y& R
8 D2 o( ~4 k1 _8 q" ~% G5 M; _
return NULL;/ J# ?4 f9 f( S1 y8 u
* Z) @3 `! l9 r6 ~8 o# ^2 `0 u6 w" P
* o1 G5 b& X- x6 g BITMAP bitmap;
3 C0 _. W v4 x0 ], i8 y GetObject( bit, sizeof(BITMAP), &bitmap );
0 N$ D! D1 g5 T: h9 R8 o int surf_width=bitmap.bmWidth;
P3 j' c0 b. ?$ }5 K; c int surf_height=bitmap.bmHeight;
. l" [* W7 b0 j$ d L' w0 r1 C5 ]- I7 c9 K
3 j/ g3 ]7 F9 }* @! v- P( s' R7 u5 N
3 B/ w7 F) S# w. ~
HRESULT ddrval;
9 V" H& h* V0 @0 s& T5 K! s/ B) u DDSURFACEDESC ddsd;
, b5 }# J, R5 h: U5 ?6 J ZeroMemory(&ddsd,sizeof(ddsd));5 p% n) j+ ~# y$ O i
ddsd.dwSize = sizeof(ddsd);+ r/ k, A4 N/ {5 M1 c$ f2 Y& c% z
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT ;
" x6 Y/ s/ n; G* p ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
- P8 t2 x Z0 I5 l! ~+ Y' }+ D0 F ddsd.dwWidth = surf_width;
1 A2 }" k' n F6 B0 ? t8 }+ b) T ddsd.dwHeight = surf_height; . k- y0 g5 m' i7 G8 L0 d
$ |% a+ D+ M6 o2 i6 |
8 F. u! X. ]+ d- g1 g2 ]/ n3 V) t
2 W: T) H4 B+ Z5 A ddrval=lpDD->CreateSurface(&ddsd,&surf,NULL);
! u% l6 l/ S- s9 V. n& i* W+ s* o' r' V7 d- v
% Y# N& h, T: X/ q if (ddrval!=DD_OK) {
3 d5 J( a: R' Y1 s: _ l
: t' v9 W, K5 S, |* g
) ^* p$ e; d1 f% k DeleteObject(bit);0 G& O: M( P- Z2 j( L
return NULL;
- {. X) ]5 L7 h4 a. s* A( D4 [8 s5 x2 G+ @. C& {8 M
} else {0 ^5 e( h% l5 @2 V
4 }: S4 p' H1 \7 N" c" F- }* w3 O/ O4 W! K1 v: B: x& S* g: S
surf->GetDC(&hdc);& H9 O- E( ^2 R! R+ R+ Y
* x) _4 K2 }1 E* t0 m- F; D! q
2 @- g9 J, j' @& e3 z! t
' `+ b. R; \% f5 M0 e+ B5 _. |5 p
HDC bit_dc=CreateCompatibleDC(hdc);
* G) _- ?1 S- E, V, F
: y9 P. m; i a6 X2 U4 e2 S
$ c) R! k4 }& @' Z3 b2 l SelectObject(bit_dc,bit);
7 R, J( x4 `. t! ?2 _3 t8 H" o7 Z; _ BitBlt(hdc,0,0,surf_width,surf_height,bit_dc,0,0,SRCCOPY);
; U2 C( @8 o& x( Y) N. [! k3 [3 P+ ~
& u: Z5 H- ~( Y surf->ReleaseDC(hdc);
% y% Y: ]2 y0 I4 C8 a DeleteDC(bit_dc);
& {4 A& d9 Q3 a$ D( l }: w6 x1 e; ?$ i" ^0 ~
7 K! g3 n9 Y- ^* R6 _
3 p4 W0 }. R! ~- e; @, O% w6 j8 |/ b8 A m. Q
DeleteObject(bit);
1 m3 i, P( i! o$ H" t
|0 q# i2 p% r0 t. P" x% ~5 {# o( i; X- w
return surf;# R5 x$ }: ]2 A5 `* z
} 5 ]' v6 W( S* @2 |' B# Z& Z
: Y/ Y' v' T% Z; ^/ l* }6 J. D' w7 n# q0 a* c2 ]
% }' ]2 s' _; |0 n
DWORD DDColorMatch(IDirectDrawSurface *pdds, COLORREF rgb) //颜色匹配 : H* n+ C8 t6 y ~5 k2 W" G
{
! ]" ?1 t" a6 ]' D. h COLORREF rgbT;
! f& f: A3 d, i4 E( c! D! b9 \ HDC hdc;
5 ^6 v$ b' E5 b; s, d8 b5 g DWORD dw = CLR_INVALID;3 T o( g9 t( A- N& o+ G O
DDSURFACEDESC ddsd;( S2 G Q+ E9 C9 O8 O1 T5 [% O
HRESULT hres;& G" l' S- f6 F7 b6 W
& u) \* h( r0 M, G# M //( _ t2 }' V7 W& T. q
// use GDI SetPixel to color match for us3 l) S" {, M! u1 l! _, ^ p, I1 _
//
) W J/ V: _) A8 H if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
& ~- m6 X- i6 p {7 c J: I* |3 y8 g& i, e
rgbT = GetPixel(hdc, 0, 0); // save current pixel value' S9 D' r% q1 l. o
SetPixel(hdc, 0, 0, rgb); // set our value
4 x+ e8 D! O2 D: M" |7 m pdds->ReleaseDC(hdc);
; x T5 [* d% C0 M) U }9 J: X& t% S) o# I' H
% G7 m' X# H9 {5 w* Q# N, L5 Z
//
9 H& w8 O x. S! i7 o! `6 j& ? // now lock the surface so we can read back the converted color$ j, x# w" |4 R% v
//+ H* L N6 K) c H
ddsd.dwSize = sizeof(ddsd);: G% U7 U! I! ]& Z7 h
while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)
1 r: \6 G; A8 s* X, e- o ;
, }5 X6 R; H' D3 D" I5 w0 B# S3 o" N9 C, \' G
if (hres == DD_OK)
T" [. B1 `, T2 C l# J {/ o2 i$ H' ^% w8 K+ e4 t
dw = *(DWORD *)ddsd.lpSurface; // get DWORD" S! r9 x- @( Z. t% A q: R
dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1; // mask it to bpp. [# E ` v0 h l" A/ v: u
pdds->Unlock(NULL);/ h' d6 k3 h8 W: S1 W/ g# X* E
}9 i) q, g# [8 _
q5 v. Q& p8 c/ v //) @. I. d- s; l1 c
// now put the color that was there back.1 E! M% H' i% m# y Z$ b2 _
//
/ w( p9 V/ Q u( y$ k if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK)
' J% [! r- V! ?4 q. m! M {3 V7 G o3 }# S3 c/ T; e$ g
SetPixel(hdc, 0, 0, rgbT);, r) W- h6 D# S
pdds->ReleaseDC(hdc); b6 H2 A1 O: t" ?& D2 g4 ]
}3 j- }' Y3 }) M# ?! S$ ~4 Y
3 x4 m0 w' j B7 A! W
return dw;* K8 N1 a5 d: Q# M+ M% X0 D L
}
; a9 u O8 ~0 [9 l/ L
8 d G8 Q8 v: t( t) N/*
- y5 O" M, Z. e9 `8 s( H1 g0 S * DDSetColorKey* i- W# w8 d7 c7 u5 L
*
' g" A$ h; l4 h/ y0 T- P# w0 c1 M * set a color key for a surface, given a RGB.& B5 H) P+ y2 \% k9 L# l6 X9 n* g
* if you pass CLR_INVALID as the color key, the pixel
. h h. N- \3 ?" n2 G* x * in the upper-left corner will be used.7 O9 o4 N* H" w$ W/ y
*/
( `9 r) r- @5 O: j- O0 q( Y; xHRESULT DDSetColorKey(IDirectDrawSurface *pdds, COLORREF rgb) //关键色设置 2 `5 _9 e! j0 @- H9 ?4 M: z
{& I8 K8 s: D; Y: W3 T
DDCOLORKEY ddck;
' ]6 T4 d& j1 r; o1 n6 D0 A+ t* Q5 i, _. u$ W, S& n+ T: X1 I
ddck.dwColorSpaceLowValue = DDColorMatch(pdds, rgb);2 F6 W& O$ j+ R
ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;3 k+ d1 c3 `3 e$ J# X% \
return pdds->SetColorKey(DDCKEY_SRCBLT, &ddck);
7 {4 G! Q- t9 F* Y}" b) e9 |( d8 d! k
G3 X) }$ [, k6 L: F- M7 S
8 f" q# N. p, T; ]- F& Y
U4 M# @9 _9 W2 p/ P T- c \5 V9 v; ?我花了一小时写的!!!!!!!!!!!!!!!!!!!!!!6 h, {$ K+ a4 a) Z* n+ U
游戏下载地址 hays2002.51.net/game1.rar
+ e. k R) Z# E1 G4 x |
|