|
|
如果你会一点C、C++语言,你就可以学习游戏编程了,开发真正的游戏!如果你学过一点C++更好,没学过也没关系。本课程教你从零基础开始开发7个完整的游戏:Brainiac、Light Cycles、Henway、Battle Office、Meteor Defense、Space Out、Stunt Jumper。教程无KEY wmv版本,手机平板等移动设备均可观看!
. g9 f% E- ]4 M( H【课程目录】
' P8 u, F2 e5 S0 ^3 I! {) _第1部分 入门 # T/ ]1 Y3 ]6 U7 T1 m6 S
第1章 学习开发游戏的基础知识 # e% Y! y- v) K9 X. c8 {+ y/ h$ A
1.1 认识视频游戏
; C8 A- Y! Q( p5 ^% Q s 1.1.1 为什么人们如此沉迷于开发视频游戏 2 j% [7 E7 I( s0 z. }
1.1.2 视频游戏的类型
9 l- Y- x; X6 `4 L5 c/ o6 a8 J1.2 学习游戏设计的要素 . w% }* F3 Q- d2 g
1.2.1 提出基本思想 ! r6 I3 V& O! e0 D5 J+ V
1.2.2 整理剧情
) X" f4 r- h0 y+ W4 |+ `, H 1.2.3 可视化图形 . @/ L2 w: q. r' g0 p/ M, C+ p
1.2.4 为游戏选择正确的声音
$ Z& V* ?0 m/ q% y! _) r: C 1.2.5 使用控制器控制游戏
5 Z8 l, s* N9 k( m 1.2.6 确定游戏模式
; n4 G, _* R8 y/ R! ]) e8 s1.3 面向对象的编程和游戏
& Q! f- d- b6 E* c6 e 1.3.1 理解OOP
0 p1 C3 c9 F6 l) t3 _% H 1.3.2 在游戏中应用OOP
( _" ?7 f1 R$ j; V% C6 h1.4 研究相关工具
" a% r; ~ c. m- b) @ 1.4.1 编译器和开发环境
& Z5 N+ w- {2 b 1.4.2 选择图形工具 3 R: K7 i3 G# q2 F/ y$ ?. Z
1.4.3 选择声音和音乐工具
! F7 g, k5 u+ _2 V8 h' Y2 B& O$ w u1.5 小结 3 w2 l g! ]# r1 i
1.6 亲身实践
2 a8 q; p6 N1 _, t3 J第2章 创建游戏引擎
( D, J) X6 N& @, B2.1 什么是游戏引擎
$ g3 l7 w0 T6 N( Q3 q" N" H2.2 考虑游戏引擎的作用 : p" Z7 ~. G) H) k
2.2.1 将游戏分解为事件 0 A/ s! A6 [- g0 d ^7 j
2.2.2 建立游戏的计时机制 + m+ a. }5 `2 F$ B2 q) U% U& u. e
2.3 开发游戏引擎 % c8 \4 Q2 t% O7 \4 d3 x. E& y6 i) ~
2.3.1 游戏事件函数 / s" _' `' @1 \
2.3.2 GameEngine类
$ B2 g+ U8 b `/ R5 I2.4 开发Blizzard示例 6 F( c- ^% H* A. Y$ A& D
2.4.1 编写程序代码 8 h6 X" N: [+ v& d; m6 r
2.4.2 测试完成的程序
% V9 N- o6 p6 y/ f6 F7 ?2.5 小结 % t# i7 @ Y9 Y/ t1 b0 H3 u
2.6 游戏大变身
5 S! z1 B8 `# t7 g4 F+ i第3章 学习绘制基本图形 ( p8 N, a5 j& ?+ U
3.1 图形基础 + Y: U; t6 r+ }( {
3.1.1 理解图形坐标系统
. N: `# S9 @+ J8 j& j7 A 3.1.2 学习颜色的基础知识 ; m/ f9 {/ O( B# W6 y3 j1 P9 v7 |
3.2 查看Windows中的图形 0 s1 H! J0 x$ Y g- `7 M
3.2.1 使用设备环境 ! a3 ] N+ i' ?$ D7 }
3.2.2 使用画笔写
6 q; L7 p/ B) t 3.2.3 使用画刷绘制 + b6 ^4 \1 \. Q% U, }) n8 l
3.2.4 使用位图绘制图像 9 y: J: T" B* j6 ]( S2 c' H( |
3.2.5 使用调色板管理颜色 3 N% j7 ^2 m9 j; e6 l
3.3 绘制窗口 : x, [( H7 Y; x# P
3.3.1 绘制文本 - B) D9 c; b8 M6 o# e
3.3.2 绘制图元
" K/ `8 l: R. j" I8 y" T4 d4 s 3.3.3 使用画笔和画刷 0 T: |1 a4 T! U8 ~* O
3.4 开发Crop Circles示例
" z0 s. L6 G0 r2 F4 ]2 g6 U 3.4.1 编写程序代码 # H" p" v( C# p4 @
3.4.2 测试完成的程序
. ` ~/ x, N6 T3.5 小结
. @& Q; [! d% G+ n) k6 W3.6 亲身实践 " Q* o1 ~1 b/ y& g
第4章 绘制图形图像
j9 z& d) ~9 C _) H* E4.1 位图图像的基础知识
: _9 f7 A [, [( @: j8 o$ M4.2 深入学习位图
7 [' q1 P. [3 U. D" t5 @8 N; G! w4.3 开发位图类
* y$ r- A4 C1 V& h8 { 4.3.1 位图类的工作原理
8 p0 B C/ h7 r2 I+ R0 l) X b# C9 _ 4.3.2 整合代码
! D2 u. z. q$ J5 X2 \. I2 u" _4.4 开发Slideshow示例
8 n" _( y( d. w- |9 v 4.4.1 编写程序代码 5 [- k# k" V% C0 N$ ~1 ]
4.4.2 汇集资源
* {/ i2 R+ o1 g 4.4.3 测试完成的程序 ' c! j0 i7 K) }
4.5 小结
! I& r: W$ \- {# x4.6 游戏大变身
, g2 s% y% _+ y: Q第2部分 与游戏玩家交互 $ z8 e: y( P- ?; W
第5章 使用键盘和鼠标控制游戏
" u7 h8 c1 X, i" Y, a5.1 游戏与用户输入
9 E9 [ f. ^- s. \4 `2 y- d0 I7 v5.2 了解用户输入设备 7 p7 I; ]; q. B( \6 M0 w' Q
5.2.1 接受键盘输入 ( U7 ^) O$ z# F- M) E% G
5.2.2 响应鼠标
/ t# ]1 ]' ?0 T* A0 _& W 5.2.3 使用游戏杆交互
! j: g( _ B; a4 r6 X3 v7 V8 A5.3 评估游戏的键盘输入
1 L5 D: e1 ~! s7 L8 ~" x) w5.4 跟踪鼠标 9 I+ ?# K* o$ b( p- {1 T8 D _) _
5.5 向游戏引擎添加输入支持 8 L, ?! q. _7 T
5.5.1 添加键盘支持 : {/ _# j5 T: d* _7 i
5.5.2 添加鼠标支持
$ h& D3 G: _0 ~7 V ^3 L7 \ 5.5.3 修改Bitmap类
w& G6 U' z; N" I, B8 e3 T5.6 开发UFO示例 " u! s( d5 M" o; G* ~6 O# D0 T
5.6.1 编写程序代码
# }* J1 V- A. s; y- L' }6 X0 K; v 5.6.2 测试完成的程序
% g$ C, D$ L$ X0 B5.7 小结 8 M$ r+ i3 d3 ^# T o4 a9 e
5.8 亲身实践 4 h; o6 G) \/ v9 [/ R
第6章 示例游戏:Brainiac . q) x( F* D# x. v
6.1 游戏的玩法
+ N' G6 U; ~% {( u% O% C0 ]8 O3 ?6.2 设计游戏 : _/ P {8 G* K$ l" Z6 O+ a
6.3 开发游戏 / i8 j) D7 \0 ?, U6 C, A" U2 ?4 N
6.4 测试游戏
+ M& ~4 Q! {5 X6.5 小结 4 T$ G2 U& P$ W9 s, t% w- _0 M
6.6 游戏大变身 + j C) A: b8 b& {, Y4 D- M
第7章 使用游戏杆改进输入
8 s4 F% O0 I0 T! t" a6 U' ~1 k7.1 了解游戏杆的基础知识 $ Q( W3 p2 m# H; e
7.2 校准游戏杆
$ [9 T4 m2 h! k( E, a7.3 追踪游戏杆的移动
: \- t- \* l, E8 G, j7.4 向游戏引擎添加游戏杆支持 3 E) Z7 Q3 p& b- _: X8 V9 |* w0 j
7.4.1 访问Win32多媒体功能
- \. F5 y) v/ T0 j) y' r2 A 7.4.2 开发游戏杆代码
. U5 f, J% `0 W( s' _& L! P7.5 开发UFO 2示例
% l( }/ u9 s3 r" I& w% p 7.5.1 编写程序代码
6 d% N) `2 _2 ?! n: z 7.5.2 测试完成的程序 3 r6 x' t: l* l Z, G
7.6 小结
# X4 s6 C9 `7 D2 \, L- y( Z7.7 亲身实践 ; t' m$ u3 f0 m) y" C
第8章 示例游戏:Light Cycles
/ H! ^. ?4 D! {+ ?/ {' q6 f: q1 u8.1 游戏的玩法
8 x' B; x% R2 x8.2 设计游戏
6 K9 e, k4 C3 l! J8.3 开发游戏
( E* c* a% c; v0 I8.4 测试游戏 / X# A. x$ Y3 R8 ]% A/ Z0 }
8.5 小结 : d; _* A, v9 O' X
8.6 游戏大变身 ) v7 {% _8 N- n
第3部分 在游戏中使用子画面
# {8 f1 ^" U$ _/ \) ~3 i- N; E第9章 使用于画面动画移动对象 & O7 G$ X: l. x! v+ w3 F: W
9.1 理解动画的基础知识 6 k5 O7 C4 K7 O0 N* F0 _5 I" t
9.1.1 动画和帧频
( p7 s- u$ R! r# H" A 9.1.2 了解计算机动画 ) f4 ^) E* ~- ?
9.2 2D动画与3D动画
: k' I$ w- d# G9.3 理解2D动画的类型
/ Q7 j$ | k5 u7 i: q0 A# [ 9.3.1 基于帧的动画
" N5 w D1 b. A \0 V 9.3.2 基于形状的动画
& W8 x8 S$ M6 u9.4 将子画面动画应用于游戏 p/ ?! y1 N9 e9 |7 z" H: a
9.5 设计通用的子画面
. Y1 |( x6 W$ l9.6 创建Sprite类 # s, z" p' V$ l( j- K& Z
9.6.1 创建和破坏子画面 & [; l' u, @) i% _5 s
9.6.2 更新子画面
$ D! a3 T/ c( X$ p9 |) e% D 9.6.3 绘制子画面 4 ?; A3 {, d+ B- ^
9.7 开发Planets示例程序
( A+ @& u2 M1 }: p( k+ B: s+ D w 9.7.1 编写程序代码
3 l+ x( x2 p. S% f# O: I0 Q 9.7.2 测试完成的程序 9 ?1 u6 `) B. k3 p/ ]9 g2 z
9.8 小结
- r5 V+ K* H" Y$ y8 W# g9.9 亲身实践 {" [9 D! {! }5 y# d3 ^& R x% r/ t
第10章 管理子画面
8 R# |! O E/ ~! h10.1 了解管理子画面的需求
4 j( ]: X/ R& N. C. \2 Q e6 C10.2 设计子画面管理器 0 b0 c1 q( D! C, V
10.3 向游戏引擎添加子画面管理器 + l8 o% J6 m6 O* ?
10.3.1 改进Sprite类 ( d) m$ S) m* T N4 E
10.3.2 增强游戏引擎
- {; k/ ]9 t2 d5 h5 l+ L10.4 使用双重缓存消除闪烁
7 ]" ` f* ?- D* ^4 H1 [+ q9 F10.5 开发Planets 2示例 ' l0 }5 c' n7 v) [9 s
10.5.1 编写程序代码
8 S/ h$ `7 M4 w3 t1 o; Y 10.5.2 测试完成的程序 * B: N, m' s" k. I
10.6 小结
2 ]0 I( E8 b! v9 R10.7 游戏大变身
0 i! @9 I+ @8 N& V2 p第11章 示例游戏:Henway
/ r- \7 H& K2 Z$ P11.1 游戏的玩法 4 L L' h! R' N4 V( F/ x
11.2 设计游戏
: S* W2 N; U2 h( r: }, U$ N7 ]1 N11.3 开发游戏 " p7 E% Z J+ g1 @& I# S
11.4 测试游戏
" }* s( ~0 F, D/ x11.5 小结 1 ?# Q1 x5 ?( }# r
11.6 游戏大变身 9 L5 S' o9 T* ^9 I
第4部分 使用声音和音乐
' `6 ^: j7 g* H2 D第12章 播放数字声音效果 ( x: c4 v# i4 h4 Y" ^6 C
12.1 理解数字声音 / \! l) i& @' U. ^
12.2 了解Windows波形声音 4 F# z% g* r5 n. X
12.3 了解声音工具
& `/ y7 F% e0 ~& o) i* E% U 12.3.1 Sony Sound Forge * ]( u5 F7 h2 ~$ |% K' e
12.3.2 Adobe Audition
" i$ g F1 c' }( _ 12.3.3 廉价的声音编辑器 5 R" w3 _) V( ~
12.4 创建和编辑声音
2 Q. u; j! M0 N12.5 查找声音和音乐
4 o- S* ?5 G, \12.6 访问波形声音
/ _5 A& p/ Y) g6 N$ P12.7 播放波形声音 " J+ k8 ~: A0 C+ K9 G
12.7.1 播放文件中的波形声音
( D' @ b: o7 j. y 12.7.2 播放作为资源的波形声音
1 h9 H% a1 {$ E1 } 12.7.3 循环播放波形声音
. ?" |: }8 B) N+ g; ] 12.7.4 停止播放波形声音 . e, q* w" O9 {9 a2 V- v
12.8 开发Brainiac 2示例程序 $ K6 C' k/ Y6 S d, q2 T+ r! `
12.8.1 编写程序代码
* W; e2 g0 P& T 12.8.2 组合资源 " B8 G" R1 k( _. F' I" S3 k
12.8.3 测试完成的游戏 3 G" U' |6 b7 f% S/ @ x$ |/ H
12.9 小结 2 u3 \2 M) k0 {. F6 d& u
12.10 亲身实践
) t$ r3 G4 ]" z. p' A第13章 播放MIDI音乐 ' n6 Q& e P3 T: d
13.1 感受MIDI音乐 & Z" G0 I! c# M. A( y" w" }
13.2 理解Windows媒体控制接口
9 W$ F: k! R) S13.3 使用MCI播放MIDI音乐
, `8 {% V1 S. s8 ] b' c7 V. v1 I 13.3.1 打开MIDI设备 6 Y8 \& |$ d& |4 D0 s! l% @0 K
13.3.2 播放MIDI歌曲 . w- Y& Q2 K+ q+ x& S$ e
13.3.3 暂停MIDI歌曲 . [* k$ A8 A5 P
13.3.4 关闭MIDI设备 C0 g1 u7 M2 K7 z& E( K. x9 d
13.4 向游戏引擎添加MIDI音乐支持 # T( D9 ?5 `/ p5 ?2 t
13.5 开发Henway 2示例程序
" k: e5 V0 V& L* z; b- N( f 13.5.1 编写程序代码
$ |/ B# y( G+ a5 b9 @ 13.5.2 测试完成的游戏 $ ~; E6 a% w0 W0 V, X- o
13.6 小结
$ `* y0 U/ @0 R, u6 u9 N3 [* ^! }13.7 亲身实践 ( V# X: f; ]- V1 P: O: u' O9 D
第14章 示例游戏:Battle Office ' ` W8 |9 W9 M& H" R) K
14.1 游戏的玩法 - E4 {: G7 u" C# X0 {2 f
14.2 设计游戏 . L! f0 ^3 c6 P* y0 D8 U+ ^
14.3 开发游戏 - E. m) o+ F. T2 k: E9 w
14.4 测试游戏
& g9 k5 z* l2 p* ^14.5 小结 * K- P% l9 y, F e
14.6 亲身实践 & T6 B- R. s2 |5 G0 o% M
第5部分 高级动画
7 g' U3 H& q! f6 O( v. Q7 M1 U; y第15章 实现子画面外观动画 / V1 L7 X% F9 O: n" c& i1 H
15.1 再次介绍帧动画
Q' P& {# E6 M; q2 k/ e1 b15.2 设计动画子画面
G0 T$ V5 k3 m, b3 `1 a15.3 向游戏引擎添加动画子画面支持 7 O @ _2 D" }7 {
15.3.1 只绘制位图的一部分 - ~6 y j* I# @- ^9 X
15.3.2 对Sprite类实现动画
H' y! y) c) D15.4 开发Battle Office 2示例程序 . K- |, K7 _( f5 k
15.4.1 编写程序代码
; r8 `8 c2 q" m; ~ 15.4.2 测试完成的游戏
! t) D. I8 A9 |! |15.5 小结
9 y& ?# T) U( Q% q4 n% t15.6 游戏大变身 " F# e& p$ H6 H! S O2 G, J
第16章 创建子画面背景
4 V" E% p. _/ f& \# L" X# [( f16.1 了解游戏背景的重要性 " {. b! X6 B$ H" E0 q" k! o
16.2 了解游戏背景的类型 5 `: s5 R( h* Z/ l
16.2.1 纯色背景
% t7 r4 d: Q8 {) I 16.2.2 图像背景 R! |" Q( h: s2 Q1 ^
16.2.3 动画背景
- u2 b' z" X' w- J2 ` 16.2.4 滚动背景 ) ~2 I' T2 v/ Z/ k
16.3 向游戏引擎添加背景支持 8 A3 v/ l5 @; A6 a$ U
16.3.1 创建基本的背景类
8 n) o7 r$ u- H2 z 16.3.2 创建动画背景类 # R* v0 A0 [. Z7 {
16.4 开发Roids示例
* M; o! w2 B; {! l$ W) B" r+ N 16.4.1 编写程序代码
6 d/ C" E5 J. e/ b9 G- c 16.4.2 测试完成的游戏
8 {% M' e8 @$ g; j16.5 小结
0 @- o2 h0 o6 t16.6 亲身实践
/ X- L* x3 ]/ L/ h/ E- `第17章 示例游戏:Meteor Defense ) r7 B: `! h* O
17.1 游戏的玩法 ; h- L, S P( R( r9 D, k5 v9 v
17.2 设计游戏 % B: c2 G9 A. a+ `7 {4 ^! Z
17.3 增强游戏引擎中的子画面 . U X8 k5 \) a. G& j( R. {+ y/ W. n' n
17.4 开发游戏 # ~, G$ M; m3 F
17.5 测试游戏
( S5 ^1 ~" T' t9 X* w17.6 小结
( f; |1 t3 p! u) D0 p0 o, F2 c" h V17.7 游戏大变身 w- ~- u w1 t! T8 v& Q
第6部分 让游戏拥有大脑 " b+ G9 `( E4 f# b3 C2 E7 z
第18章 教游戏思考
4 H4 g0 U' o8 T: z18.1 理解人工智能
- Q1 ]- A3 t- `- h! B! D% e# } L6 ^18.2 了解游戏AI的类型 1 k7 d( m' O5 i- V0 i. A
18.2.1 漫游AI 6 v4 I" ^" X; {/ P' s4 Y% u, e {3 Y
18.2.2 行为AI
5 v6 ^; U+ o& `$ h7 y 18.2.3 策略AI
+ h( D$ `8 A2 I; S18.3 开发AI策略
4 a$ h% A% \3 F6 ?# ?0 w) t& K1 R18.4 开发Roids 2示例程序
4 S0 f1 o- x2 Z/ j 18.4.1 编写程序代码 7 ?- o; y6 t+ x* a
18.4.2 测试完成的程序 8 i6 G* Q/ Q. V( M- O! I7 g p
18.5 小结 z4 U0 V9 M1 u" `& e# g; m) S' x
18.6 亲身实践
9 ^. a. x$ s: k9 ]5 a7 t8 s% B第19章 示例游戏:Space Out
* M# V+ ~9 }+ ^( Z19.1 游戏的玩法
. a, i$ w _& X6 m9 a19.2 设计游戏
) }4 i9 n$ W2 m! R2 V5 x( o6 P2 q5 j19.3 向游戏引擎中添加另一个子画面特性
0 P& V! P/ z3 T! |1 B! v1 s9 ^1 Y* W19.4 开发游戏
( R9 i9 k0 n, h0 L1 S4 }19.5 测试游戏 # E3 S: @& b, E
19.6 小结 K) r! Z- R" L+ N. U
第7部分 增添游戏的趣味性
3 E" v5 Q( B4 D4 u8 D# ]第20章 使用闪屏增添游戏的活力
! E, r8 Q: ~6 O" h20.1 闪屏的重要性 : H. @/ x5 [2 m* o0 d3 h& `3 e4 w3 Y
20.2 了解闪屏
9 s/ ` x! `1 u3 i b( o- |20.3 创建Space Out 2游戏
. `/ B2 R! G& |, b" s 20.3.1 编写游戏代码
4 q d- \+ C5 N6 u% E- P8 d5 Q 20.3.2 测试完成的游戏
6 ~8 ~! `5 E/ M U+ Z20.4 小结
% _( x Q2 T" _* K20.5 亲身实践 C0 ]9 x8 r2 N
第21章 使用演示模式展示游戏
; B0 Z( E( z! G `" k# {, _- j21.1 什么是演示模式
; t% E. W' X; D0 a- F4 X21.2 演示模式的细节
& {: ^$ S$ b0 }- Z! Y. P, j21.3 开发Space Out 3游戏
+ h) n6 ]8 z7 V4 o: Q 21.3.1 编写游戏代码 " P/ z, \2 g1 z0 U; P6 J! e
21.3.2 测试完成的游戏
: B: ^0 t% R) _0 V. o21.4 小结
, B8 g P( v( C3 i( W21.5 游戏大变身
" V( f9 k' W; Q! v" g: ?第22章 记录高分 * k$ Q5 [" f3 j/ ], _
22.1 记录得分的重要性 & x# g5 [% M% [" N) E) L; |
22.2 确定高分数据模型
& w. V' p, Z/ i+ B3 B22.3 存储和检索高分数据 1 x! n7 r1 b" j
22.4 开发Space Out 4游戏 9 x6 W! k: a2 g% a8 N0 }
22.4.1 编写游戏代码
6 c: ^" D# D+ e' q/ i& w, g/ D 22.4.2 测试完成的游戏 ! F: S! ?/ D- F
22.5 小结
* L6 `" A/ z0 H* I1 X: I" p6 A22.6 亲身实践 9 N$ `" M% } e ]$ _
第8部分 附加练习
4 t' E- T! r8 i( v7 G1 X第23章 使用滚动背景更改远景
+ ^4 W) u' h- a1 S23.1 什么是滚动背景
+ w, Z4 O" c! }2 h% Y- X3 s 23.1.1 横向滚动的背景 # ?+ {4 R; J: x& r, {" D
23.1.2 纵向滚动的背景
2 E7 D% n& u. _4 Q 23.1.3 视差滚动背景
1 [* L& b8 F' a; [1 m- e9 @: U23.2 理解滚动背景的工作原理 % |( Z i" V, C5 e4 t- q
23.3 向游戏引擎添加滚动背景支持 4 P2 R1 _2 \( d$ O+ M* ^1 b0 e5 x
23.3.1 创建背景图层类
! c V1 c% Y8 l) U 23.3.2 创建滚动背景类
! ~) D- Q& W, J23.4 开发Wanderer示例
% U4 m; ^2 H; n 23.4.1 编写程序代码 % o) N0 E, I8 h2 d6 z: t' I
23.4.2 测试完成的程序
. U- y9 s6 q0 [# c) i/ Y* `3 C23.5 小结
, `- r; m- R( i. O7 T: H5 p2 G23.6 游戏人变身 - e8 y3 A M% {5 k' h/ J8 N. F$ C
第24章 示例游戏:Stunt Jumper
2 @& O& m F+ Z% X24.1 游戏的玩法
8 E0 \9 e6 F+ W, i24.2 设计游戏
?' ^/ U& ~' u8 N I }24.3 开发游戏
% v& j$ {# X+ y9 a$ q6 d6 l24.4 测试游戏 4 }- |0 @, T/ c1 n- G: a
24.5 小结
$ W+ ]/ K% \* ^" Y- f! i24.6 游戏大变身 ; B% w7 k+ b8 N! C+ }$ [- s0 z& {
24.7 亲身实践 . C" a$ f' Q, X( k
5 z9 \9 p6 C' s' w5 H! e. s4 C, y) t
【下载地址】
. A3 p/ z* B0 ?/ ]
5 i. g9 M' G& r$ n( V; P; k: @2 O# p1 J$ r
|
|