下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

最简单的游戏程序代码~

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

    [LV.1]初来乍到

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

    该用户从未签到

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

    该用户从未签到

    10
    发表于 2004-5-8 19:31:00 | 只看该作者
    timeSetEvent 这个winAPI来定时不是更好马,毫秒精度应该也可以了
      S- D9 l' M& N2 l' G7 Q/ V另外好像是用mfc还是什么的,mfc总是把我盟在雇里( f( ?" v; y- t9 S

    该用户从未签到

    9
    发表于 2004-4-12 16:58:00 | 只看该作者
    以下是引用hays2002在2004-4-10 15:23:06的发言:6 c  V+ b: \3 i" U  @
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。
    ! p  G* e) m! n$ H- f
    void Delay(long time)   确实可以用来延时,而且延时也比较准,但是Delay()是用CPU满负荷运行换来的。* X0 n/ x7 Z, f
    在你的程序中把Delay(long time) 换成  Sleep(long time) ,然后看看CPU的负荷就知道了。
    : ]9 g$ V' u  ?1 ~3 X; D按理说能够在一小时内编出这个游戏的人不会不知道考虑CPU效率的,除非你喜欢让CPU发烧。
    " N, K# d5 [8 E! W7 U. b$ M, Y; p
    1 U4 j& a+ y: Y3 W* W9 @
    男人 该用户已被删除
    8
    发表于 2004-4-12 16:21:00 | 只看该作者
    是什么游戏啊

    该用户从未签到

    7
    发表于 2004-4-11 15:59:00 | 只看该作者
    循环延时有是有的,不过会造成不同配置上的延时的不一致
    & P; K7 I( y) P8 A# |, E1 i* m% U7 i/ G
    再问一次,这个游戏到底是游的什么???
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    6
    发表于 2004-4-10 21:36:00 | 只看该作者
    以下是引用hays2002在2004-4-10 15:23:06的发言:: A7 k0 }/ ^; N9 q
    绝对原创。。。。。。void Delay(long time)   函数的功能就是用来延时的。。。。。。

    $ s7 R: U& s( D2 g. K延时还有比Sleep(int)更好的吗?不浪费cpy啊,你用循环来拖延真是大胆创新啊
  • 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]初来乍到

    4
    发表于 2004-4-9 19:35:00 | 只看该作者
    不是吧,这样的程序都叫"最"简单了啊,我看来都是在写白痴程序了

    该用户从未签到

    3
    发表于 2004-4-9 16:15:00 | 只看该作者
    楼主牛,我一小时只能读懂程序结构和实现方法。
    . b+ ?. o& I1 g+ r不过void Delay(long time) 函数有问题,把CPU时间都白白吃光了,应该改成Sleep()

    该用户从未签到

    2
    发表于 2004-4-8 20:54:00 | 只看该作者
    干什么的?走迷宫?
    + p# [1 _% e, T1 c  g: O8 C6 r# {
    还有,代码中混杂英语和中文注译,我怀疑英文部分不是你原创
    关闭

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

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