164
98

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Siv3DAdvent Calendar 2018

Day 5

とあるゲームプログラミング初心者が C++ でゲームを作ろうとして未完成の話

Last updated at Posted at 2018-12-05

はじめに

はむくんと申します。普段はSiv3Dを用いて簡単なアプリケーションの開発をしています。今回のテーマは技術的な内容ではなく、ゲームプログラミング初心者としてSiv3Dに出会った経緯や経験について、思い出を振り返りながら書きます。

中学生時代

中学2年生のとき、ゲームを作りたいと思い、プログラミングの勉強を始めました。どんなゲームを作りたかったのかは覚えていません。

選んだプログラミング言語はC++でした。C++を選んだ理由は、ゲームプログラミングでC++が主流だと、何らかの本やインターネットで読んで、それがかっこいいと感じたからです。次に、以下の本を読み始めました。

やさしいC++ 第4版 (「やさしい」シリーズ)
高橋 麻奈 (著)

中学生の時にちょうど、数万円する高価なVisual Studioが学生向けに大幅に安く販売されたので、それを購入してC++の勉強を始めました。しかし、表示する文字列や、電卓のような計算、または謎の数字を列挙するようなトレーニングばかりでした。自分が想像していた「ゲームプログラミング」の内容とは全く異なり、次第に興味が失せていきました。

特に、「住所録」のようなプログラムを作る段階で、「本当はゲームを作りたいのに、なぜ住所録を作っているんだ?」と思い、プログラミングに対する関心が薄れてしまいました。今でもその本が書店に並んでいると、当時の失望感を思い出します。

高校生時代

AppliMakers との出会い

当時、Docomoの携帯用iアプリでゲームプログラミングができる「AppliMakers(作者:JUN氏)」というゲームを発見しました。このツールでは、1から999行までのソースコードを書いて動かすことができました。変数には約10個までの制限があったようです。

このアプリの特筆すべき点は、作成したソースコードをインターネットでシェアでき、他人のゲームもダウンロードできることでした。私は他人のソースコードを参考にしながら、多くのゲームを制作しました。

私もこのアプリを使っていくつかの作品を公開しました。最初に作ったのはお絵かきツールで、次に縄跳びゲーム、最後には対戦型のシューティングゲームを作成しました。現在はどれも残っていません。

image.png

(AppliMakersの画面)

Squeak との出会い

僕は高校1年生のとき、特定の教育プログラムに参加し、プログラミングを学びました。このプログラムは、夏休みの1週間を大阪のNTT宿舎で合宿形式で行われました。使用されたプログラミング言語はSqueakというSmalltalk環境でした。これは有名なScratchの前身です。

image.png
Wikipedia Squeak

絵を描くと、その絵はオブジェクトになります。このオブジェクトに対して、ブロック上のスクリプトを配置すると、描いた画像が動き出します。まるで魔法のようです。AppliMakersでの経験が役立ち、プログラミング部にすんなり入れました。

最初に作った練習作品は、ゴキブリが動くプログラムです。ゴキブリは自分が描いた軌跡に沿って、進行方向に回転しながら高速で動きます。次に作成した作品は、バスケットボールの初速度と角度を設定してゴールを狙うゲームです。これは、以前好きだったポトリス2からの影響を受けています。

最後に完成したグループ作品は、トランポリンが縮むのを制御して棒人間をできる限り長生きさせるアプリです。トランポリンから外れると、棒人間の関節と頭がバラバラになり、『パイレーツ・オブ・カリビアン/デッドマンズ・チェスト』のBGM「hoist the colours」の「never shall we die」が流れます。同じグループのW君は、初音ミクが有名になる前に咲音メイコを持っていたことを覚えています。

(ゴキブリアプリの再現図) (バスケプログラムの再現図) (トランポリンゲームの再現図)

僕はその合宿での一連の作品に満足しました。それ以降、Squeakには手を触れていません。もう触りたいとも思わないです。Squeakの明らかな「子供向け」感が気に入らず、より成熟したプログラミング環境、つまりソースコードだけで成果を出す環境に憧れました。僕は「子供向け」に設計されたものが苦手です。そのため、今でもScratchには興味が持てませんし、子供に推薦するつもりもありません(ただし、Scratchでプログラミングを始めることを否定しているわけではありません)。

ちなみに、進研ゼミには「コラショ」というキャラクターがいたのをご存知ですか?小学1年生から3年生を対象とした猿のようなキャラクターで、私は当時、そのキャラクターが大嫌いでした。コラショの言動やデザインが明らかに「子供向け」であり、その意図が透けて見えることが許せませんでした。コラショのイラストには鉛筆で穴を開けるほど嫌っていました。子供たちも「子供向け」のものを嫌う場合があるんです。

物理シミュレーションへの興味

僕はトランポリンを実装し始めた頃から、物理現象を利用したゲームに興味を持ち始めました。次に作ろうとしていたのはビリヤードだったと思います。(今思い出しましたが、"銭ピン"と名付けたゲームを中学時代に友達と遊んでいました。このゲームでは、お金を弾いて落とします。一度、僕以外の人たちがグループを組んで、僕の一円玉を全て奪ったことがあります。)この興味から、次にパソコンで本格的なゲームを作れないかと考え、以下の本を購入しました。

14歳からはじめる リアルに動く!ゲーム物理プログラミング教室 C言語編―Windows 98/2000/Me/XP/Vista対応
大槻 有一郎 (著)

当時は14歳より上だったので、自然に理解できるだろうと考え、余裕をもって取り組むつもりでした。環境設定でつまづき、身近な人に相談することもできず、結局は諦めざるを得ませんでした。

これがきっかけでゲームプログラミングへの興味も失せてしまいました。最後のとどめは数学の内容で、三角関数と行列が出てきました。この本のタイトルに「14歳」という表記がある理由が、いまだに理解できません。

人工知能への関心

僕の興味は次第に人工知能に向かってきました。当時、「うずら」と呼ばれる"人工無脳"が流行していました。それを見て、ゲームの世界で住人たちがプレイヤーとは独立して会話を始めるといった環境を想像しました。

そのような状況の中で、遺伝的アルゴリズムを用いた特定の動画に出会いました。その動画を見た高校生の僕は、感動して「これだ、これが求めていたものだ!」と思いました。そして、このアルゴリズムをロボットに適用すると、効率的な動作が可能になるのではないかと考えました。それ以後、僕の関心はロボットと知能の関連性にシフトしました。

[【人工知能】物理エンジンで人工生命つくって学習させた](https://www.nicovideo.jp/watch/sm6392515)

レスキューロボットと群知能

僕が高校二年生になったころ、どの専門分野で進むべきか考え始めました。その時に広瀬研究室のヘビ型ロボットやその他のレスキューロボットに出会い、大きな影響を受けました。動物や昆虫からインスピレーションを受けたこれらのロボットは、見た目が面白いだけでなく、機能面でも非常に合理的でした。

当時、アシモのような二足歩行ロボットが主流で注目を集めていましたが、そのイメージは一気に変わりました。次第に「昆虫型ロボット」やその知能について考えるようになりました。しかし、そのようなことに夢中になっている間に、志望していたすべての大学に落ちてしまいました。

image.png
水陸両用ヘビ型ロボットACM-R5 [-]

大学生時代

一年間の浪人生活を経て、私はとある大学の機械工学科に入学しました。ちょうどその時、東日本大震災が発生し、大学入学前に少し休暇ができたのです。この期間を利用し、何度も挫折したプログラミングに再挑戦することにしました。始めに手に取った本は、この一冊です。

ゲームプログラマになる前に覚えておきたい技術 単行本
平山 尚 (著)

14歳からはじめるC++わくわくゲームプログラミング教室―Windows98/2000/Me/XP対応
大槻 有一郎 (著)

下記の本は、RTS(リアルタイムストラテジー)の実装を目指しています。ロボット知能の研究にも活用できると考え、この本を選びました。中学時代からプログラミングの経験があり、文字列のみのコンソールアプリケーションには飽きていました。そのため、DXライブラリの後半部分のソースコードを主に参照しました。この本のソースコードにはミスプリントが存在し、一日を無駄にすることもありましたが、最後のRTS部分には何とか到達しました。

[はちゅねミクで戦略ゲーム作ってみた【RTS】](https://www.nicovideo.jp/watch/sm14104751)

前半のプログラミング部を無視し、ただソースコードを丸写しした結果、C++についてほとんど身につきませんでした。各部分が何をしているのか全くわからなかったので、画像を差し替える程度の変更しかできませんでした。このゲームを3D化する方法を考えた結果、DirectXの直接的な学習を始めることにしました。

15歳からはじめるDirectX 9 3Dゲームプログラミング教室 C++編―Windows
大槻 有一郎 (著)

(またこのシリーズか、と思われそうですね。)これを受けて、「ミクのRTSを3Dで作りたい。」シリーズを動画投稿していくことになります。

[ミクのRTSを3Dで作りたい。その1。【はじまり】](https://www.nicovideo.jp/watch/sm14332932)

RTSは珍しいな。
理想たかすぎるw
XNA de Ok
これは道のりは遠いぞー

僕の独学は、過去の経験や、おちゃっこ氏の Easy3D と呼ばれるライブラリのおかげもあって、ゲームっぽい画面を作れるレベルにまでたどり着きました。

ミクのRTSを3Dで作りたい。その5。【Easy3D】
当時のおちゃっこさんのサイト「おちゃっこLAB」

[ミクのRTSを3Dで作りたい。その7。【ボーン(゚∀゚)ウマウマ】](https://www.nicovideo.jp/watch/sm15507958)

がんばるなー、やっぱり頑張らないと成長しない分野だね
こういうローポリかわいくて好き
そこまで頑張れるのにどうしてググる能力低いんだw
おちゃこさ間神過ぎる

(ミクのRTSを3Dで作りたい。その9。【ジャンプ・海・影】)[https://www.nicovideo.jp/watch/sm15594339]

エターナルの海・・・?
お、シャドウマップ?
RTSとはまたニッチな
動画の趣旨なんだっけ?w
RPGでいいやん?

壁にぶち当たる

時折、自分のスキルが不足していると感じました。具体的には、「メニュー画面のGUIをどう実装するか?」「街での対話はどう実装するのか?文字はどう表示させるか?」「シーンの切り替えはどう行うのか?」「ストーリーはどのように実装するのか?」といった疑問がありました。見た目に関するプログラミングはできたものの、ゲームシステム自体の構築方法が全くわからなかったのです。このような情報はなかなか調べられず、困惑していました。

広がる妄想と逃避

人が壁にぶつかって進捗が出なくなると、どうなるか知っていますか。私はニコニコ動画の「自作ゲーム」タグで、多くの人々のゲーム制作記録を見ています。私自身も同じような現象に陥りました。

進捗が出ていなくても、生存報告として動画を公開するという焦りから、ゲームの構想、ストーリー、画期的なシステムを考え出します。また、絵やイラストを描いてその場をしのぐこともあります。私はユーザーがスクリプトでAIを生成できる、リアルタイム流体シミュレーションを用いた世界のRTSでロボットのAIに応用するというアイデアに取り組んでいました。その様子は動画にも残っていますが、見返すのがつらいため、正直言って見たくありません。

[ミクのRTSを3Dで作りたい。その16。【妄想編】](https://www.nicovideo.jp/watch/sm17733031)

平山 尚さんからの返事

僕はプログラミングができる友達や頼れる人が近くにいなかったし、貯金も少なくなって新しい本を買う余裕もなくなってきました。「また挫折するのか」というやるせない気持ちもありましたが、何とかこの状況を打破したいと思い、「ゲームプログラマになる前に覚えておきたい技術」の著者、平山尚さんに相談メールを送りました。当時のメールは少し恥ずかしいですが、内容を公開します。

平山 尚 様

はじめまして。”はむくん”と申します。
”ゲームプログラマになる前に知っておきたい技術”で知ることが出来ました。
自分は機械工学科の大学1年生の学生です。
表現というものに興味があります。”想像したものを実際に体験できる錯覚を与える”表現です。
その表現法の1つとしてインタラクティブなゲームがあり、昔から綺麗なグラフィックスや物理シミュレーションの搭載されたゲームに魅了されてきました。
西川善司の3Dゲームファンのための~シリーズは訳がわからなくても、なぜか心から興奮するものがあります。
(ps3のパワースマッシュ3もps3発売当初のゲームなのに服のひらひら感や、テニスプレイヤーの動きのなめらかなつながり、フルHDによる描画や、さり気なくつくテニスコートの足跡など、感心する所がたくさんありました。)

そこでゲームを学ぼうとしてゲームプログラミングの参考書を本屋で探したのですが、どれも深く入り込まず、自分の求めているものがなかなか見つかりませんでした。
そこで出会ったのがこの本です。まだプログラミングには不慣れでして、しっかり理解することがまだできていませんが、3Dの具体的なポリゴン表示の仕方や、モノが見えるということや、何を学べば>いいかが書いてあり(特に本のレビューが好きです)、自分の求めていた本でとても気に入っています。これからの勉強の指針にしたいと思います。

そこで一つ悩みがあります。
金銭的な問題です。たとえば”ゲームプログラミングのための3Dグラフィックス数学”は7350¥ game programming gems
は12600¥ 他の本もどれも高いものばかりです。
たくさんの本を見て知識を増やしたいのですが、経済的な問題からなかなか本が買えず困っています。
学校の図書館や、中古の本屋にもなかなか見つからず、なにか立ち読み以外で読める方法がないか探しています。

都合の良い時で良いので、なにかいい方法があれば教えていただけますか。

ダメ元で送ってみたのですが、親切にも返事ををいただきました。感動したのを覚えています。

はじめまして、平山尚と申します。

読んでくださってありがとうございます。

まず、根本的な考え方として、10万だして本を買えば済むようなことは10万出して
済ました方が無難です。そうでないと大成しません。
食費その他を切り詰め、風呂のない安いアパートに住み、
バイトをしたり、親に泣きついてでもです。
本に払う金をケチることは将来に響きます。

とはいえ、もちろんさまざまな事情はおありでしょうし、
指針を書いてみます。

まず、お金をかけるべき本は「基礎」を書いた本です。
線形代数と微積分、ニュートン力学を「手を動かして」理解しましょう。
それらの教科書は大抵抽象的でつらいものが多いので、
「物理シミュレーションのための数学」的な内容のものを読んで
プログラミングと一緒に学ぶと具体性が高く挫折しにくいと思われます。
また、「なるほど虚数」などのなるほどシリーズ、「オイラーの贈り物」
などは買うに値する数学書です。

3Dグラフィックスのための云々、のような本は比較的応用度が高く、
基礎になる数学と物理ができていれば、そして、数学や物理で
数式を理解する能力が育っていれば、それほど必要な本ではありません。
また、Gemsの類はプロになってからで十分です。
というか、私も読んでません。必要になってから読む事典のようなものです。

それと、お金を節約するには、英語に慣れるのが有効です。
gemsレベルの本を読むレベルになると、
英語も読めないとどうにもならなくなります。
そして、gemsのような本は英語の方がはるかに安く、
誤訳に悩まされることもありません。下手をするとwebで
全文が公開されていたりもします。
(Numerical Recipesや、GPU Gemsなど)
まあ、私も英語の小説を普通に読めるほどの英語力はないですし、
技術書でもそれなりに苦労はしますが、
日本語版の誤訳と値段によるダメージを考えると英語版の方が
マシなケースがほとんどです。

英語が読めると、webサイトで大量の情報が読めるようになるため、
なおさら本を買わずに済む、ということもあります。
まあ私はそのレベルには達していないので、
えらそうなことはいえないのですが。

大学の4年間で学んだことがそのまま就職後に使えるということは
まずありませんが、
大学の4年間でどれくらい脳を鍛えたかはダイレクトに影響します。
英語と数学と物理は、がんばっただけ報われると思います。
私は生物学だったので、非常に苦労しました。今も苦労しています。

こんなところですが、何かお役に立てるでしょうか。がんばってみてください。

Siv3D との出会い

大学2年生の時、ゲームプログラミングのサークルに参加することを決めました。プログラミングスキルを持つ人々と交流し、新しい知識を得ることができると期待して参加しました。偶然、そのサークルの説明会が開催されると知り、1時間前に情報を得て参加することに決めました。サークルでは私が既に使っていたC++を用いていましたが、未知のライブラリを使っていることに気づきました。

(当時のパンフレットにこんな画像がついてました) https://www.youtube.com/watch?v=WC0Nn4h1R5E

ライブラリSiv3Dに出会ったとき、これがいわゆるModern C++であることを知りました。私が以前に学んだC++とはスタイルが大きく異なり、参考書にも少ない情報しかなかったので、かなり戸惑いました。そのため、Modern C++が実際には存在しないのではなく、Siv3Dの開発者であるReputeless氏の個人的なスタイルなのかと疑いました。幸運にも、Reputeless氏から直接C++について聞く機会がありました。Siv3Dは将来的に3Dアニメーションにも対応する予定だと知り、RTSゲームもDirectXではなく、いずれSiv3Dで開発可能だと考えました。

シーン遷移のプログラミングに向けて

ゲームのシステムの作成の大きな部分として、シーン遷移の実装がどうやら大変な役割を担っていることがわかりました。いかにして古い C++ ではなく Modern C++ で実装できるか考えるようになります。

このあと、ロベールのC++という日本人著者の本で、ついにコンソールアプリケーションのプログラミングの勉強を始めます。その様子はニコニコ動画に実況としてアップロードしていますので興味のある人は見てみてください。本実況の許可を得る際にロベールさんに例のごとくメールを送ったのですが、悪い意味で雰囲気の違うメールを受け取ったため、あまりいい印象は持っていません。

あと、僕のプログラミングの心の支えだったおちゃっこさんが HSP と Easy3D 関係でトラブルがおき、おちゃっこさんは鬱になってしまいました。そのあと「おちゃっこ」から「化け猫おちゃっこ」としてサイトを開設し、ダークなポエムを投稿し続けていました。今では時間が経ち、心身ともに回復し正常な生活を送れていることが報告されていました。よかったです。

小さなアプリケーションの開発

ひとまず RTS を完成させる目標を置くことにし、僕は経験をつむために Siv3D を使っていくつかのアプリケーションを作ることにしました。

音階が見えるビジュアライザーを作ってみた[Siv3D]

[好きなキャラが天気予報してくれるソフトを作ってみた[Siv3D]](https://www.nicovideo.jp/watch/sm22626870)

次の「惜しみなくかにみそ」は人生で初めて完成させたゲームです。

いつも途中でゲーム制作を投げてましたが
人生初めてゲーム完成しました

[ボールを圧死させるゲームを作ってみたβ【Siv3D】](https://www.nicovideo.jp/watch/sm22828291) [【ぼっち】ニコニコのコメントを人工知能で作ってみた【Siv3D】](https://www.nicovideo.jp/watch/sm22884640) [自動でお絵かきするソフトを作ってみた。【Siv3D】](https://www.nicovideo.jp/watch/sm23308552)

そんなアプリケーションを作っていくうちに少しづつ C++ のプログラミングに自信がついていくようになりました。このころによくアプリケーションを公開していたので、「あのころのはむくんは創造的だったね」と友達に煽られることもあります。

シーン遷移機能の実装

いくつかの経験より、ついに Modern C++ によるシーン遷移機能を実現することができました。

Siv3Dでのシーン遷移をサポートするSceneManagerの使い方とその応用

これの具体的な実装の背景については以下の動画が役に立つと思います。

C++のシーン遷移について語る ゲームプログラミング入門

じゃあどうやったらゲームプログラミングが学べるの?

シーン遷移が実装できるレベルに到達すれば、小規模なゲーム開発の能力は一定程度備わっていると思います。ただ、ゲームプログラミングに何が必要なのかがはっきりしないため、解説記事を書く自信もありません。この状況では、ゲームを作れる人と学びたい人との間のギャップは拡大していくでしょう。

確実に言えることは、ゲームプログラミングの仲間を見つけると、成長速度が格段に上がるという点です。一人で考え続けるだけでは進展が少なく、挫折や飽きが起きやすいです。何度も挫折した経験があります。環境が大きく影響するので、それを整える努力が成果につながります。

最近、UnityやUEといったゲームエンジンが主流になっています。C++でゲーム開発に挫折するのは過去の話になりつつあります。UnityやUEの話が多く、私自身も何度か挑戦しました。ゲームエンジンを使うと、一定レベルまでの開発は容易です。しかし、高校生の頃に夢見ていたようなゲームはそう簡単には作れません。Easy3Dの時と同様、見た目だけが豪華になっても、プレイヤーと独立した「村人が生活する空間」を作る力はあまり増えません。とか、なんだかんだ理由を言って Unity, UE を嫌っていますが、ゲームエンジンの新しい文化に慣れずただの「老害」への階段を着実にのぼっているだけなのかもしれません。

RTS ゲームのこれから

RTSシリーズを初めて投稿してから8年が経過します。現在、私はゲームプログラミングと無関係な場所で働いています。また、約4年間は非常に厳しい時期を過ごしました。それでも、今、ここで活動できることは幸運だと感じています。最近では、リアルタイム流体シミュレーションの実装やプロシージャル生成技術に取り組み、過去のアイデアを形にしています。

続編の動画を時折投稿していますが、理想に対する実力不足や興味の移り変わりがあるため、一定の進捗は難しいです。よくコメントで「迷走している」「ミク要素はどこに行った?」と言われますが、確かにその通りだと感じています。それでも、高校生の頃に夢見ていた「仮想世界で住人がプレイヤーとは独立して行動・会話する」ゲームを目指しています。

ミクのRTSを3Dで作りたい。その21。【時間】

一番の敵は、自分が飽きることと、「どうせすぐ飽きるからやっても無駄だ」と自分自身が無意識に囁くことです。飽きるという事実を知っているからこそ、全てが結局無意味に感じられ、手をつけられなくなってしまいます。もし今の自分が本気で取り組めば、初めに考えていたRTSゲームは作れるかもしれないと思いつつ、それでも手が出せていません。

さいごに

実は、プログラミングに慣れてくると、良くないなあと思う「癖」があります。自分の実力の見積もりがうまくできてしまうために、夢のある突拍子もないゲームを考えにくくなってしまうのです。「こんな無茶なゲームは完成するわけがない」と判断し、自分の実力が及ぶ範囲でだけ「器用に」ゲームを作ろうとしてしまうのです。夢のないゲームは大抵、他の作品と似たり寄ったりのつまらない作品になります。

僕は夢のあるゲームの未完成が好きです。その完成に向かうプロセスにこそ価値があるのだと思います。夢をもったゲームプログラミングはいつでも僕の実力の限界を見せてくれるとともに、貴重な体験を得ることができました。実力の限界が見れるということは、そこで一歩を踏み出せば新たな世界が見えるということです。ゲームが完成していないということが僕を前に進めさせる原動力になっているのかもしれません。夢を持った人が作った、夢の欠片のような未完成のゲームを僕は見たいです。

164
98
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
164
98

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?