« W:ETソースコード朗読会 ガイダンス | メイン | W:ETソースコード朗読会 第二回 »

April 15, 2005

■ W:ETソースコード朗読会 第一回

Reading the Source Code of W:ET #1

今回のねらい

ガイダンスの導入部により一応ソースコードを「見る」準備が出来ました。早速ソースコードを見ていきたいところですが、少しお待ちを。今回はプログラミングそのものに経験がない人向けに、プログラムを読む上で必要になる知識を紹介し、スムーズな理解の助けとなればと思います。ですからプログラミング経験のある方は今回の話はなかったことにしてください。

ご存知かの通りETはQuake3エンジンベースです。このため物理演算やデータの構造体など、Quake3でも用いられるアルゴリズムが散見されます。ですからETソースコード理解の為に、まずはQuake3での物理演算などの各種処理、そして用いられるデータ構造などの基本的理解をすることがとても大切になってきます。

注意して欲しいことに、専門家クラスにまで精通する必要はない、ということです。もちろん精通することでMOD作成の大きな助けになります。しかし、今回のようにただコードを読むだけなら関数や構造体が何を意味するものか、と漠然とした理解で十分です。 ですから気楽に構えてくださいね。

C言語

ここはプログラミング言語に「まったく」なじみのない方向けのセクションです。経験のある方はすっ飛ばしてください。

前回申したとおり、ETのソースコードはC言語です。プログラム言語としてはごく一般的ですが、日常会話でCを話す人はいません。C言語はコンパイラーに対してのみ意味のある言語だからです。そのため、初めてCを見る人にはCのソースコードを見ても、今まで見たことも聴いたこともない言葉で話しかけられるのと同じで理解できません。

そこで日本語とプログラミング言語の間を繋いでくれる辞書があります。リファレンスといわれるものです。幸いWeb上にリファレンスを載せているサイトがたくさんあります。ものによっては、丁寧な解説や例が載っています。

今一度申します。私たちは、「精通」する必要はありません。文を読んでなんとなく意味がわかればいいのです。ですから、リファレンス丸暗記の必要はなく、わからなくなった都度に参照すればいいのです。

とはいったものの、いきなりまったくの初心者が辞書だけで英文を読むことはなかなかに困難です。というのも、文には文法があるからです。これはプログラム言語でもまったく同じことです。単語単語の意味と、これらの並びや規則によって意味が決まります。

実例を前述のリファレンスを参照するなどして見てみることをお勧めします。ここなど、例と解説が丁寧になされているところはたくさんあります。自分にあったところを見つけて、ブックマークしておくといいと思います。

次回以降の本編に進むまでに、変数宣言、ポインター、構造体、数値演算、関数と戻り値などの基礎をなんとなーく理解してくれれば十分です。

数学 あると いいな

数学―。みなさんはどんな思い出があるでしょうか。学生の皆さんにとっては現在進行形で学習しているでしょうか。

このソースコード中で使われている数学的な要素で一番困ったちゃんと思われるのが、ベクトルです。しかもあっちこっちで出てきます。というのも、ETは言わずもがな、3Dです。ポリポリポリゴン満載です。3Dはご存知の通り、座標を表すためにxyzの3つが必要になります。この3つを一つのものとして表現したものがベクトルです。

ベクトルも普通の数字と同じように、足し算引き算、掛け算(内積外積)があります。実際にどんな計算をするのか忘れちゃった人は、昔の教科書を引っ張り出してくるかWebを検索してみてくださいね。

ベクトルにあって普通の数字にない要素に、方向があるということです。2つのベクトル演算の結果は、往々にして2ベクトルの方向の揃い具合によって大きく変わります。ETでもこの性質を利用して、ナイフでのバックスタブ判定、MGの射界制限に使われています。

ベクトル以外に、論理演算についても知っていると何かと有利です。論理演算とは、簡単に言えば0か1か、嘘か真かということを判定する計算だと思ってください。

そしてビット計算(二進数計算)もちょっと使われていますので、見慣れない計算が出てきたらこれも検索キーワードにしてみるといいかもしれません。

頻出構造体

私はCのコード理解はデータ構造の理解から始まるものと思っています。そこで、コード中で使われており、これだけは知っていて欲しい構造体について紹介します。

gentity_t これでもかというくらい、ソースコード各所に出現します。この宣言はg_local.hでされています。実際これはどんなデータかというと、ゲーム中で扱う様々なオブジェクト(英語でentity)全般です。オブジェクトの種類ごと、例えば武器・プレイヤー・弾・マップ中の物体などなどにそれぞれ分けて定義していたのでは面倒ですし、なにより拡張性と汎用性に問題が出てしまいます。そこで「もの」として広く定義され、様々なプロパティを設定できるようにされている構造体がgentity_tです。ソースコード中でこの宣言を見たら、何か意味のあるものなんだな、程度に考えてください。

vec3_t 数学のセクションで申しましたように、ETは3次元空間で位置や運動を計算しています。これらの扱いのためにはベクトルが便利です。このベクトルを構造体として定義しているのがvec3_tです。中身は単にfloatが3つです。それぞれ、xyzに対応しています。

qboolean 論理演算のためのものです。つまり真か偽かをそれぞれqtrueもしくはqfalseとして格納します。はっちゃけ0か1かです。

これ以外にもよく出てくる構造体はたくさんありますが、全て紹介するわけにはいきません。そこで、不明な構造体に出会ったら、是非定義箇所を検索してみてください。テキストエディターでソースコードを見ている場合でも、grepなどの検索ソフトを使えばコードファイル群から探し出すことが出来ます。

まとめ

理解の助けとなる知識の紹介だけしました。具体的なことは何ひとつしません。次回から実際のコードを見ていきます。

ここで紹介したことが、ソースコードを読んでいてわけのわらない部分に出くわした時、どうすればよいかの指針となれば幸いです。

投稿者 ikanatto : April 15, 2005 06:10 PM

■ コメント

投稿者 Colin : May 21, 2006 01:21 AM

投稿者 Michelle : May 29, 2006 05:51 AM

投稿者 Gina : May 29, 2006 06:00 AM

投稿者 Adam : May 29, 2006 06:06 AM

投稿者 Victor : May 30, 2006 07:42 AM

投稿者 Craig : May 30, 2006 07:48 AM

投稿者 Judy : May 30, 2006 07:50 AM

投稿者 Adrianna : May 30, 2006 07:54 AM

投稿者 Karl : May 31, 2006 05:20 AM

投稿者 Shelly : June 1, 2006 06:54 AM

投稿者 Jean : June 1, 2006 06:54 AM

投稿者 Dean : June 1, 2006 07:06 AM

投稿者 Britney : June 1, 2006 07:15 AM

投稿者 Scott : June 2, 2006 05:59 AM

投稿者 Frank : June 2, 2006 06:02 AM

投稿者 Jody : June 3, 2006 05:20 AM

投稿者 Jody : June 3, 2006 05:20 AM

投稿者 Judy : June 4, 2006 05:44 AM

投稿者 Laura : June 6, 2006 06:54 AM

投稿者 Laura : June 6, 2006 06:56 AM

投稿者 Bruce : June 6, 2006 07:00 AM

投稿者 Janet : June 7, 2006 06:41 AM

投稿者 Janice : June 7, 2006 06:44 AM

投稿者 Dawn : June 8, 2006 05:01 AM

投稿者 Jane : June 9, 2006 05:53 AM

投稿者 Bruce : June 10, 2006 06:09 AM

投稿者 Olga : June 10, 2006 06:17 AM

投稿者 Frank : June 13, 2006 05:06 AM

投稿者 Dennis : June 13, 2006 05:12 AM

投稿者 Sabrina : June 13, 2006 05:18 AM

投稿者 Rex : June 13, 2006 05:21 AM

投稿者 John : June 14, 2006 05:48 AM

投稿者 Greg : June 14, 2006 05:51 AM

投稿者 Emily : June 14, 2006 05:54 AM

投稿者 Frank : June 15, 2006 05:24 AM

投稿者 Timothy : June 15, 2006 05:29 AM

投稿者 John : June 16, 2006 05:32 AM

投稿者 Terry : June 16, 2006 05:35 AM

投稿者 Rex : June 17, 2006 05:45 AM

投稿者 Colin : June 17, 2006 05:47 AM

投稿者 Ruth : June 18, 2006 04:31 AM

投稿者 John : June 19, 2006 05:10 AM

投稿者 Sabrina : June 19, 2006 05:13 AM

投稿者 Wayne : June 19, 2006 05:17 AM

投稿者 Shawn : June 20, 2006 06:22 AM

投稿者 Matt : June 20, 2006 06:28 AM

投稿者 Ellen : June 20, 2006 06:32 AM

投稿者 Alan : June 20, 2006 06:46 AM

投稿者 Peggy : June 21, 2006 05:58 AM

投稿者 Gary : June 22, 2006 04:00 AM

投稿者 Julie : June 22, 2006 04:11 AM

投稿者 Dawn : June 23, 2006 11:10 AM

投稿者 Diana : June 23, 2006 11:18 AM

投稿者 Emily : June 23, 2006 11:26 AM

投稿者 Rex : June 23, 2006 11:38 AM

投稿者 Cassie : June 24, 2006 07:23 AM

投稿者 Ann : June 24, 2006 07:27 AM

投稿者 Simon : June 24, 2006 07:30 AM

Nice site!
http://pamela-