下沙论坛

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

QQ登录

QQ登录

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

最简单的游戏程序代码~

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

    [LV.1]初来乍到

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

    该用户从未签到

    2
    发表于 2004-4-8 20:54:00 | 只看该作者
    干什么的?走迷宫?7 j& m  S0 s3 x# S0 V
    5 m. ~1 n8 i7 ]% ~+ A. Z# L
    还有,代码中混杂英语和中文注译,我怀疑英文部分不是你原创

    该用户从未签到

    3
    发表于 2004-4-9 16:15:00 | 只看该作者
    楼主牛,我一小时只能读懂程序结构和实现方法。
    & C7 \/ \! _' m% P6 u. d不过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的发言:- y. W0 p1 W3 R. S# x6 I: Z8 l9 W1 _
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。
    - ~% I' V+ f2 N
    延时还有比Sleep(int)更好的吗?不浪费cpy啊,你用循环来拖延真是大胆创新啊

    该用户从未签到

    7
    发表于 2004-4-11 15:59:00 | 只看该作者
    循环延时有是有的,不过会造成不同配置上的延时的不一致- c9 k& K$ j$ X. z. t+ S& U! |
    ( X" s! k) D$ e3 K9 `6 _6 l
    再问一次,这个游戏到底是游的什么???
    男人 该用户已被删除
    8
    发表于 2004-4-12 16:21:00 | 只看该作者
    是什么游戏啊

    该用户从未签到

    9
    发表于 2004-4-12 16:58:00 | 只看该作者
    以下是引用hays2002在2004-4-10 15:23:06的发言:* m8 h4 O9 G/ s5 Z; G; `" Z
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。

    $ U% o, Y! b$ D: ~void Delay(long time)   确实可以用来延时,而且延时也比较准,但是Delay()是用CPU满负荷运行换来的。
    5 j. x& E; H6 V) h' J! N( T$ r在你的程序中把Delay(long time) 换成  Sleep(long time) ,然后看看CPU的负荷就知道了。
    3 C) x, F: D# J- l! E按理说能够在一小时内编出这个游戏的人不会不知道考虑CPU效率的,除非你喜欢让CPU发烧。. w& X. b% ]( P5 [

    # \3 S& l! n  r0 Q) B* A* ~5 E

    该用户从未签到

    10
    发表于 2004-5-8 19:31:00 | 只看该作者
    timeSetEvent 这个winAPI来定时不是更好马,毫秒精度应该也可以了+ x5 L; [. }- ?5 M3 H; C! K1 V5 \
    另外好像是用mfc还是什么的,mfc总是把我盟在雇里, W* L% c6 w! t( M, s% x" \
    qztx 该用户已被删除
    11
    发表于 2005-6-6 18:09:00 | 只看该作者
    rpg吗?呵呵

    该用户从未签到

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

    本版积分规则

    关闭

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

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