下沙论坛

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

QQ登录

QQ登录

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

最简单的游戏程序代码~

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

    [LV.1]初来乍到

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

    该用户从未签到

    2
    发表于 2004-4-8 20:54:00 | 只看该作者
    干什么的?走迷宫?
      T3 N/ k  O5 ?' h& x+ U0 L" P$ f' @8 w5 x% v8 `/ l1 m- @
    还有,代码中混杂英语和中文注译,我怀疑英文部分不是你原创

    该用户从未签到

    3
    发表于 2004-4-9 16:15:00 | 只看该作者
    楼主牛,我一小时只能读懂程序结构和实现方法。
    3 w3 S" G! G0 C7 g9 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的发言:1 H. D, T' b2 I- b+ N, A; c
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。
    & E& H& ~4 @' t- ^3 _- u  C) H& z
    延时还有比Sleep(int)更好的吗?不浪费cpy啊,你用循环来拖延真是大胆创新啊

    该用户从未签到

    7
    发表于 2004-4-11 15:59:00 | 只看该作者
    循环延时有是有的,不过会造成不同配置上的延时的不一致3 m$ N6 p4 L2 z+ J& h  W7 v6 l
    0 d/ O- \3 P' x/ N& u# e1 h
    再问一次,这个游戏到底是游的什么???
    男人 该用户已被删除
    8
    发表于 2004-4-12 16:21:00 | 只看该作者
    是什么游戏啊

    该用户从未签到

    9
    发表于 2004-4-12 16:58:00 | 只看该作者
    以下是引用hays2002在2004-4-10 15:23:06的发言:* E' N/ O4 M( N# k, {0 y
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。

    5 \; G+ W- o4 n7 L+ {, evoid Delay(long time)   确实可以用来延时,而且延时也比较准,但是Delay()是用CPU满负荷运行换来的。
    ( A5 D: |6 ?' q; r+ E- {' ]在你的程序中把Delay(long time) 换成  Sleep(long time) ,然后看看CPU的负荷就知道了。, {) A6 j+ s( j( E
    按理说能够在一小时内编出这个游戏的人不会不知道考虑CPU效率的,除非你喜欢让CPU发烧。
      U4 B/ J( B# g: T4 ?& o3 V% z
    5 a6 R' ]! S, F2 C0 G% i, W

    该用户从未签到

    10
    发表于 2004-5-8 19:31:00 | 只看该作者
    timeSetEvent 这个winAPI来定时不是更好马,毫秒精度应该也可以了/ Z5 @  s9 `2 ]# v& Z; M
    另外好像是用mfc还是什么的,mfc总是把我盟在雇里' y# _2 x' P1 n. s$ R! s
    qztx 该用户已被删除
    11
    发表于 2005-6-6 18:09:00 | 只看该作者
    rpg吗?呵呵

    该用户从未签到

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

    本版积分规则

    关闭

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

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