下沙论坛

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

QQ登录

QQ登录

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

最简单的游戏程序代码~

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

    [LV.1]初来乍到

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

    该用户从未签到

    2
    发表于 2004-4-8 20:54:00 | 只看该作者
    干什么的?走迷宫?
    ) x7 `( N; {$ t, `1 I, [2 M9 [# Z1 `
    还有,代码中混杂英语和中文注译,我怀疑英文部分不是你原创

    该用户从未签到

    3
    发表于 2004-4-9 16:15:00 | 只看该作者
    楼主牛,我一小时只能读懂程序结构和实现方法。& W/ |; n  f# @4 p; u
    不过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的发言:
    2 ^8 d# d- a! V8 K' a绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。

    / b. h! y2 r; L$ E6 \# k8 e延时还有比Sleep(int)更好的吗?不浪费cpy啊,你用循环来拖延真是大胆创新啊

    该用户从未签到

    7
    发表于 2004-4-11 15:59:00 | 只看该作者
    循环延时有是有的,不过会造成不同配置上的延时的不一致$ Z2 l4 p& a( e6 s) c9 \- W% G! o
    0 q8 Z$ z1 \5 S+ [  p5 W$ g3 d
    再问一次,这个游戏到底是游的什么???
    男人 该用户已被删除
    8
    发表于 2004-4-12 16:21:00 | 只看该作者
    是什么游戏啊

    该用户从未签到

    9
    发表于 2004-4-12 16:58:00 | 只看该作者
    以下是引用hays2002在2004-4-10 15:23:06的发言:
    3 ~" y/ Z) h& g; [7 m% v9 Y' z绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。

    . _0 d/ C' D4 i6 lvoid Delay(long time)   确实可以用来延时,而且延时也比较准,但是Delay()是用CPU满负荷运行换来的。$ c; c. k) f7 \/ F& E+ B
    在你的程序中把Delay(long time) 换成  Sleep(long time) ,然后看看CPU的负荷就知道了。' S9 |0 }! u' L
    按理说能够在一小时内编出这个游戏的人不会不知道考虑CPU效率的,除非你喜欢让CPU发烧。
    + A* f  I! g4 J) S- R3 i6 L: T) h9 x8 P8 E& T7 S) a

    该用户从未签到

    10
    发表于 2004-5-8 19:31:00 | 只看该作者
    timeSetEvent 这个winAPI来定时不是更好马,毫秒精度应该也可以了
    . P! |9 `( b/ E% n. ?7 O' B另外好像是用mfc还是什么的,mfc总是把我盟在雇里
    ' B9 r5 I" d. ~2 f% |" U) b4 w( |% b
    qztx 该用户已被删除
    11
    发表于 2005-6-6 18:09:00 | 只看该作者
    rpg吗?呵呵

    该用户从未签到

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

    本版积分规则

    关闭

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

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