C++
Siv3D
Siv3DDay 5

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

はじめに

はむくんと申します。僕は普段から Siv3D を使った簡単なアプリケーションを開発したりしています。今回は技術的な内容よりも、一人のゲームプログラミング初心者が、どのように Siv3D と出会ったか。経験を思い出しながら書いてみます。

中学生時代

中学二年生のころに、ゲームが作りたくてプログラミングを勉強し始めました。どんなゲームが作りたかったは覚えていません。選んだ言語は C++。なぜ C++ を選んだかというと、ゲームプログラミングにおいては C++ がメジャーだとどこかの本かネットかで見てかっこいいと思ったからです。そして以下の本に手を出しました。

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

ちょうど僕が中学生の時、当時数万円ほどする高価だった Visual Studio が学生向けにかなり安い値段で販売されたため、それを購入し C++ を勉強し始めました。ところがどうでしょう、文字列を表示したり、電卓のような計算をさせたり、謎の数字を羅列させていくトレーニングばかり。自分の想像していた「ゲームプログラミング像」とはかけ離れた内容がずっと続いたのです。謎の誰かの「住所録」のようなものを作り始めたあたりで「僕はゲームが作りたいのになんで住所録の作り方を学んでいるんだ?」と絶望してしまい、自然とプログラミングへの関心も薄れていきました。今でもこの本が書店に並んでいるのを見ますが、そのたびに当時の苦い感情を思い出さずにはいられません。

高校生時代

AppliMakers との出会い

当時 Docomo の携帯のiアプリでなんとゲームプログラミングができる AppliMakers (作者:JUN氏)と呼ばれるゲームを発見しました。ソースコードを 1-999 行まで書いて、動かすツールでした。変数は10個ぐらいの縛りがあったような記憶があります。このアプリの素晴らしい点は、作ったソースコードをインターネットにシェアして、他人のゲームをダウンロードできる点でした。僕は他人のソースコードを眺めて、ああそんな方法もあるかもなあと学びながらゲームを作ることができました。僕もこのアプリで新しいものを作りたいと思いいくつかの作品を出しました。はじめはお絵かきツール、次に縄跳びゲーム、そして対戦型のシューティングゲームを作りました。今はもう残っていません。

image.png

(AppliMakersの画面)

Squeak との出会い

僕は高校一年生の頃、とある教育プログラムに応募しプログラミングを学ぶ機会を得ました。それは夏休みの一週間を使い大阪の NTT の宿舎を使い合宿形式で勉強するものでした。そこで用いられたプログラミングは言語 Squeak とよばれる Smalltalk環境でした。有名な Scratch の前進です。

image.png
Wikipedia Squeak

絵を描くと、それがそのままオブジェクトとなり、そのオブジェクトを対象にブロック上のスクリプトを組み合わせることで、その描いた画像が動き始めたのです。まるで魔法のようでした。AppliMakersでの経験もあって、プログラミング部はすんなりと入れました。はじめに練習として作ったのはゴキブリが動くプログラムでした。とある自分の描いた軌跡に従ってゴキブリが進行方向に回転しながら高速に動くというものです。次に作成したものは、バスケットのボールの初速度と角度を決めてゴールに入れることを競うものです。過去にポトリス2というゲームが好きでその影響を受けています。最後に、グループ作品として完成させたものは、時々刻々と縮むトランポリンを操作して、棒人間を可能な限り長生きさせるアプリです。トランポリンから外れると棒人間の各関節と頭はバラバラになって、パイレーツ・オブ・カリビアン/デッドマンズ・チェスト の BGM 「hoist the colours」の "never shall we die" の部分が流れます。おなじグループのメンバーW君は初音ミクがブレイクする前の咲音メイコ持っていたのを覚えています。


(ゴキブリアプリの再現図)

(バスケプログラムの再現図)

(トランポリンゲームの再現図)

僕はその合宿の一連の作品に満足しました。それ以降 Squeak は触りませんでした。触りたいとも思いませんでした。何というのでしょうか、Squeak の露骨な「子供向け」感が嫌で、もっと大人な世界、ソースコードだけでバリバリ作る世界に憧れたのだと思います。僕は「子供向け」に作られた意図を感じるものが嫌いです。だから今でも個人的に Scratch には興味が持てませんし子供に勧めたいと思いません。(Scratch でプログラミングのきっかけを与えることを否定しているわけではありません)ところで、進研ゼミに「コラショ」というキャラクターが存在していたのをご存知でしょうか。小学一年生から三年生あたりまでを担当する猿みたいなキャラクターなのですが、当時物凄く嫌いだったのを覚えています。コラショの言動やデザインがあまりにも「子供向け」に作られていて、作り手が読み手を子供だと思って制作している意図が見えてしまい、子供を舐めているのかと憤りながら学習していました。あらゆるコラショの絵の部分に鉛筆で刺して穴を開けていました。時に子供は、「子供向け」を嫌うことがあるのです。

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

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

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

当時は14歳よりは上でしたので、流石に理解できるだろうと余裕を持って取り組もうと思いました。しかし、環境設定の時点でうまくいきませんでした。身近な人に聞いてみることもできず、ただ諦めるしかありませんでした。これをきっかけとしてゲームプログラミングそのものにも興味が薄れていきました。さらにトドメを指したのは内容の数学の部分で、三角関数と行列が出てきたのです。僕はこの本のタイトルに14歳とつける意味が今でもわかりません。

人工知能への関心

僕の興味は次第に人工知能の方へ向いていきました。当時「うずら」と呼ばれる"人工無脳"が流行っていて、ゲームの世界の住人がそれぞれがプレイヤーとは独立して喋り始めるそんな世界を考えるようになりました。そんな中、遺伝的アルゴリズムを活用したとある動画に出会いました。これを見た高校生の自分は「そうだよこれ!これを求めていたんだよ!」と感動し、さらにこの動きをロボットに当てはめたらとても効率的な動きができるのではないかと未来を夢見るようになりました。関心はロボットと知能との関係へ移っていきます。


【人工知能】物理エンジンで人工生命つくって学習させた

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

僕が高校二年生になったころ、専門はどうすればいいのか考え始めるようになります。そんなときに広瀬研究室のヘビ型ロボットを始めとしたレスキューロボットたちに出会いました。動物や昆虫にインスパイアされたロボットが、見た目が面白いだけでなく機能的にも合理的である、といった現象を目撃しました。当時アシモのような二足歩行ロボットばかりが注目を浴びていたロボットのイメージが一気に変わった瞬間です。僕はだんだんと、「昆虫型ロボット」のイメージやその知能について考え始めるようになります。そんなことを考えているうちに、すべての志望する大学に落ちました。

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

大学生時代

一年の浪人生活を終え、僕はとある大学の機械工学科に入学することができました。ちょうどその時期に東日本大震災がおこり、すこし大学入学前に休み期間ができました。その時間を利用して挫折を繰り返したあのプログラミングにまた挑戦しようと思ったのです。どの本を始めに手にとったか、こちらの本です。

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

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

下の本は RTS (リアルタイムストラテジー)の実装を目標としている本です。ロボットの知能の勉強に活用できそうだと思ったのでこれを選びました。中学時代の経験もあり、前半部分の文字列だけのプログラミング、いわゆる「コンソールアプリケーション」の部分にはうんざりしていました。そのため、ひたすら後半部分の DX ライブラリ部のソースコードを模写しました。この本のソースコードにもミスプリントがあり一日無駄に溶かしたりしてなんとか最後のRTS部までたどり着きました。


はちゅねミクで戦略ゲーム作ってみた【RTS】

この本でどのくらいの C++ の勉強になったかというと、ほとんど身になりませんでした。どこが何の働きをしているかさっぱりわからなかったため、画像を差し替えるぐらいしか工夫できませんでした。どうやったらこのゲームを3D化できるだろうか、と考えた結果、DirectXを直接勉強しようと決めました。

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

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


ミクのRTSを3Dで作りたい。その1。【はじまり】

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

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

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


ミクのRTSを3Dで作りたい。その7。【ボーン(゚∀゚)ウマウマ】

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


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

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

壁にぶち当たる

僕は実力不足を感じる時がありました。それは、「メニュー画面のGUIをどうやって実装するんだろうか?」「街の会話ってどうやって実装するんだ?文字の表示は?」「そもそもシーンってどうやって変更するんだ?」「ストーリーってどうやって実装するんだろう」
そうです、「見た目を豪華にするプログラミング」はできても「ゲームのシステムそのもの」の作り方がさっぱりわからなかったのです。その手の情報が調べにくく、途方にくれたのを覚えています。

広がる妄想と逃避

人が壁にぶち当たって、進捗が出なくなると何が起こるか知っていますか。僕はニコニコ動画の「自作ゲーム」タグでいろんな人のゲーム制作記録を見ていたので知っています。そして僕もその例に沿っておなじ現象に陥りました。

まず進捗は出せていなくても動画は出して生存報告をしなければ、という焦りからゲームの構想とかストーリーとか、画期的なシステムを考えようとします。あと、絵とかイラストを描いてその場しのぎをしようとします。僕はユーザーがスクリプトで AI を作ることができる、リアルタイムの流体シミュレーションが働いた世界の RTS でロボットの AI に応用するという妄想がただただ膨らんできました。当時の様子も動画に残っているのですが見るのが辛いので正直見たくありません。


ミクのRTSを3Dで作りたい。その16。【妄想編】

平山 尚さんからの返事

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

平山 尚 様

はじめまして。”はむくん”と申します。
”ゲームプログラマになる前に知っておきたい技術”で知ることが出来ました。
自分は機械工学科の大学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 との出会い

僕が大学二年のときに、ゲームプログラミングサークルに入ろうと決意しました。そこでは、プログラミングができる人たちに出会えるだろう、学べるものがあるだろうという期待を込めていきました。ちょうどとあるサークルの説明会があるという情報を1時間前くらいに見つけ、行くことにしました。そこでは僕がやっていた C++ を使用していましたが聞き慣れないライブラリを使用していることがわかりました。


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

そのライブラリが Siv3D だったのです。またこれがいわゆる Modern C++ との出会いであったとも思います。僕が知っている C++ とはかなり書き方が違い、またその情報が本にもあまりなかったので相当戸惑ったのを覚えています。あまりにもこれまで学んできた C++ と違ったり書籍がなかったりしたため、Modern C++ というものは存在せず、ただの Siv3D の制作者である Reputeless 氏の個人的な趣味なんじゃないかと疑ったこともあります。僕は運良く Reputeless 氏に直接 C++ を聞く機会を得ることができました。Siv3D はそのうち 3D アニメーションにも対応するということだったので、RTSのゲームも DirectX を直接扱うのではなくそのうち Siv3D で作れるだろうと思いました。

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

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

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

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

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

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

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


好きなキャラが天気予報してくれるソフトを作ってみた[Siv3D]

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

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


ボールを圧死させるゲームを作ってみたβ【Siv3D】


【ぼっち】ニコニコのコメントを人工知能で作ってみた【Siv3D】


自動でお絵かきするソフトを作ってみた。【Siv3D】

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

シーン遷移機能の実装

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

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

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

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

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

正直シーン遷移が実装できるくらいまでいくと、ある程度の小規模のゲームは作る能力は備わっていると思います。結局ゲームプログラミングに必要な知識は何なのか、よくわかりません。なので、解説記事もあんまり書けないような気がします。こんな感じでゲームを作れる人はゲームを作り続け、ゲームプログラミングを学び「たい」人のギャップは広がっていくのだと思います。

ただ一つ言えることは、ゲームプログラミングをする仲間を見つけたほうが圧倒的に成長するスピードが違うということです。一人で悶々と考えていてもなかなか前には進めないですし、辛くなったり飽きてやめたりします。実際何回も辞めました。環境の影響はかなり大きいため、その環境を整えることに努力をしたほうが結果的に実力が高くなったりします。

最近ではもう Unity や UE のゲームエンジンの時代になってしまって、C++ でゲーム作りで挫折するある種の「お約束」が過去のものになりつつあります。僕は最近 Vtuber を追っているのですが本当に Unity, UE の話ばっかりです。僕も何度か Unity に挑戦してみたのですが、実際、ゲームエンジンを使うとある程度のところまではすんなりといけてしまうのです。じゃあゲームエンジンを使えば僕が高校生の頃夢見ていたゲームが作れるかというと、そうでもありませんでした。結局 Easy3D の時のように、見た目が豪華になるだけで「村人がプレイヤーとは独立して生活している空間」を創造する助けにはあまりなりませんでした。結局は自分のプログラミングの力が問われてしまうのです。とか、なんだかんだ理由を言って Unity, UE を嫌っていますが、ゲームエンジンの新しい文化に慣れずただの「老害」への階段を着実にのぼっているだけなのかもしれません。

RTS ゲームのこれから

RTS シリーズを初めて投稿してから8年が経とうとしています。今僕はゲームプログラミングとは関係のない場所で生きています。また、4年間ぐらいは思い出したくもないくらいの暗黒の時代を生きていました。今ここで僕が活動できているのは幸いだと思います。最近ではリアルタイムの流体シミュレーションを実装したりプロシージャル生成の技術に手をつけたりして、当時の妄想の拾っては供養したりしてます。

時々思い出したように続きの動画を投稿したりしていますが、理想にまだ実力が追いつかなかったり、飽きがはやく来てしまったりしています。このシリーズを通じてよくコメントで「迷走している」「ミク要素はどこいった」と言われますが、たしかにそうだなと思います。ただ、僕が高校生の頃に夢見ていた「仮想的な世界でその住人がプレイヤーとは独立して生活したり会話をしたりしている。」ゲームを夢見ているのだと思います。

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

一番の敵は、自分の飽きがくることと、「どうせすぐ飽きるんだからやっても仕方ないだろ」と無意識的に囁くもう1人の自分です。飽きる事実を知っているために、全てがまた無に帰すような気がして、なんだかどうでもよくなってしまうのです。多分いまの自分が本気で取り組めば、当初の自分が考えていた RTS は作れるだろうになあと思いつつも手を出せていません。

さいごに

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

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