下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 7523|回复: 11
打印 上一主题 下一主题

最简单的游戏程序代码~

[复制链接]
  • TA的每日心情
    开心
    2015-9-17 20:42
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    该用户从未签到

    2
    发表于 2004-4-8 20:54:00 | 只看该作者
    干什么的?走迷宫?
    / q: ]2 a* Q9 p: k; P, N8 N; j: b8 M6 v) q
    还有,代码中混杂英语和中文注译,我怀疑英文部分不是你原创

    该用户从未签到

    3
    发表于 2004-4-9 16:15:00 | 只看该作者
    楼主牛,我一小时只能读懂程序结构和实现方法。9 n6 }4 e- Y# s4 T8 r; ^
    不过void Delay(long time) 函数有问题,把CPU时间都白白吃光了,应该改成Sleep()
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    4
    发表于 2004-4-9 19:35:00 | 只看该作者
    不是吧,这样的程序都叫"最"简单了啊,我看来都是在写白痴程序了
  • TA的每日心情
    开心
    2015-9-17 20:42
  • 签到天数: 1 天

    [LV.1]初来乍到

    5
     楼主| 发表于 2004-4-10 15:23:00 | 只看该作者
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    6
    发表于 2004-4-10 21:36:00 | 只看该作者
    以下是引用hays2002在2004-4-10 15:23:06的发言:! Q% {1 ]: |; G8 K7 Y
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。
    & e) f! {% S/ p
    延时还有比Sleep(int)更好的吗?不浪费cpy啊,你用循环来拖延真是大胆创新啊

    该用户从未签到

    7
    发表于 2004-4-11 15:59:00 | 只看该作者
    循环延时有是有的,不过会造成不同配置上的延时的不一致
    # N2 i1 x6 N, k. N+ O) K, m" t" Y3 E' T2 y
    再问一次,这个游戏到底是游的什么???
    男人 该用户已被删除
    8
    发表于 2004-4-12 16:21:00 | 只看该作者
    是什么游戏啊

    该用户从未签到

    9
    发表于 2004-4-12 16:58:00 | 只看该作者
    以下是引用hays2002在2004-4-10 15:23:06的发言:) ~' G% @8 O+ {8 d
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。
    : Z' [( W. n/ V& V4 T  _, J# \2 g# b& E
    void Delay(long time)   确实可以用来延时,而且延时也比较准,但是Delay()是用CPU满负荷运行换来的。
    , E* l; l+ U7 n$ ^0 k- x( L* M3 X3 e在你的程序中把Delay(long time) 换成  Sleep(long time) ,然后看看CPU的负荷就知道了。, ~+ [$ B5 R# U2 B3 L
    按理说能够在一小时内编出这个游戏的人不会不知道考虑CPU效率的,除非你喜欢让CPU发烧。
    ) i# C% i, I0 O6 h& s9 L7 V. B* X* c3 T

    该用户从未签到

    10
    发表于 2004-5-8 19:31:00 | 只看该作者
    timeSetEvent 这个winAPI来定时不是更好马,毫秒精度应该也可以了
    ( C+ x! `0 v4 p* T9 Y另外好像是用mfc还是什么的,mfc总是把我盟在雇里4 {3 H3 R* z4 G- F
    qztx 该用户已被删除
    11
    发表于 2005-6-6 18:09:00 | 只看该作者
    rpg吗?呵呵

    该用户从未签到

    12
    发表于 2005-6-7 08:45:00 | 只看该作者
    楼主的编码风格真好,一会用C++的风格,一会儿用C的风格,不知道楼主是不是学这两种语言的时候走火入魔了。

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表